Initial builder

This commit is contained in:
Aode (lion) 2021-09-06 13:44:02 -05:00
commit 0adde960d1
4 changed files with 245 additions and 0 deletions

46
Dockerfile Normal file
View file

@ -0,0 +1,46 @@
ARG TARGET=aarch64-unknown-linux-musl
# build environment
FROM rustembedded/cross:$TARGET
ARG UID=991
ARG GID=991
ARG TARGET=aarch64-unknown-linux-musl
ARG TOOL=aarch64-linux-musl
ARG BUILD_MODE=release
ENV \
TOOLCHAIN=stable
RUN \
addgroup --gid "${GID}" build && \
adduser \
--disabled-password \
--gecos "" \
--ingroup build \
--uid "${UID}" \
--home /opt/build \
build
ADD \
https://sh.rustup.rs /opt/build/rustup.sh
RUN \
chown -R build:build /opt/build
USER build
WORKDIR /opt/build
ENV \
PATH=/opt/build/.cargo/bin:/usr/local/musl/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/sbin:/bin
RUN \
chmod +x rustup.sh && \
./rustup.sh --default-toolchain $TOOLCHAIN --profile minimal -y && \
rustup target add $TARGET
USER build
WORKDIR /opt/build/
CMD /usr/bin/bash

81
build-image.sh Executable file
View file

@ -0,0 +1,81 @@
#!/usr/bin/env bash
function require() {
if [ "$1" = "" ]; then
echo "input '$2' required"
print_help
exit 1
fi
}
function print_help() {
echo "deploy.sh"
echo ""
echo "Usage:"
echo " deploy.sh [repo] [tag] [arch]"
echo ""
echo "Args:"
echo " repo: The docker repository to publish the image"
echo " tag: The tag applied to the docker image"
echo " arch: The architecuture of the doker image"
}
function build() {
REPO=$1
ARCH=$2
TAG=$3
TARGET=$4
TOOL=$5
sudo docker build \
--pull \
--build-arg TAG=$TAG \
--build-arg TARGET=$TARGET \
--build-arg TOOL=$TOOL \
--build-arg ARCH_REPO=$ARCH \
-t $REPO:$ARCH-$TAG \
-f Dockerfile \
.
}
REPO=$1
TAG=$2
ARCH=$3
require "$REPO" "repo"
require "$TAG" "tag"
require "$ARCH" "arch"
case $ARCH in
amd64)
build \
"$REPO" \
"$ARCH" \
"$TAG" \
x86_64-unknown-linux-musl \
x86_64-linux-musl
;;
arm32v7)
build \
"$REPO" \
"$ARCH" \
"$TAG" \
armv7-unknown-linux-musleabihf \
arm-linux-musleabihf
;;
arm64v8)
build \
"$REPO" \
"$ARCH" \
"$TAG" \
aarch64-unknown-linux-musl \
aarch64-linux-musl
;;
*)
echo "Invalid architecture provided"
exit 1
;;
esac

75
build.sh Executable file
View file

@ -0,0 +1,75 @@
#!/usr/bin/env bash
function require() {
if [ "$1" = "" ]; then
echo "input '$2' required"
print_help
exit 1
fi
}
function print_help() {
echo "build.sh"
echo ""
echo "Usage:"
echo " build.sh [tag] [branch] [push]"
echo ""
echo "Args:"
echo " tag: The git tag to be applied to the repository and docker build"
echo " branch: The git branch to use for tagging and publishing"
echo " push: Whether or not to push the image"
echo ""
echo "Examples:"
echo " ./build.sh v0.3.0-alpha.13 main true"
echo " ./build.sh v0.3.0-alpha.13-shell-out asonix/shell-out false"
}
function build_image() {
tag=$1
arch=$2
push=$3
./build-image.sh asonix/rust-builder $tag $arch
sudo docker tag asonix/rust-builder:$arch-$tag asonix/rust-builder:$arch-latest
if [ "$push" == "true" ]; then
sudo docker push asonix/rust-builder:$arch-$tag
sudo docker push asonix/rust-builder:$arch-latest
fi
}
# Creating the new tag
new_tag="$1"
branch="$2"
push=$3
require "$new_tag" "tag"
require "$branch" "branch"
require "$push" "push"
if ! sudo docker run --rm -it arm64v8/alpine:3.11 /bin/sh -c 'echo "docker is configured correctly"'
then
echo "docker is not configured to run on qemu-emulated architectures, fixing will require sudo"
sudo docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
fi
set -xe
sed -i "s/asonix\/rust-builder:.*/asonix\/rust-builder:$new_tag/" docker-compose.yml
git add docker-compose.yml
git commit -m "Version $new_tag"
git tag $new_tag
git push origin $new_tag
git push
build_image $new_tag arm64v8 $push
build_image $new_tag arm32v7 $push
build_image $new_tag amd64 $push
if [ "$push" == "true" ]; then
./manifest.sh rust-builder $new_tag
./manifest.sh rust-builder latest
fi

43
manifest.sh Executable file
View file

@ -0,0 +1,43 @@
#!/usr/bin/env bash
function require() {
if [ "$1" = "" ]; then
echo "input '$2' required"
print_help
exit 1
fi
}
function print_help() {
echo "deploy.sh"
echo ""
echo "Usage:"
echo " manifest.sh [repo] [tag]"
echo ""
echo "Args:"
echo " repo: The docker repository to update"
echo " tag: The git tag to be applied to the image manifest"
}
REPO=$1
TAG=$2
require "$REPO" "repo"
require "$TAG" "tag"
set -xe
sudo docker manifest create asonix/$REPO:$TAG \
-a asonix/$REPO:arm64v8-$TAG \
-a asonix/$REPO:arm32v7-$TAG \
-a asonix/$REPO:amd64-$TAG
sudo docker manifest annotate asonix/$REPO:$TAG \
asonix/$REPO:arm64v8-$TAG --os linux --arch arm64 --variant v8
sudo docker manifest annotate asonix/$REPO:$TAG \
asonix/$REPO:arm32v7-$TAG --os linux --arch arm --variant v7
sudo docker manifest annotate asonix/$REPO:$TAG \
asonix/$REPO:amd64-$TAG --os linux --arch amd64
sudo docker manifest push asonix/$REPO:$TAG --purge