From 5a88546a8040c2f56b9cd924b2d4d5b180a63159 Mon Sep 17 00:00:00 2001 From: Julian Xhokaxhiu Date: Sat, 15 Jul 2017 00:04:19 +0200 Subject: docker: enable Automated builds for rpi (#4431) * Enable Automated builds for rpi * Rename the file to fit only for Docker Hub * Update the binary to v2.9.0+resin1 * Restore default status * Commit as new file In order to avoid breaking native builds --- Dockerfile.rpihub | 44 +++++++++++++++++++++++++++++ docker/armhf/build.sh | 3 ++ docker/armhf/qemu-arm-static | Bin 0 -> 3370216 bytes docker/armhf/resin-xbuild | Bin 0 -> 1299072 bytes docker/armhf/resin-xbuild.go | 66 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+) create mode 100644 Dockerfile.rpihub create mode 100644 docker/armhf/build.sh create mode 100755 docker/armhf/qemu-arm-static create mode 100755 docker/armhf/resin-xbuild create mode 100644 docker/armhf/resin-xbuild.go diff --git a/Dockerfile.rpihub b/Dockerfile.rpihub new file mode 100644 index 00000000..d20b1e9a --- /dev/null +++ b/Dockerfile.rpihub @@ -0,0 +1,44 @@ +FROM armhf/alpine:3.5 + +ENV GOGS_CUSTOM /data/gogs +ENV QEMU_EXECVE 1 + +# For cross compile on dockerhub +################################ + +COPY ./docker/armhf/qemu-arm-static /usr/bin/ +COPY ./docker/armhf/resin-xbuild /usr/bin/ + +RUN [ "/usr/bin/qemu-arm-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-armhf /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 + +COPY . /app/gogs/build +WORKDIR /app/gogs/build + +RUN ./docker/build-go.sh \ + && ./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/"] diff --git a/docker/armhf/build.sh b/docker/armhf/build.sh new file mode 100644 index 00000000..d864f4b3 --- /dev/null +++ b/docker/armhf/build.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +go build -ldflags "-w -s" resin-xbuild.go diff --git a/docker/armhf/qemu-arm-static b/docker/armhf/qemu-arm-static new file mode 100755 index 00000000..bf5897b1 Binary files /dev/null and b/docker/armhf/qemu-arm-static differ diff --git a/docker/armhf/resin-xbuild b/docker/armhf/resin-xbuild new file mode 100755 index 00000000..5471f249 Binary files /dev/null and b/docker/armhf/resin-xbuild differ diff --git a/docker/armhf/resin-xbuild.go b/docker/armhf/resin-xbuild.go new file mode 100644 index 00000000..e0fceddf --- /dev/null +++ b/docker/armhf/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-arm-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) + } +} \ No newline at end of file -- cgit v1.2.3