From 4fc0db37b7485432d2922d9ced6d759843aa204d Mon Sep 17 00:00:00 2001 From: thelamer Date: Sun, 15 Jul 2018 19:30:53 -0700 Subject: [PATCH] updating build logic to include CI --- Jenkinsfile | 600 +++++++++++++++------------------------------------- 1 file changed, 171 insertions(+), 429 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2dd63ea..e10c764 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,16 +1,10 @@ pipeline { agent any - // Configuraiton for the variables used for this specific repo + // Configuration for the variables used for this specific repo environment { - EXT_RELEASE_TYPE = 'github_stable' EXT_GIT_BRANCH = 'master' EXT_USER = 'bookstackapp' EXT_REPO = 'bookstack' - EXT_NPM = 'none' - EXT_PIP = 'none' - EXT_BLOB = 'none' - JSON_URL = 'none' - JSON_PATH = 'none' BUILD_VERSION_ARG = 'BOOKSTACK_RELEASE' LS_USER = 'linuxserver' LS_REPO = 'docker-bookstack' @@ -34,9 +28,14 @@ pipeline { php7-tidy \ php7-simplexml \ tar' - DIST_REPO = 'none' - DIST_REPO_PACKAGES = 'none' MULTIARCH='true' + CI='true' + CI_PORT='80' + CI_SSL='false' + CI_DELAY='5' + CI_DOCKERENV='DB_HOST=' + credentials('mysql_test_host') + '|DB_DATABASE=bookstack|DB_USERNAME=root|DB_PASSWORD=' + credentials('mysql_test_password') + CI_AUTH='user:password' + CI_WEBPATH='' } stages { // Setup all the basic environment variables needed for the build @@ -55,12 +54,8 @@ pipeline { env.COMMIT_SHA = sh( script: '''git rev-parse HEAD''', returnStdout: true).trim() - env.CODE_URL = sh( - script: '''echo https://github.com/${LS_USER}/${LS_REPO}/commit/${GIT_COMMIT}''', - returnStdout: true).trim() - env.DOCKERHUB_LINK = sh( - script: '''echo https://hub.docker.com/r/${DOCKERHUB_IMAGE}/tags/''', - returnStdout: true).trim() + env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT + env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/' env.PULL_REQUEST = env.CHANGE_ID } script{ @@ -71,12 +66,9 @@ pipeline { script{ env.LS_TAG_NUMBER = sh( script: '''#! /bin/bash - # Get the commit for the current tag tagsha=$(git rev-list -n 1 ${LS_RELEASE} 2>/dev/null) - # If this is a new commit then increment the LinuxServer release version if [ "${tagsha}" == "${COMMIT_SHA}" ]; then echo ${LS_RELEASE_NUMBER} - # If the commit is empty for this job do not increment elif [ -z "${GIT_COMMIT}" ]; then echo ${LS_RELEASE_NUMBER} else @@ -92,14 +84,11 @@ pipeline { // If this is an alpine base image determine the base package tag to use stage("Set Package tag Alpine"){ when { - expression { - env.DIST_IMAGE == 'alpine' && env.DIST_PACKAGES != 'none' - } + environment name: 'DIST_IMAGE', value: 'alpine' + not {environment name: 'DIST_PACKAGES', value: 'none'} } steps{ - echo 'Grabbing the latest alpine base image' sh '''docker pull alpine:${DIST_TAG}''' - echo 'Generating the package hash from the current versions' script{ env.PACKAGE_TAG = sh( script: '''docker run --rm alpine:${DIST_TAG} sh -c 'apk update --quiet\ @@ -111,14 +100,11 @@ pipeline { // If this is an ubuntu base image determine the base package tag to use stage("Set Package tag Ubuntu"){ when { - expression { - env.DIST_IMAGE == 'ubuntu' && env.DIST_PACKAGES != 'none' - } + environment name: 'DIST_IMAGE', value: 'ubuntu' + not {environment name: 'DIST_PACKAGES', value: 'none'} } steps{ - echo 'Grabbing the latest alpine base image' sh '''docker pull ubuntu:${DIST_TAG}''' - echo 'Generating the package hash from the current versions' script{ env.PACKAGE_TAG = sh( script: '''docker run --rm ubuntu:${DIST_TAG} sh -c\ @@ -131,9 +117,7 @@ pipeline { // If there are no base packages to tag in this build config set to none stage("Set Package tag none"){ when { - expression { - env.DIST_PACKAGES == 'none' - } + environment name: 'DIST_PACKAGES', value: 'none' } steps{ script{ @@ -148,11 +132,6 @@ pipeline { ######################## */ // If this is a stable github release use the latest endpoint from github to determine the ext tag stage("Set ENV github_stable"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'github_stable' - } - } steps{ script{ env.EXT_RELEASE = sh( @@ -161,215 +140,11 @@ pipeline { } } } - // If this is an os release set release type to none to indicate no external release - stage("Set ENV os"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'os' - } - } - steps{ - script{ - env.EXT_RELEASE = env.PACKAGE_TAG - env.RELEASE_LINK = 'none' - } - } - } // If this is a stable or devel github release generate the link for the build message stage("Set ENV github_link"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'github_stable' || env.EXT_RELEASE_TYPE == 'github_devel' - } - } steps{ script{ - env.RELEASE_LINK = sh( - script: '''echo https://github.com/${EXT_USER}/${EXT_REPO}/releases/tag/${EXT_RELEASE}''', - returnStdout: true).trim() - } - } - } - // If this is a deb repo release calculate a hash for the package version - stage("Set EXT tag deb repo"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'deb_repo' - } - } - steps{ - echo 'Grabbing the latest base image' - sh '''docker pull ${DIST_IMAGE}:${DIST_TAG}''' - echo 'Generating the package hash from the current versions' - script{ - env.EXT_RELEASE = sh( - script: '''docker run --rm ${DIST_IMAGE}:${DIST_TAG} bash -c\ - 'echo -e "'"${DIST_REPO}"'" > /etc/apt/sources.list.d/check.list \ - && apt-get --allow-unauthenticated update -qq >/dev/null 2>&1\ - && apt-cache --no-all-versions show '"${DIST_REPO_PACKAGES}"' | md5sum | cut -c1-8' ''', - returnStdout: true).trim() - env.RELEASE_LINK = 'deb_repo' - } - } - } - // If this is an alpine repo change for external version determine an md5 from the version string - stage("Set tag Alpine Repo"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'alpine_repo' - } - } - steps{ - echo 'Grabbing the latest alpine base image' - sh '''docker pull alpine:${DIST_TAG}''' - echo 'Generating the package hash from the current versions' - script{ - env.EXT_RELEASE = sh( - script: '''docker run --rm alpine:${DIST_TAG} sh -c 'apk update --quiet --repository '"${DIST_REPO}"'\ - && apk info --repository '"${DIST_REPO}"' '"${DIST_REPO_PACKAGES}"' | md5sum | cut -c1-8' ''', - returnStdout: true).trim() - env.RELEASE_LINK = 'alpine_repo' - } - } - } - // If this is a github commit trigger determine the current commit at head - stage("Set ENV github_commit"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'github_commit' - } - } - steps{ - script{ - env.EXT_RELEASE = sh( - script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_GIT_BRANCH} | jq -r '. | .sha' | cut -c1-8 ''', - returnStdout: true).trim() - } - } - } - // If this is a github commit trigger Set the external release link - stage("Set ENV commit_link"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'github_commit' - } - } - steps{ - script{ - env.RELEASE_LINK = sh( - script: '''echo https://github.com/${EXT_USER}/${EXT_REPO}/commit/${EXT_RELEASE} ''', - returnStdout: true).trim() - } - } - } - // If this is a github tag trigger determine the current tag - stage("Set ENV github_tag"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'github_tag' - } - } - steps{ - script{ - env.EXT_RELEASE = sh( - script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/tags | jq -r '.[0] | .name' ''', - returnStdout: true).trim() - env.EXT_COMMIT_URL = sh( - script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/tags | jq -r '.[0] | .commit.url' ''', - returnStdout: true).trim() - } - } - } - // If this is a github tag trigger Set the external release link - stage("Set ENV tag_link"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'github_tag' - } - } - steps{ - script{ - env.RELEASE_LINK = sh( - script: '''echo https://github.com/${EXT_USER}/${EXT_REPO}/releases/tag/${EXT_RELEASE} ''', - returnStdout: true).trim() - } - } - } - // If this is a npm version change set the external release verison and link - stage("Set ENV npm_version"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'npm_version' - } - } - steps{ - script{ - env.EXT_RELEASE = sh( - script: '''curl -s https://skimdb.npmjs.com/registry/${EXT_NPM} |jq -r '. | .["dist-tags"].latest' ''', - returnStdout: true).trim() - env.RELEASE_LINK = sh( - script: '''echo https://www.npmjs.com/package/${EXT_NPM} ''', - returnStdout: true).trim() - } - } - } - // If this is a pip version change set the external release verison and link - stage("Set ENV pip_version"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'pip_version' - } - } - steps{ - script{ - env.EXT_RELEASE = sh( - script: '''curl -s https://pypi.python.org/pypi/${EXT_PIP}/json |jq -r '. | .info.version' ''', - returnStdout: true).trim() - env.RELEASE_LINK = sh( - script: '''echo https://pypi.python.org/pypi/${EXT_PIP} ''', - returnStdout: true).trim() - } - } - } - // If this is a File blob set the ext version based on the remote files md5 - stage("Set ENV external_blob"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'external_blob' - } - } - steps{ - script{ - env.EXT_RELEASE = sh( - script: '''#! /bin/bash - # Make sure the remote file returns a 200 status or fail - if [ $(curl -I -sL -w "%{http_code}" ${EXT_BLOB} -o /dev/null) == 200 ]; then - curl -s -L ${EXT_BLOB} | md5sum | cut -c1-8 - else - exit 1 - fi''', - returnStdout: true).trim() - env.RELEASE_LINK = sh( - script: '''echo "Remote_Blob_Change" ''', - returnStdout: true).trim() - } - } - } - // If this is a custom json endpoint parse the return to get external tag - stage("Set ENV custom_json"){ - when { - expression { - env.EXT_RELEASE_TYPE == 'custom_json' - } - } - steps{ - script{ - env.EXT_RELEASE = sh( - script: '''curl -s ${JSON_URL} | jq -r ". | ${JSON_PATH}" ''', - returnStdout: true).trim() - env.RELEASE_LINK = sh( - script: '''echo "${JSON_URL}" ''', - returnStdout: true).trim() + env.RELEASE_LINK = 'https://github.com/' + env.EXT_USER + '/' + env.EXT_REPO + '/releases/tag/' + env.EXT_RELEASE } } } @@ -379,42 +154,148 @@ pipeline { // Build Docker container for push to LS Repo stage('Build-Single') { when { - expression { - env.MULTIARCH == 'false' - } + environment name: 'MULTIARCH', value: '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} ." + 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} ." + script{ + env.CI_IMAGE = env.DOCKERHUB_IMAGE + env.CI_TAGS = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + env.CI_META_TAG = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER } + } } // Build MultiArch Docker container for push to LS Repo stage('Build-Multi') { when { - expression { - env.MULTIARCH == 'true' - } + environment name: 'MULTIARCH', value: '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} ." + 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} ." + 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} ." + 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} ." + script{ + env.CI_IMAGE = env.DOCKERHUB_IMAGE + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm32v6-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + env.CI_META_TAG = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER } + } + } + // Tag to the Dev user dockerhub endpoint when this is a non master branch + stage('Docker-Tag-Dev-Single') { + when { + not {branch "master"} + environment name: 'CHANGE_ID', value: '' + environment name: 'MULTIARCH', value: 'false' + } + steps { + sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:latest" + sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" + script{ + env.CI_IMAGE = env.DEV_DOCKERHUB_IMAGE + env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + } + } + } + // Tag to the Dev user dockerhub endpoint when this is a non master branch + stage('Docker-Tag-Dev-Multi') { + when { + not {branch "master"} + environment name: 'CHANGE_ID', value: '' + environment name: 'MULTIARCH', value: 'true' + } + steps { + 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}" + script{ + env.CI_IMAGE = env.DEV_DOCKERHUB_IMAGE + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + } + } + } + // Tag to PR user dockerhub endpoint when this is a pull request + stage('Docker-Tag-PR-Single') { + when { + not {environment name: 'CHANGE_ID', value: ''} + environment name: 'MULTIARCH', value: 'false' + } + steps { + 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}" + script{ + env.CI_IMAGE = env.PR_DOCKERHUB_IMAGE + env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + } + } + } + // Tag to PR user dockerhub endpoint when this is a pull request + stage('Docker-Tag-PR-Multi') { + when { + not {environment name: 'CHANGE_ID', value: ''} + environment name: 'MULTIARCH', value: 'true' + } + steps { + 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}" + script{ + env.CI_IMAGE = env.PR_DOCKERHUB_IMAGE + env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + } + } } /* ####### Testing ####### */ // Run Container tests stage('Test') { + when { + environment name: 'CI', value: 'true' + } steps { - echo 'CI Tests for future use' + withCredentials([ + string(credentialsId: 'spaces-key', variable: 'DO_KEY'), + string(credentialsId: 'spaces-secret', variable: 'DO_SECRET') + ]) { + sh '''#! /bin/bash + docker pull lsiodev/readme-sync + docker run --rm \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -e IMAGE=\"${CI_IMAGE}\" \ + -e DELAY_START=\"${CI_DELAY}\" \ + -e TAGS=\"${CI_TAGS}\" \ + -e META_TAG=\"${CI_META_TAG}\" \ + -e PORT=\"${CI_PORT}\" \ + -e SSL=\"${CI_SSL}\" \ + -e BASE=\"${DIST_IMAGE}\" \ + -e SECRET_KEY=\"${DO_SECRET}\" \ + -e ACCESS_KEY=\"${DO_KEY}\" \ + -e DOCKER_ENV=\"${CI_DOCKERENV}\" \ + -e WEB_AUTH=\"${CI_AUTH}\" \ + -e WEB_PATH=\"${CI_WEBPATH}\" \ + -e DO_REGION="ams3" \ + -e DO_BUCKET="lsio-ci" \ + -t lsiodev/ci:latest \ + python /ci/ci.py''' + script{ + env.CI_URL = 'https://lsio-ci.ams3.digitaloceanspaces.com/' + env.CI_IMAGE + '/' + env.CI_META_TAG + '/index.html' + } + } } } /* ################## @@ -424,12 +305,10 @@ pipeline { stage('Docker-Push-Release-Single') { when { branch "master" + environment name: 'MULTIARCH', value: 'false' expression { env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER } - expression{ - env.MULTIARCH == 'false' - } } steps { withCredentials([ @@ -444,10 +323,8 @@ pipeline { sh '''#! /bin/bash echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin ''' - echo 'First push the latest tag' sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:latest" sh "docker push ${DOCKERHUB_IMAGE}:latest" - echo 'Pushing by release tag' sh "docker push ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER}" } } @@ -456,12 +333,10 @@ pipeline { stage('Docker-Push-Release-Multi') { when { branch "master" + environment name: 'MULTIARCH', value: 'true' expression { env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER } - expression{ - env.MULTIARCH == 'true' - } } steps { withCredentials([ @@ -472,29 +347,26 @@ pipeline { 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 push --purge ${DOCKERHUB_IMAGE}:latest || :" 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 push --purge ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} || :" 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 --purge ${DOCKERHUB_IMAGE}:latest" sh "docker manifest push --purge ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER}" } @@ -519,83 +391,13 @@ pipeline { "tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' ''' echo "Pushing New release for Tag" sh '''#! /bin/bash - if [ ${EXT_RELEASE_TYPE} == 'github_stable' ] || [ ${EXT_RELEASE_TYPE} == 'github_devel' ]; then - # Grabbing the current release body from external repo - curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq '. |.body' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start - # Grabbing the current release body from external repo - elif [ ${EXT_RELEASE_TYPE} == 'github_commit' ]; then - curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_GIT_BRANCH} | jq '. | .commit.message' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start - elif [ ${EXT_RELEASE_TYPE} == 'github_tag' ]; then - curl -s ${EXT_COMMIT_URL} | jq '. | .commit.message' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start - elif [ ${EXT_RELEASE_TYPE} == 'os' ]; then - # Using base package version for release notes - echo "Updating base packages to ${PACKAGE_TAG}" > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**OS Changes:**\\n\\n' > start - elif [ ${EXT_RELEASE_TYPE} == 'deb_repo' ] || [ ${EXT_RELEASE_TYPE} == 'alpine_repo' ]; then - # Using base package version for release notes - echo "Updating external repo packages to ${EXT_RELEASE}" > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Repo Changes:**\\n\\n' > start - elif [ ${EXT_RELEASE_TYPE} == 'npm_version' ]; then - # Using base package version for release notes - echo "Updating NPM version of ${EXT_NPM} to ${EXT_RELEASE}" > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**NPM Changes:**\\n\\n' > start - elif [ ${EXT_RELEASE_TYPE} == 'pip_version' ]; then - # Using base package version for release notes - echo "Updating PIP version of ${EXT_PIP} to ${EXT_RELEASE}" > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**PIP Changes:**\\n\\n' > start - elif [ ${EXT_RELEASE_TYPE} == 'external_blob' ]; then - # Using base package version for release notes - echo "External Release file changed at ${EXT_BLOB}" > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Remote Changes:**\\n\\n' > start - elif [ ${EXT_RELEASE_TYPE} == 'custom_json' ]; then - # Referencing the JSON endpoint for release notes - echo "Data change at JSON endpoint ${JSON_URL}" > releasebody.json - # Creating the start of the json payload - echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "target_commitish": "master",\ - "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ - "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Remote Changes:**\\n\\n' > start - fi - # Add the end of the payload to the file + curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq '. |.body' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json + echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + "target_commitish": "master",\ + "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\ + "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start printf '","draft": false,"prerelease": false}' >> releasebody.json - # Combine the start and ending string This is needed do to incompatibility with JSON and Bash escape strings paste -d'\\0' start releasebody.json > releasebody.json.done - # Send payload to github curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done''' } } @@ -616,7 +418,6 @@ pipeline { passwordVariable: 'DOCKERPASS' ] ]) { - echo 'Run Docker README Sync' sh '''#! /bin/bash docker pull lsiodev/readme-sync docker run --rm=true \ @@ -625,8 +426,7 @@ pipeline { -e GIT_REPOSITORY=${LS_USER}/${LS_REPO} \ -e DOCKER_REPOSITORY=${DOCKERHUB_IMAGE} \ -e GIT_BRANCH=master \ - lsiodev/readme-sync bash -c 'node sync' - ''' + lsiodev/readme-sync bash -c 'node sync' ''' } } } @@ -636,13 +436,9 @@ pipeline { // Push to the Dev user dockerhub endpoint when this is a non master branch stage('Docker-Push-Dev-Single') { when { - not { - branch "master" - } + not {branch "master"} environment name: 'CHANGE_ID', value: '' - expression{ - env.MULTIARCH == 'false' - } + environment name: 'MULTIARCH', value: 'false' } steps { withCredentials([ @@ -653,34 +449,23 @@ pipeline { passwordVariable: 'DOCKERPASS' ] ]) { - echo 'Logging into DockerHub' 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} ${DEV_DOCKERHUB_IMAGE}:latest" - sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}" - echo 'Pushing both tags' sh "docker push ${DEV_DOCKERHUB_IMAGE}:latest" sh "docker 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() + env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/' } } } // Push to the Dev user dockerhub endpoint when this is a non master branch stage('Docker-Push-Dev-Multi') { when { - not { - branch "master" - } + not {branch "master"} environment name: 'CHANGE_ID', value: '' - expression{ - env.MULTIARCH == 'true' - } + environment name: 'MULTIARCH', value: 'true' } steps { withCredentials([ @@ -691,39 +476,28 @@ pipeline { 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 push --purge ${DEV_DOCKERHUB_IMAGE}:latest || :" 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 push --purge ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} || :" 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 --purge ${DEV_DOCKERHUB_IMAGE}:latest" sh "docker manifest push --purge ${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() + env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/' } } } @@ -733,12 +507,8 @@ pipeline { // Push to PR user dockerhub endpoint when this is a pull request stage('Docker-Push-PR-Single') { when { - not { - environment name: 'CHANGE_ID', value: '' - } - expression{ - env.MULTIARCH == 'false' - } + not {environment name: 'CHANGE_ID', value: ''} + environment name: 'MULTIARCH', value: 'false' } steps { withCredentials([ @@ -749,36 +519,23 @@ pipeline { passwordVariable: 'DOCKERPASS' ] ]) { - echo 'Logging into DockerHub' 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}" } script{ - env.CODE_URL = sh( - script: '''echo https://github.com/${LS_USER}/${LS_REPO}/pull/${PULL_REQUEST}''', - returnStdout: true).trim() - env.DOCKERHUB_LINK = sh( - script: '''echo https://hub.docker.com/r/${PR_DOCKERHUB_IMAGE}/tags/''', - returnStdout: true).trim() + env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST + env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/' } } } // Push to PR user dockerhub endpoint when this is a pull request stage('Docker-Push-PR-Multi') { when { - not { - environment name: 'CHANGE_ID', value: '' - } - expression{ - env.MULTIARCH == 'true' - } + not {environment name: 'CHANGE_ID', value: ''} + environment name: 'MULTIARCH', value: 'true' } steps { withCredentials([ @@ -789,42 +546,29 @@ pipeline { 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} ${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 push --purge ${PR_DOCKERHUB_IMAGE}:latest || :" 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 push --purge ${PR_DOCKERHUB_IMAGE}:${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 --purge ${PR_DOCKERHUB_IMAGE}:latest" sh "docker manifest push --purge ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}" } script{ - env.CODE_URL = sh( - script: '''echo https://github.com/${LS_USER}/${LS_REPO}/pull/${PULL_REQUEST}''', - returnStdout: true).trim() - env.DOCKERHUB_LINK = sh( - script: '''echo https://hub.docker.com/r/${PR_DOCKERHUB_IMAGE}/tags/''', - returnStdout: true).trim() + env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST + env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/' } } } @@ -834,15 +578,13 @@ pipeline { ###################### */ post { success { - echo "Build good send details to discord" sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 1681177,\ - "description": "**Build:** '${BUILD_NUMBER}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ + "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ "username": "Jenkins"}' ${BUILDS_DISCORD} ''' } failure { - echo "Build Bad sending details to discord" sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 16711680,\ - "description": "**Build:** '${BUILD_NUMBER}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ + "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\ "username": "Jenkins"}' ${BUILDS_DISCORD} ''' } }