blob: 94fff808c0229dc771f427ac3bf80e77c5690bdc [file] [log] [blame]
/*
* This is a multibranch pipeline that:
* - Checks out (shallow, read-only) the 'master' branch from netbeans-website (github) in the 'master-branch' directory.
* - Checks out the 'asf-site' branch from netbeans-website (gitbox) in the 'asf-site-branch' directory.
* - Runs a gradle job to build the website in the 'master-branch' directory.
* - Copies the resulting web stuff (html, images, etc.) to the 'asf-site-branch' directory.
* - Commits and pushes to the 'asf-site' branch, for later publishing.
*
* Questions and enhancements to dev@netbeans.apache.org, ebarboni@apache.org or vieiro@apache.org.
*
* Note from vieiro@apache.org: That what once was a simple shell script is now a nightmare of complexity and a waste of computing resources.
*
* Useful references:
* - The pipeline DSL nightmare reference is available at https://www.jenkins.io/doc/book/pipeline/syntax/
* -
*/
pipeline {
// 'git-websites' as set by ASF Infra. This is the label used to build websites.
agent { node { label 'git-websites' } }
tools { jdk 'jdk_1.8_latest' }
triggers {
pollSCM('') // Enabling being build on Push
}
options {
buildDiscarder(logRotator(numToKeepStr: '6'))
disableConcurrentBuilds()
timeout(time: 50, unit: 'MINUTES')
}
stages {
stage("Shallow clone of github master branch") {
steps {
script {
def masterBranch = checkout([
$class: 'GitSCM',
branches: [[name: '*/master']],
doGenerateSubmoduleConfigurations: false,
extensions: [
[$class: 'MessageExclusion', excludedMessage: 'Automated site publishing.*'],
[$class: 'CloneOption', depth: 1, noTags: true, reference: '', shallow: true],
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'master-branch']
],
submoduleCfg: [],
userRemoteConfigs: [[url: 'https://github.com/apache/netbeans-website.git']]
])
def siteBranch = checkout([
$class: 'GitSCM',
branches: [[name: '*/asf-site']],
doGenerateSubmoduleConfigurations: false,
extensions: [
[$class: 'MessageExclusion', excludedMessage: 'Automated site publishing.*'],
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'asf-site-branch']
],
submoduleCfg: [],
userRemoteConfigs: [[
credentialsId: '9b041bd0-aea9-4498-a576-9eeb771411dd',
url: 'https://gitbox.apache.org/repos/asf/netbeans-website.git'
]]
])
def gitCommit = masterBranch.GIT_COMMIT
def gitPreviousCommit = masterBranch.GIT_PREVIOUS_COMMIT
println("GIT_COMMIT: ${gitCommit}")
println("GIT_PREVIOUS_COMMIT: ${gitPreviousCommit}")
println("MASTER BRANCH : ${masterBranch}")
// We want to rebuild the website when 'master' changes, not when 'asf-site' changes...
if (gitCommit.equals(gitPreviousCommit)) {
// vieiro/2020-07-25
// It seems there's no clean way to stop a build from a step without using exceptions and weird things.
// It seems "As a user I want to stop a build from a stage step" is not a user story jenkins authors had in mind.
// This is very unfortunate and has caused pain all around the world.
// https://devops.stackexchange.com/questions/885/cleanest-way-to-prematurely-exit-a-jenkins-pipeline-job-as-a-success
currentBuild.result = 'ABORTED'
error("Commit ${gitCommit} and previous commit ${gitPreviousCommit} are equal. No need to rebuild the website.")
} else {
println("Different commits, proceeding...")
}
}
dir('asf-site-branch') {
sh 'git fetch'
sh 'git checkout asf-site'
sh 'git pull'
sh 'git status'
}
}
}
stage("Building the website") {
steps {
dir('master-branch/netbeans.apache.org') {
sh 'chmod u+x ./gradlew'
sh './gradlew --version'
sh './gradlew clean buildSite'
}
}
}
stage("Updating asf-site branch") {
steps {
dir('asf-site-branch') {
sh script: '''
#!/usr/bin/env bash
echo "Deleting content directory..."
rm -rf content/
mkdir content
echo "Copying HTML files..."
cp -R ../master-branch/netbeans.apache.org/build/bake/* content
echo "Copying .htaccess..."
cp -R ../master-branch/netbeans.apache.org/src/content/.htaccess content
echo "Copying wiki/.htaccess..."
cp -R ../master-branch/netbeans.apache.org/src/content/wiki/.htaccess content/wiki
echo "All files copied"
cp ../master-branch/.asf.yaml .
echo "Copying asf yaml file to publish branch"
'''
}
}
}
stage("Commit and push to asf-site") {
steps {
dir('asf-site-branch') {
sh script: '''
#!/usr/bin/env bash
echo "Checking git status"
git status
echo "Adding content..."
git add -v content/
echo "Adding asf file"
git add -v .asf.yaml
echo "Commit to gitbox..."
git status
git commit -v -m "Automated site publishing by Jenkins build ${BUILD_NUMBER}"
if [ $? -ne 0 ]; then
echo "Commit failed."
exit 2
fi
echo "Pushing to gitbox... Disabled for testing"
git push -v origin asf-site
if [ $? -ne 0 ]; then
echo "Push failed."
exit 3
fi
echo "Done."
'''
}
}
}
}
post {
cleanup {
println "Cleanup todo (using cleanWS to test)"
cleanWs()
}
success {
//echo "Success?"
slackSend (channel:'#netbeans-builds', message:"SUCCESS: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL}) ",color:'#00FF00')
}
failure {
//echo "Failure?"
slackSend (channel:'#netbeans-builds', message:"FAILED/ABORTED: Job '${env.JOB_NAME} [${env.BUILD_NUMBER}]' (${env.BUILD_URL})",color:'#FF0000')
}
}
}