forked from jenkins-infra/jenkins.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Jenkinsfile
146 lines (130 loc) · 5.75 KB
/
Jenkinsfile
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
144
145
146
#!/usr/bin/env groovy
/* Only keep the 10 most recent builds. */
def projectProperties = [
[$class: 'BuildDiscarderProperty',strategy: [$class: 'LogRotator', numToKeepStr: '5']],
]
if (!env.CHANGE_ID) {
if (env.BRANCH_NAME == null) {
projectProperties.add(pipelineTriggers([cron('H/30 * * * *')]))
}
}
properties(projectProperties)
try {
/* Assuming that wherever we're going to build, we have nodes labelled with
* "Docker" so we can have our own isolated build environment
*/
node('docker') {
stage('Clean workspace') {
/* Running on a fresh Docker instance makes this redundant, but just in
* case the host isn't configured to give us a new Docker image for every
* build, make sure we clean things before we do anything
*/
deleteDir()
sh 'ls -lah'
}
stage('Checkout source') {
/*
* For a standalone workflow script, we would use the `git` step
*
*
* git url: 'git://github.com/jenkinsci/jenkins.io',
* branch: 'master'
*/
/*
* Represents the SCM configuration in a "Workflow from SCM" project build. Use checkout
* scm to check out sources matching Jenkinsfile with the SCM details from
* the build that is executing this Jenkinsfile.
*
* when not in multibranch: https://issues.jenkins-ci.org/browse/JENKINS-31386
*/
checkout scm
}
stage('Build site') {
/* If the slave can't gather resources and build the site in 60 minutes,
* something is very wrong
*/
timeout(60) {
/* Invoke Gradle which has the actual task graph defined inside of it
* for the building of the site
*/
docker.image('java:8').inside {
/* One Weird Trick(tm) to allow git(1) to clone inside of a
* container
*/
withEnv([
'GIT_COMMITTER_NAME=Hates',
'GIT_AUTHOR_NAME=Cake',
/* Override the npm cache directory to avoid: EACCES: permission denied, mkdir '/.npm' */
'npm_config_cache=npm-cache',
/* set home to our current directory because other bower
* nonsense breaks with HOME=/, e.g.:
* EACCES: permission denied, mkdir '/.config'
*/
'HOME=.',
]) {
sh '''#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
set -o xtrace
./gradlew --quiet --console=plain --no-daemon --info --stacktrace | tee build.log
if [[ -n "$( grep --fixed-strings WARNING build.log )" ]] ; then
echo "Failing build due to warnings in log output" >&2
exit 1
fi
illegal_htaccess_content="$( find content -name '.htaccess' -type f -exec grep --extended-regexp --invert-match '^(#|ErrorDocument)' {} \\; )"
if [[ -n "$illegal_htaccess_content" ]] ; then
echo "Failing build due to illegal content in .htaccess files, only ErrorDocument is allowed:" >&2
echo "$illegal_htaccess_content" >&2
exit 1
fi
'''
}
}
}
}
stage('Archive site') {
/* The `archive` task inside the Gradle build should be creating a zip file
* which we can use for the deployment of the site. This stage will archive
* that artifact so we can pick it up later
*/
archiveArtifacts artifacts: 'build/**/*.zip,build/_site/*.pdf', fingerprint: true
/* stash the archived site so we can pull it back out when we deploy */
stash includes: 'build/**/*.zip', name: 'built-site'
}
}
/* The Jenkins which deploys doesn't use multibranch or GitHub Org Folders
*/
if (env.BRANCH_NAME == null) {
stage('Deploy sitesite') {
node {
/* This Credentials ID is from the `site-deployer` account on
* ci.jenkins-ci.org
*
* Watch https://issues.jenkins-ci.org/browse/JENKINS-32101 for updates
*/
sshagent(credentials: ['site-deployer']) {
/* Make sure we delete our current directory on this node to make sure
* we're only uploading what we unstash
*/
deleteDir()
unstash 'built-site'
sh 'ls build/archives'
sh 'echo "put build/archives/*.zip archives/" | sftp [email protected]'
}
}
}
}
}
catch (exc) {
echo "Caught: ${exc}"
String recipient = '[email protected]'
mail subject: "${env.JOB_NAME} (${env.BUILD_NUMBER}) failed",
body: "It appears that ${env.BUILD_URL} is failing, somebody should do something about that",
to: recipient,
replyTo: recipient,
from: '[email protected]'
}
// vim: ft=groovy