-
Notifications
You must be signed in to change notification settings - Fork 581
Expand file tree
/
Copy pathJenkinsfile
More file actions
143 lines (131 loc) · 3.79 KB
/
Copy pathJenkinsfile
File metadata and controls
143 lines (131 loc) · 3.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#!groovy
pipeline {
agent {
label 'git-websites'
}
options {
buildDiscarder logRotator(numToKeepStr: '5')
timeout(40)
disableConcurrentBuilds()
skipStagesAfterUnstable()
}
environment {
RUBY_PATH="${env.WORKSPACE}/.rvm"
GEM_HOME="${RUBY_PATH}/gems"
PATH="${GEM_HOME}/bin:${RUBY_PATH}/bin:${env.PATH}"
}
stages {
stage('Check for site changes') {
steps {
script {
if (env.CHANGE_TARGET) {
// PR build: only rebuild when files that affect the generated site changed.
sh "git fetch --no-tags origin +refs/heads/${env.CHANGE_TARGET}:refs/remotes/origin/${env.CHANGE_TARGET}"
def files = sh(
script: "git diff --name-only origin/${env.CHANGE_TARGET}...HEAD",
returnStdout: true).trim()
echo "Files changed in this PR:\n${files}"
env.SITE_CHANGED = files.readLines().any {
it ==~ /^(source\/.*|_config\.yml|Gemfile(\.lock)?)$/
} ? 'true' : 'false'
} else {
// Branch build (e.g. main): always rebuild.
env.SITE_CHANGED = 'true'
}
echo "SITE_CHANGED=${env.SITE_CHANGED}"
}
}
}
stage('Build a staged website') {
when {
expression { env.SITE_CHANGED == 'true' }
}
steps {
sh '''
echo Generating a new version of website
gem install --install-dir ${GEM_HOME} bundler -v '2.3.23'
bundle config set --local path ${GEM_HOME}
bundle install
bundle exec jekyll build
'''
}
}
stage('Deploy to stage area') {
when {
expression { env.SITE_CHANGED == 'true' }
}
steps {
sh '''
echo "Pushing changes into stage site"
if ! git config remote.asf.url > /dev/null; then
git remote add asf https://gitbox.apache.org/repos/asf/struts-site.git
fi
git fetch asf
git checkout asf-staging
git pull asf asf-staging
rm -rf content
cp -r _site content
git add -A content
git status
git commit -m "Updates stage by Jenkins" --allow-empty
git push asf asf-staging
'''
}
}
stage('Comment on PR') {
when {
allOf {
changeRequest()
expression { env.SITE_CHANGED == 'true' }
}
}
steps {
script {
pullRequest.comment("Staged site is ready at https://struts.staged.apache.org/")
}
}
}
}
post {
// If this build failed, send an email to the list.
failure {
script {
emailext(
//to: "commits@struts.apache.org",
recipientProviders: [[$class: 'DevelopersRecipientProvider']],
from: "Mr. Jenkins <jenkins@builds.apache.org>",
subject: "Jenkins job ${env.JOB_NAME}#${env.BUILD_NUMBER} failed",
body: """
There is a build failure in ${env.JOB_NAME}.
Build: ${env.BUILD_URL}
Logs: ${env.BUILD_URL}console
Changes: ${env.BUILD_URL}changes
--
Mr. Jenkins
Director of Continuous Integration
"""
)
}
}
// Send an email, if the last build was not successful and this one is.
fixed {
script {
emailext(
//to: "commits@struts.apache.org",
recipientProviders: [[$class: 'DevelopersRecipientProvider']],
from: 'Mr. Jenkins <jenkins@builds.apache.org>',
subject: "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}
Logs: ${env.BUILD_URL}console
Changes: ${env.BUILD_URL}changes
--
Mr. Jenkins
Director of Continuous Integration
"""
)
}
}
}
}