瀏覽代碼

docker: enable Automated builds for aarch64 ( ARM64 ) platforms (#5058)

* Enable Automated builds for aarch64

* Native aarch64 build

* Move to the new organization

* Try to build it with latest go binary

* Rebuild using Go 1.10
Julian Xhokaxhiu 6 年之前
父節點
當前提交
ffdd8b3afa
共有 5 個文件被更改,包括 113 次插入0 次删除
  1. 44 0
      Dockerfile.aarch64hub
  2. 3 0
      docker/aarch64/build.sh
  3. 二進制
      docker/aarch64/qemu-aarch64-static
  4. 二進制
      docker/aarch64/resin-xbuild
  5. 66 0
      docker/aarch64/resin-xbuild.go

+ 44 - 0
Dockerfile.aarch64hub

@@ -0,0 +1,44 @@
+FROM arm64v8/alpine:3.6
+
+ENV GOGS_CUSTOM /data/gogs
+ENV QEMU_EXECVE 1
+
+# For cross compile on dockerhub
+################################
+
+COPY ./docker/aarch64/qemu-aarch64-static /usr/bin/
+COPY ./docker/aarch64/resin-xbuild /usr/bin/
+
+RUN [ "/usr/bin/qemu-aarch64-static", "/bin/sh", "-c", "ln -s resin-xbuild /usr/bin/cross-build-start; ln -s resin-xbuild /usr/bin/cross-build-end; ln /bin/sh /bin/sh.real" ]
+
+RUN [ "cross-build-start" ]
+
+# Prepare the container
+#######################
+
+# Install system utils & Gogs runtime dependencies
+ADD https://github.com/tianon/gosu/releases/download/1.9/gosu-arm64 /usr/sbin/gosu
+RUN chmod +x /usr/sbin/gosu \
+ && apk --no-cache --no-progress add ca-certificates bash git linux-pam s6 curl openssh socat tzdata go
+
+
+COPY . /app/gogs/build
+WORKDIR /app/gogs/build
+
+RUN    ./docker/build.sh \
+    && ./docker/finalize.sh
+
+# Configure LibC Name Service
+COPY docker/nsswitch.conf /etc/nsswitch.conf
+
+# For cross compile on dockerhub
+################################
+
+RUN [ "cross-build-end" ]
+
+# Configure Docker Container
+############################
+VOLUME ["/data"]
+EXPOSE 22 3000
+ENTRYPOINT ["/app/gogs/docker/start.sh"]
+CMD ["/bin/s6-svscan", "/app/gogs/docker/s6/"]

+ 3 - 0
docker/aarch64/build.sh

@@ -0,0 +1,3 @@
+#!/bin/bash
+
+go build -ldflags "-w -s" resin-xbuild.go

二進制
docker/aarch64/qemu-aarch64-static


二進制
docker/aarch64/resin-xbuild


+ 66 - 0
docker/aarch64/resin-xbuild.go

@@ -0,0 +1,66 @@
+package main
+
+import (
+	"log"
+	"os"
+	"os/exec"
+	"syscall"
+)
+
+func crossBuildStart() {
+	err := os.Remove("/bin/sh")
+	if err != nil {
+		log.Fatal(err)
+	}
+	err = os.Link("/usr/bin/resin-xbuild", "/bin/sh")
+	if err != nil {
+		log.Fatal(err)
+	}
+}
+
+func crossBuildEnd() {
+	err := os.Remove("/bin/sh")
+	if err != nil {
+		log.Fatal(err)
+	}
+	err = os.Link("/bin/sh.real", "/bin/sh")
+	if err != nil {
+		log.Fatal(err)
+	}
+}
+
+func runShell() error {
+	cmd := exec.Command("/usr/bin/qemu-aarch64-static", append([]string{"-0", "/bin/sh", "/bin/sh"}, os.Args[1:]...)...)
+	cmd.Stdin = os.Stdin
+	cmd.Stdout = os.Stdout
+	cmd.Stderr = os.Stderr
+	return cmd.Run()
+}
+
+func main() {
+	switch os.Args[0] {
+	case "cross-build-start":
+		crossBuildStart()
+	case "cross-build-end":
+		crossBuildEnd()
+	case "/bin/sh":
+		code := 0
+		crossBuildEnd()
+
+		if err := runShell(); err != nil {
+			code = 1
+			if exiterr, ok := err.(*exec.ExitError); ok {
+				if status, ok := exiterr.Sys().(syscall.WaitStatus); ok {
+					code = status.ExitStatus()
+				}
+			}
+		}
+
+		crossBuildStart()
+
+		// Hack to bypass apk issues with triggering
+		code = 0
+
+		os.Exit(code)
+	}
+}