chore: merge alpine-builder project

This commit is contained in:
Stefan Reimer 2022-10-05 18:57:46 +02:00
parent 9e7e2735cb
commit 1895cdbebd
5 changed files with 174 additions and 1 deletions

27
Dockerfile Normal file
View File

@ -0,0 +1,27 @@
ARG TAG
FROM public.ecr.aws/zero-downtime/alpine-builder:$TAG
ARG ALPINE="v3.16"
ARG SYSROOT=/home/alpine/sysroot-aarch64
USER root
# Workaround for apk fetch bug related to `g++-aarch64` name, todo
RUN wget https://cdn.zero-downtime.net/alpine/v3.16/kubezero/x86_64/g%2B%2B-aarch64-11.2.1_git20220219-r2.apk && \
apk add --no-cache g%2B%2B-aarch64-11.2.1_git20220219-r2.apk && rm -f g%2B%2B-aarch64-11.2.1_git20220219-r2.apk
RUN apk -U --no-cache add \
build-base-aarch64@kubezero
# gcc-gnat-aarch64@kubezero
RUN mkdir -p ${SYSROOT} && \
apk -X https://dl-cdn.alpinelinux.org/alpine/${ALPINE}/main -U --allow-untrusted --no-scripts -p ${SYSROOT} --initdb --arch aarch64 add alpine-base && \
apk -X https://dl-cdn.alpinelinux.org/alpine/${ALPINE}/main --arch aarch64 -p ${SYSROOT} --allow-untrusted add alpine-keys && \
cp /etc/apk/repositories ${SYSROOT}/etc/apk
RUN apk -U --arch aarch64 -p ${SYSROOT} add \
libgcc \
libstdc++ \
musl-dev
USER alpine

31
Dockerfile.stage1 Normal file
View File

@ -0,0 +1,31 @@
FROM alpine:3.16
ARG ALPINE="v3.16"
RUN echo "http://dl-cdn.alpinelinux.org/alpine/${ALPINE}/main" > /etc/apk/repositories && \
echo "http://dl-cdn.alpinelinux.org/alpine/${ALPINE}/community" >> /etc/apk/repositories && \
echo "@edge-main http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories && \
echo "@edge-community http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
echo "@kubezero https://cdn.zero-downtime.net/alpine/${ALPINE}/kubezero" >> /etc/apk/repositories && \
wget -q -O /etc/apk/keys/stefan@zero-downtime.net-61bb6bfb.rsa.pub https://cdn.zero-downtime.net/alpine/stefan@zero-downtime.net-61bb6bfb.rsa.pub
RUN apk -U --no-cache upgrade && \
apk --no-cache add \
alpine-sdk \
lua-aports \
doas \
pigz \
xz
# gcc-gnat \
RUN adduser -D alpine && \
addgroup alpine abuild && \
echo "permit nopass :abuild" > /etc/doas.d/doas.conf && \
install -d -g abuild -m 775 /var/cache/distfiles && \
install -d -g abuild -m 775 /packages
COPY abuilder aarch64-toolchain.sh /usr/bin/
WORKDIR /home/alpine
USER alpine
ENTRYPOINT ["abuilder"]

67
aarch64-toolchain.sh Executable file
View File

@ -0,0 +1,67 @@
#!/bin/sh
set -ex
TARGET_ARCH=aarch64
SUDO_APK=abuild-apk
APORTS=/home/alpine/aports
export CBUILDROOT="/home/alpine/sysroot-aarch64/"
export CBUILD="x86_64-alpine-linux-musl"
apkbuildname() {
local repo="${1%%/*}"
local pkg="${1##*/}"
[ "$repo" = "$1" ] && repo="main"
echo $APORTS/$repo/$pkg/APKBUILD
}
msg() {
[ -n "$quiet" ] && return 0
local prompt="$GREEN>>>${NORMAL}"
local name="${BLUE}bootstrap-${TARGET_ARCH}${NORMAL}"
printf "${prompt} ${name}: %s\n" "$1" >&2
}
if [ ! -d "$CBUILDROOT" ]; then
msg "Creating sysroot in $CBUILDROOT"
mkdir -p "$CBUILDROOT/etc/apk/keys"
# /etc/apk/keys and ~/.abuild/ can contain files with the same names.
# if that is the case, cp will abort copying and fail. Then on the next
# run of the bootstrap script, 1) the keys are not in the sysroot and
# 2) the apk database is not initialized the sysroot
# Thus it's unusable at that point and needs to be deleted manually.
cp -a /etc/apk/keys/* "$CBUILDROOT/etc/apk/keys"
cp -a ~/.abuild/*.pub "$CBUILDROOT/etc/apk/keys"
${SUDO_APK} add --quiet --initdb --arch $TARGET_ARCH --root $CBUILDROOT
fi
msg "Building cross-compiler"
# Build and install cross binutils (--with-sysroot)
CTARGET=$TARGET_ARCH BOOTSTRAP=nobase APKBUILD=$(apkbuildname binutils) abuild -r
if ! CHOST=$TARGET_ARCH BOOTSTRAP=nolibc APKBUILD=$(apkbuildname musl) abuild up2date 2>/dev/null; then
# C-library headers for target
CHOST=$TARGET_ARCH BOOTSTRAP=nocc APKBUILD=$(apkbuildname musl) abuild -r
# Minimal cross GCC
EXTRADEPENDS_HOST="musl-dev" \
CTARGET=$TARGET_ARCH BOOTSTRAP=nolibc APKBUILD=$(apkbuildname gcc) abuild -r
# Cross build bootstrap C-library for the target
EXTRADEPENDS_BUILD="gcc-pass2-$TARGET_ARCH" \
CHOST=$TARGET_ARCH BOOTSTRAP=nolibc APKBUILD=$(apkbuildname musl) abuild -r
fi
# Full cross GCC
EXTRADEPENDS_TARGET="musl musl-dev" \
CTARGET=$TARGET_ARCH BOOTSTRAP=nobase APKBUILD=$(apkbuildname gcc) abuild -r
# Cross build-base
CTARGET=$TARGET_ARCH BOOTSTRAP=nobase APKBUILD=$(apkbuildname build-base) abuild -r
msg "Copying cross toolchain packages into kubezero repository"
cp packages/main/x86_64/* packages/kubezero/x86_64 && rm packages/kubezero/x86_64/gcc-pass2-aarch64-*.apk
cd packages/kubezero/x86_64 && apk index -o APKINDEX.tar.gz *.apk && abuild-sign APKINDEX.tar.gz

48
abuilder Executable file
View File

@ -0,0 +1,48 @@
#!/bin/sh
set -ex
if [ -d ~/.abuild ]; then
doas cp ~/.abuild/*.rsa.pub /etc/apk/keys/
fi
doas chown -R alpine:abuild ~/packages /var/cache/distfiles ~/aports
doas apk update
if [ "$1" == 'debug' ]; then
sh
elif [ "$1" == 'aarch64-toolchain' ]; then
aarch64-toolchain.sh
else
# Set ENV for cross compile for aarch64
if [ "$2" == "aarch64" ]; then
TARGET_ARCH=aarch64
SUDO_APK=abuild-apk
APORTS=/home/alpine/aports
export CBUILDROOT="/home/alpine/sysroot-aarch64/"
. /usr/share/abuild/functions.sh
export CBUILD
export CHOST=$TARGET_ARCH
export GOARCH=arm64
export GOOS=linux
fi
for pkg in ~/$1; do
doas chown -R alpine:abuild $(dirname $pkg)
# If checksum is OK, build package
APKBUILD=$pkg abuild verify && rc=$? || rc=$?
if [ $rc -eq 0 ]; then
APKBUILD=$pkg abuild -r
else
APKBUILD=$pkg abuild checksum
echo "Please update your APKBUILD with the following checksums after verification:"
. $pkg/APKBUILD && echo $sha512sums
fi
done
fi

View File

@ -16,7 +16,7 @@ build() {
}
package() {
install -Dm755 build/openvpn_exporter "$pkgdir"/usr/bin/openvpn_exporter
install -Dm755 build/openvpn_exporter "$pkgdir"/usr/bin/openvpn_exporter
}
sha512sums="