-
Notifications
You must be signed in to change notification settings - Fork 358
/
publish.jenkins
114 lines (94 loc) · 4.91 KB
/
publish.jenkins
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
#!groovy
node('Linux') {
try {
// To generate the docs locally run the following, better redirect sources_folder and gh_pages_out
// to folders outside this repo. Add --branches arguments for the branches you want to regenerate
// python .ci/scripts/prepare_sources.py --sources-folder=../cloned_sources --branches=release/2.0 --branches=master
// python .ci/scripts/generate_documentation.py --sources-folder=../cloned_sources --branch=$release/2.0 --with-pdf
// python .ci/scripts/generate_documentation.py --sources-folder=../cloned_sources --branch=master --with-pdf
// python .ci/scripts/prepare_gh_pages.py --sources-folder=../cloned_sources --gh-pages-folder=../gh_pages_out
// Then go to ../gh_pages_out and test the docs using a local server like: 'python -m http.server 8000'
// and open: 'http://localhost:8000/2.0/index.html'
String output_contents = 'output_contents'
String sources_folder = 'sources_folder'
String gh_pages_out = 'gh_pages_out'
assert params.branches, 'Provide a list of branches to publish, separated by ","'
List branches = params.branches.split(',')
echo "Generating docs for ${branches}"
checkout scm
docker.image("conanio/ci-docs:latest").pull()
stage('Prepare sources as worktrees') {
String branch_argument = ""
for (branch in branches) {
branch_argument = branch_argument + " --branches=${branch}"
}
// clone sources to generate docs
sh(script: "python .ci/scripts/prepare_sources.py --sources-folder=${sources_folder} ${branch_argument}")
}
// we have to divide the parallel blocks because if we have to generate all branches documentation
// it will fail
def number_of_parallel_blocks = (branches.size() < 5) ? 1 : 5
def branches_blocks = branches.collate(branches.size().intdiv(number_of_parallel_blocks))
docker.image("conanio/ci-docs:latest").inside {
for (branches_block in branches_blocks) {
Map parallelJobs = [:]
println("New block ${branches_block}")
branches_block.each { branch ->
parallelJobs[branch] = {
echo "Run parallel job for ${branch}"
sh """
python -m venv venv_${branch}
. venv_${branch}/bin/activate
pip install -r requirements.txt
python .ci/scripts/generate_documentation.py --sources-folder=${sources_folder} --branch=${branch} --with-pdf
"""
}
}
stage('Generate docs parallel block') {
parallelJobs.failFast = true
parallel parallelJobs
}
}
}
stage('Prepare gh-pages') {
sh(script: "python .ci/scripts/prepare_gh_pages.py --sources-folder=${sources_folder} --gh-pages-folder=${gh_pages_out}")
}
stage('Replace HTML tags in generated files') {
Map parallelReplaces = [:]
branches.each { branch ->
parallelReplaces[branch] = {
echo "Run parallel replace for ${branch}"
sh(script: "python .ci/scripts/replace_html_tags.py --gh-pages-folder=${gh_pages_out} --branch=${branch}")
}
}
parallelReplaces.failFast = true
parallel parallelReplaces
}
stage('Archive generated folder') {
archiveArtifacts artifacts: "${gh_pages_out}/**/*.*"
echo "Inspect generated webpage at ${BUILD_URL}artifact/${gh_pages_out}/index.html"
}
if (params.publish) {
stage('Publish to gh-pages') {
dir(gh_pages_out) {
sh 'rm -rf .git'
sh 'git init .'
sh 'git checkout -b gh-pages'
sh 'git add .'
sh 'git config user.email "conanci@jfrog.com"'
sh 'git config user.name "ConanCI bot"'
sh "git commit -m \"Automatic deploy (build number ${BUILD_NUMBER})\""
withCredentials([usernamePassword(credentialsId: 'conanci-gh-token', usernameVariable: 'GH_USER', passwordVariable: 'GH_PASS')]) {
sh "git remote add origin-pages https://$GH_USER:$GH_PASS@github.com/conan-io/docs.git"
sh 'git push --quiet --force origin-pages gh-pages'
}
}
}
}
}
finally {
cleanWs(cleanWhenAborted: true, cleanWhenFailure: true, cleanWhenNotBuilt: true,
cleanWhenSuccess: true, cleanWhenUnstable: true, disableDeferredWipeout: true, deleteDirs: true,
notFailBuild: true)
}
}