| #!groovy |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * https://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| pipeline { |
| agent { |
| // https://cwiki.apache.org/confluence/display/INFRA/ci-builds.apache.org |
| label 'git-websites' |
| } |
| |
| environment { |
| DEPLOY_BRANCH = "${env.BRANCH_NAME == "main" ? "asf-site" : "${env.BRANCH_NAME}-staging"}" |
| HUGO_VERSION = '0.111.3' |
| HUGO_HASH = 'b382aacb522a470455ab771d0e8296e42488d3ea4e61fe49c11c32ec7fb6ee8b' |
| PAGEFIND_VERSION = '1.0.3' |
| PAGEFIND_HASH = 'e84ec7e8cb424022aa70ca14e6735c67c9728596753321dec782a902c3bfe6f0' |
| } |
| |
| stages { |
| stage('Prepare') { |
| steps { |
| script { |
| // Capture last commit hash for final commit message |
| env.LAST_SHA = sh(script:'git log -n 1 --pretty=format:\'%H\'', returnStdout: true).trim() |
| env.HUGO_PATH = sh(script:'which hugo', returnStdout: true).trim() |
| sh "echo Hugo path: '${env.HUGO_PATH}'" |
| // Get current Hugo version (looks like hugo v0.111.3-5d4eb5154e1fed125ca8e9b5a0315c4180dab192+extended linux/amd64 ...) |
| // Use the location found above to ensure same hugo can be used later |
| env.HUGO_VERSION_CURRENT = sh(script:'${HUGO_PATH} version | cut -f 2 -d" "|cut -d- -f 1|sed -e "s!^v!!"', returnStdout: true).trim() |
| sh "echo Hugo current: '${env.HUGO_VERSION_CURRENT}'" |
| sh "echo Hugo target: '${HUGO_VERSION}'" |
| // create the dir in case it is needed (simplifies tidyup) |
| env.HUGO_DIR = sh(script:'mktemp -d', returnStdout: true).trim() |
| } |
| } |
| } |
| stage("Install Hugo") { |
| when { |
| expression { env.HUGO_VERSION_CURRENT != HUGO_VERSION } |
| } |
| steps { |
| script { |
| // Download Hugo |
| sh "mkdir -p ${env.HUGO_DIR}/bin" |
| sh "wget --no-verbose -O ${env.HUGO_DIR}/hugo.tar.gz https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_Linux-64bit.tar.gz" |
| // Verify the checksum |
| def hugo_hash = sha256 file: "${env.HUGO_DIR}/hugo.tar.gz" |
| assert hugo_hash == "${HUGO_HASH}" |
| // Unpack Hugo |
| sh "tar -C ${env.HUGO_DIR}/bin -xkf ${env.HUGO_DIR}/hugo.tar.gz" |
| env.HUGO_PATH = "${env.HUGO_DIR}/bin/hugo" |
| } |
| } |
| } |
| stage("Install Pagefind") { |
| steps { |
| script { |
| // Download Pagefind |
| env.PAGEFIND_DIR = sh(script:'mktemp -d', returnStdout: true).trim() |
| sh "mkdir -p ${env.PAGEFIND_DIR}/bin" |
| sh "wget --no-verbose -O ${env.PAGEFIND_DIR}/pagefind.tar.gz https://github.com/CloudCannon/pagefind/releases/download/v${PAGEFIND_VERSION}/pagefind-v${PAGEFIND_VERSION}-x86_64-unknown-linux-musl.tar.gz" |
| // Verify the checksum |
| def pagefind_hash = sha256 file: "${env.PAGEFIND_DIR}/pagefind.tar.gz" |
| assert pagefind_hash == "${PAGEFIND_HASH}" |
| // Unpack Pagefind |
| sh "tar -C ${env.PAGEFIND_DIR}/bin -xkf ${env.PAGEFIND_DIR}/pagefind.tar.gz" |
| |
| } |
| } |
| } |
| stage("Setup directory") { |
| steps { |
| script { |
| // Setup directory structure for generated content |
| env.TMP_DIR = sh(script:'mktemp -d', returnStdout: true).trim() |
| env.OUT_DIR = "${env.TMP_DIR}/content" |
| sh "mkdir -p ${env.OUT_DIR}" |
| |
| } |
| } |
| } |
| stage('Build') { |
| steps { |
| script { |
| sh "${HUGO_PATH} --destination ${env.OUT_DIR} --cacheDir ${env.HUGO_DIR}" |
| sh "${PAGEFIND_DIR}/bin/pagefind --site ${env.OUT_DIR} --output-subdir _pagefind" |
| sh "rm -f .hugo_build.lock" |
| } |
| } |
| } |
| // https://www.jenkins.io/doc/book/pipeline/syntax/#built-in-conditions |
| // branch uses Ant-style patterns by default: |
| // https://ant.apache.org/manual/dirtasks.html#patterns |
| // Exclude branches ending in '-staging' |
| // Also try to prevent deploy of top-level branches apart from main |
| stage('Deploy') { |
| when { |
| not { |
| branch '**/*-staging' |
| } |
| anyOf { |
| branch 'main' |
| not { |
| branch '*' |
| } |
| } |
| } |
| |
| steps { |
| script { |
| // Checkout branch with generated content, creating it if necessary |
| // We only want the generated content + .asf.yaml |
| sh """ |
| if git checkout ${DEPLOY_BRANCH} |
| then |
| git pull origin ${DEPLOY_BRANCH} |
| else |
| echo "branch ${DEPLOY_BRANCH} is new; create basic site" |
| git checkout --orphan ${DEPLOY_BRANCH} -f |
| git rm -rf . |
| # assume we have an asf.yaml file |
| git checkout origin/${BRANCH_NAME} -- .asf.yaml |
| git add .asf.yaml -f |
| fi |
| """ |
| |
| // Remove the content of the target branch and replace it with the content of the temp folder |
| sh """ |
| rm -rf ${WORKSPACE}/content |
| git rm -r --ignore-unmatch --cached content/* |
| mkdir -p ${WORKSPACE}/content |
| cp -rT ${env.TMP_DIR}/* ${WORKSPACE}/content |
| """ |
| |
| // Commit the changes to the target branch |
| env.COMMIT_MESSAGE1 = "Updated ${DEPLOY_BRANCH} from ${BRANCH_NAME} at ${env.LAST_SHA}" |
| env.COMMIT_MESSAGE2 = "Built from ${BUILD_URL}" |
| sh """ |
| git add -A |
| git commit -m "${env.COMMIT_MESSAGE1}" -m "${env.COMMIT_MESSAGE2}" | true |
| """ |
| |
| // Push the generated content for deployment |
| sh "git push -u origin ${DEPLOY_BRANCH}" |
| } |
| } |
| } |
| } |
| |
| post { |
| always { |
| script { |
| sh """ |
| rm -rf ${env.HUGO_DIR} |
| rm -rf ${env.PAGEFIND_DIR} |
| rm -rf ${env.TMP_DIR} |
| """ |
| } |
| deleteDir() /* clean up our workspace */ |
| } |
| |
| // If the build failed, send an email to the list. |
| failure { |
| script { |
| if (env.BRANCH_NAME == 'main') { |
| emailext( |
| to: "dev@community.apache.org", |
| recipientProviders: [[$class: 'DevelopersRecipientProvider']], |
| from: "Jenkins <jenkins@ci-builds.apache.org>", |
| subject: "[website] Jenkins job ${env.JOB_NAME}#${env.BUILD_NUMBER} failed", |
| body: """ |
| There is a build failure in ${env.JOB_NAME}. |
| |
| Build: ${env.BUILD_URL} |
| """ |
| ) |
| } |
| } |
| } |
| |
| // Send an email, if the last build was not successful and this one is. |
| fixed { |
| script { |
| if (env.BRANCH_NAME == 'main') { |
| emailext( |
| to: "dev@community.apache.org", |
| recipientProviders: [[$class: 'DevelopersRecipientProvider']], |
| from: 'Jenkins <jenkins@ci-builds.apache.org>', |
| subject: "[events-website] Jenkins job ${env.JOB_NAME}#${env.BUILD_NUMBER} back to normal", |
| body: """ |
| The build for ${env.JOB_NAME} completed successfully and is back to normal. |
| |
| Build: ${env.BUILD_URL} |
| """ |
| ) |
| } |
| } |
| } |
| } |
| } |