diff --git a/Dockerfile.aarch64 b/Dockerfile.aarch64 new file mode 100644 index 0000000..132589e --- /dev/null +++ b/Dockerfile.aarch64 @@ -0,0 +1,72 @@ +FROM lsiobase/alpine.nginx.arm64:3.7 +# Add qemu to build on x86_64 systems +COPY qemu-aarch64-static /usr/bin +# set version label +ARG BUILD_DATE +ARG VERSION +ARG SNIPEIT_RELEASE +LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" +LABEL maintainer="TheLamer, sparkyballs" + +RUN \ + echo "**** install runtime packages ****" && \ + apk add --no-cache \ + curl \ + libxml2 \ + php7-bcmath \ + php7-ctype \ + php7-curl \ + php7-gd \ + php7-ldap \ + php7-mbstring \ + php7-mcrypt \ + php7-phar \ + php7-pdo_mysql \ + php7-pdo_sqlite \ + php7-sqlite3 \ + php7-tokenizer \ + php7-xml \ + php7-xmlreader \ + php7-zip \ + tar \ + unzip && \ + echo "**** configure php-fpm to pass env vars ****" && \ + sed -i \ + 's/;clear_env = no/clear_env = no/g' \ + /etc/php7/php-fpm.d/www.conf && \ + echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php7/php-fpm.conf && \ + echo "**** install snipe-it ****" && \ + mkdir -p \ + /var/www/html/ && \ + if [ -z ${SNIPEIT_RELEASE+x} ]; then \ + SNIPEIT_RELEASE=$(curl -sX GET "https://api.github.com/repos/snipe/snipe-it/releases/latest" \ + | awk '/tag_name/{print $4;exit}' FS='[""]'); \ + fi && \ + curl -o \ + /tmp/snipeit.tar.gz -L \ + "https://github.com/snipe/snipe-it/archive/${SNIPEIT_RELEASE}.tar.gz" && \ + tar xf \ + /tmp/snipeit.tar.gz -C \ + /var/www/html/ --strip-components=1 && \ + cp /var/www/html/docker/docker.env /var/www/html/.env && \ + echo "**** move storage directories to defaults ****" && \ + mv \ + "/var/www/html/storage" \ + "/var/www/html/public/uploads" \ + /defaults/ && \ + echo "**** install dependencies ****" && \ + cd /tmp && \ + curl -sS https://getcomposer.org/installer | php && \ + mv /tmp/composer.phar /usr/local/bin/composer && \ + composer install -d /var/www/html && \ + echo "**** cleanup ****" && \ + rm -rf \ + /root/.composer \ + /tmp/* + +# copy local files +COPY root/ / + +# ports and volumes +EXPOSE 80 443 +VOLUME ["/config"] diff --git a/Dockerfile.armhf b/Dockerfile.armhf new file mode 100644 index 0000000..c66932f --- /dev/null +++ b/Dockerfile.armhf @@ -0,0 +1,72 @@ +FROM lsiobase/alpine.nginx.armhf:3.7 +# Add qemu to build on x86_64 systems +COPY qemu-arm-static /usr/bin +# set version label +ARG BUILD_DATE +ARG VERSION +ARG SNIPEIT_RELEASE +LABEL build_version="Linuxserver.io version:- ${VERSION} Build-date:- ${BUILD_DATE}" +LABEL maintainer="TheLamer, sparkyballs" + +RUN \ + echo "**** install runtime packages ****" && \ + apk add --no-cache \ + curl \ + libxml2 \ + php7-bcmath \ + php7-ctype \ + php7-curl \ + php7-gd \ + php7-ldap \ + php7-mbstring \ + php7-mcrypt \ + php7-phar \ + php7-pdo_mysql \ + php7-pdo_sqlite \ + php7-sqlite3 \ + php7-tokenizer \ + php7-xml \ + php7-xmlreader \ + php7-zip \ + tar \ + unzip && \ + echo "**** configure php-fpm to pass env vars ****" && \ + sed -i \ + 's/;clear_env = no/clear_env = no/g' \ + /etc/php7/php-fpm.d/www.conf && \ + echo "env[PATH] = /usr/local/bin:/usr/bin:/bin" >> /etc/php7/php-fpm.conf && \ + echo "**** install snipe-it ****" && \ + mkdir -p \ + /var/www/html/ && \ + if [ -z ${SNIPEIT_RELEASE+x} ]; then \ + SNIPEIT_RELEASE=$(curl -sX GET "https://api.github.com/repos/snipe/snipe-it/releases/latest" \ + | awk '/tag_name/{print $4;exit}' FS='[""]'); \ + fi && \ + curl -o \ + /tmp/snipeit.tar.gz -L \ + "https://github.com/snipe/snipe-it/archive/${SNIPEIT_RELEASE}.tar.gz" && \ + tar xf \ + /tmp/snipeit.tar.gz -C \ + /var/www/html/ --strip-components=1 && \ + cp /var/www/html/docker/docker.env /var/www/html/.env && \ + echo "**** move storage directories to defaults ****" && \ + mv \ + "/var/www/html/storage" \ + "/var/www/html/public/uploads" \ + /defaults/ && \ + echo "**** install dependencies ****" && \ + cd /tmp && \ + curl -sS https://getcomposer.org/installer | php && \ + mv /tmp/composer.phar /usr/local/bin/composer && \ + composer install -d /var/www/html && \ + echo "**** cleanup ****" && \ + rm -rf \ + /root/.composer \ + /tmp/* + +# copy local files +COPY root/ / + +# ports and volumes +EXPOSE 80 443 +VOLUME ["/config"] diff --git a/Jenkinsfile b/Jenkinsfile index 9b48377..fc51060 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -42,6 +42,7 @@ pipeline { unzip' DIST_REPO = 'none' DIST_REPO_PACKAGES = 'none' + MULTIARCH='true' } stages { // Setup all the basic environment variables needed for the build @@ -382,13 +383,37 @@ pipeline { Build Container ############### */ // Build Docker container for push to LS Repo - stage('Build') { + stage('Build-Single') { + when { + expression { + env.MULTIARCH == 'false' + } + } steps { echo "Building most current release of ${EXT_REPO}" sh "docker build --no-cache -t ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} \ --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." } } + // Build MultiArch Docker container for push to LS Repo + stage('Build-Multi') { + when { + expression { + env.MULTIARCH == 'true' + } + } + steps { + echo "Building most current release of ${EXT_REPO} x86_64" + sh "docker build --no-cache -f Dockerfile.amd64 -t ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + echo "Building most current release of ${EXT_REPO} Arm 32 Bit (Pis)" + sh "docker build --no-cache -f Dockerfile.armhf -t ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + echo "Building most current release of ${EXT_REPO} Arm 64 Bit" + sh "docker build --no-cache -f Dockerfile.aarch64 -t ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} \ + --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ." + } + } /* ####### Testing ####### */ @@ -402,12 +427,15 @@ pipeline { Live Release Logic ################## */ // If this is a public release push this to the live repo triggered by an external repo update or LS repo update on master - stage('Docker-Push-Release') { + stage('Docker-Push-Release-Single') { when { branch "master" expression { env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER } + expression{ + env.MULTIARCH == 'false' + } } steps { withCredentials([ @@ -430,6 +458,54 @@ pipeline { } } } + // If this is a public release push this to the live repo triggered by an external repo update or LS repo update on master + stage('Docker-Push-Release-Multi') { + when { + branch "master" + expression { + env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER + } + expression{ + env.MULTIARCH == 'true' + } + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + echo 'Logging into DockerHub' + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + echo 'First Tag the releases to latest also' + sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:amd64-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm32v6-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm64v8-latest" + echo 'Push all image variants in case someone does not want to use manifests' + sh "docker push ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER}" + sh "docker push ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER}" + sh "docker push ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER}" + sh "docker push ${DOCKERHUB_IMAGE}:amd64-latest" + sh "docker push ${DOCKERHUB_IMAGE}:arm32v6-latest" + sh "docker push ${DOCKERHUB_IMAGE}:arm64v8-latest" + echo 'Generate Manifests based on tagging' + sh "docker manifest create ${DOCKERHUB_IMAGE}:latest ${DOCKERHUB_IMAGE}:amd64-latest ${DOCKERHUB_IMAGE}:arm32v6-latest ${DOCKERHUB_IMAGE}:arm64v8-latest" + sh "docker manifest annotate ${DOCKERHUB_IMAGE}:latest ${DOCKERHUB_IMAGE}:arm32v6-latest --os linux --arch arm" + sh "docker manifest annotate ${DOCKERHUB_IMAGE}:latest ${DOCKERHUB_IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8" + sh "docker manifest create ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER}" + sh "docker manifest annotate ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} --os linux --arch arm" + sh "docker manifest annotate ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} --os linux --arch arm64 --variant armv8" + echo 'Pushing by manifest tags' + sh "docker manifest push ${DOCKERHUB_IMAGE}:latest" + sh "docker manifest push ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER}" + } + } + } // If this is a public release tag it in the LS Github and push a changelog from external repo and our internal one stage('Github-Tag-Push-Release') { when { @@ -564,12 +640,15 @@ pipeline { Dev Release Logic ################# */ // Push to the Dev user dockerhub endpoint when this is a non master branch - stage('Docker-Push-Dev') { + stage('Docker-Push-Dev-Single') { when { not { branch "master" } environment name: 'CHANGE_ID', value: '' + expression{ + env.MULTIARCH == 'false' + } } steps { withCredentials([ @@ -598,6 +677,62 @@ pipeline { } } } + // Push to the Dev user dockerhub endpoint when this is a non master branch + stage('Docker-Push-Dev-Multi') { + when { + not { + branch "master" + } + environment name: 'CHANGE_ID', value: '' + expression{ + env.MULTIARCH == 'true' + } + } + steps { + withCredentials([ + [ + $class: 'UsernamePasswordMultiBinding', + credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6', + usernameVariable: 'DOCKERUSER', + passwordVariable: 'DOCKERPASS' + ] + ]) { + echo 'Logging into DockerHub' + sh '''#! /bin/bash + echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin + ''' + echo 'First Tag the releases to latest also' + sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:amd64-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + echo 'Push all image variants' + sh "docker push ${DEV_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + sh "docker push ${DEV_DOCKERHUB_IMAGE}:amd64-latest" + sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest" + sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest" + echo 'Generate Manifests based on tagging' + sh "docker manifest create ${DEV_DOCKERHUB_IMAGE}:latest ${DEV_DOCKERHUB_IMAGE}:amd64-latest ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest" + sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:latest ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest --os linux --arch arm" + sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:latest ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8" + sh "docker manifest create ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} --os linux --arch arm" + sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} --os linux --arch arm64 --variant armv8" + echo 'Pushing by manifest tags' + sh "docker manifest push ${DEV_DOCKERHUB_IMAGE}:latest" + sh "docker manifest push ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + } + script{ + env.DOCKERHUB_LINK = sh( + script: '''echo https://hub.docker.com/r/${DEV_DOCKERHUB_IMAGE}/tags/''', + returnStdout: true).trim() + } + } + } /* ################ PR Release Logic ################ */ @@ -621,12 +756,30 @@ pipeline { sh '''#! /bin/bash echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin ''' - echo 'Tag images to the built one' - sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:latest" - sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" - echo 'Pushing both tags' - sh "docker push ${PR_DOCKERHUB_IMAGE}:latest" - sh "docker push ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + echo 'First Tag the releases to latest also' + sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:amd64-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm32v6-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm64v8-latest" + sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + echo 'Push all image variants' + sh "docker push ${PR_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + sh "docker push ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + sh "docker push ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + sh "docker push ${PR_DOCKERHUB_IMAGE}:amd64-latest" + sh "docker push ${PR_DOCKERHUB_IMAGE}:arm32v6-latest" + sh "docker push ${PR_DOCKERHUB_IMAGE}:arm64v8-latest" + echo 'Generate Manifests based on tagging' + sh "docker manifest create ${PR_DOCKERHUB_IMAGE}:latest ${PR_DOCKERHUB_IMAGE}:amd64-latest ${PR_DOCKERHUB_IMAGE}:arm32v6-latest ${PR_DOCKERHUB_IMAGE}:arm64v8-latest" + sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:latest ${PR_DOCKERHUB_IMAGE}:arm32v6-latest --os linux --arch arm" + sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:latest ${PR_DOCKERHUB_IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8" + sh "docker manifest create ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" + sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} --os linux --arch arm" + sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} --os linux --arch arm64 --variant armv8" + echo 'Pushing by manifest tags' + sh "docker manifest push ${PR_DOCKERHUB_IMAGE}:latest" + sh "docker manifest push ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" } script{ env.CODE_URL = sh( diff --git a/qemu-aarch64-static b/qemu-aarch64-static new file mode 100755 index 0000000..6c9be84 Binary files /dev/null and b/qemu-aarch64-static differ diff --git a/qemu-arm-static b/qemu-arm-static new file mode 100755 index 0000000..9a61d8d Binary files /dev/null and b/qemu-arm-static differ