blob: a45d0b410806f13db22b7ff3e1d7769bb8a5bf34 [file] [log] [blame]
Paul Kehrerba58e1f2017-05-22 18:08:29 -07001if (env.BRANCH_NAME == "master") {
2 properties([pipelineTriggers([cron('@daily')])])
3}
4
5def configs = [
6 [
7 label: 'windows',
8 toxenvs: ['py26', 'py27', 'py33', 'py34', 'py35', 'py36'],
9 ],
10 [
11 label: 'windows64',
12 toxenvs: ['py26', 'py27', 'py33', 'py34', 'py35', 'py36'],
13 ],
14 [
15 label: 'freebsd11',
16 toxenvs: ['py27'],
17 ],
18 [
19 label: 'sierra',
20 toxenvs: ['py27'],
21 ],
22 [
23 label: 'yosemite',
24 toxenvs: ['py27'],
25 ],
26 [
27 label: 'docker',
28 imageName: 'pyca/cryptography-runner-centos7',
29 toxenvs: ['py27'],
30 ],
31 [
32 label: 'docker',
33 imageName: 'pyca/cryptography-runner-wheezy',
34 toxenvs: ['py27'],
35 ],
36 [
37 label: 'docker',
38 imageName: 'pyca/cryptography-runner-jessie',
39 toxenvs: ['py27', 'py34'],
40 ],
41 [
42 label: 'docker',
43 imageName: 'pyca/cryptography-runner-sid',
44 toxenvs: ['py27', 'py35'],
45 ],
46 [
47 label: 'docker',
48 imageName: 'pyca/cryptography-runner-stretch',
49 toxenvs: ['py27', 'py35'],
50 ],
51 [
52 label: 'docker',
53 imageName: 'pyca/cryptography-runner-jessie-libressl:2.4.5',
54 toxenvs: ['py27'],
55 ],
56 [
57 label: 'docker',
Paul Kehrerd36bef02017-05-25 23:05:00 -050058 imageName: 'pyca/cryptography-runner-jessie-libressl:2.5.4',
59 toxenvs: ['py27'],
60 ],
61 [
62 label: 'docker',
Paul Kehrerba58e1f2017-05-22 18:08:29 -070063 imageName: 'pyca/cryptography-runner-ubuntu-xenial',
64 toxenvs: ['py27', 'py35'],
65 ],
66 [
67 label: 'docker',
68 imageName: 'pyca/cryptography-runner-ubuntu-rolling',
Alex Gaynor40226372017-05-23 14:14:18 -070069 toxenvs: ['py27', 'py35', 'pep8', 'py3pep8', 'randomorder'],
70 ],
71 [
72 label: 'docker',
73 imageName: 'pyca/cryptography-runner-ubuntu-rolling',
74 toxenvs: ['docs'],
75 artifacts: 'cryptography/docs/_build/html/**',
76 artifactExcludes: '**/*.doctree',
Paul Kehrerba58e1f2017-05-22 18:08:29 -070077 ],
78 [
79 label: 'docker',
80 imageName: 'pyca/cryptography-runner-fedora',
81 toxenvs: ['py27', 'py35'],
82 ],
83]
84
85/* Add the linkcheck job to our config list if we're on master */
86if (env.BRANCH_NAME == "master") {
87 configs.add(
88 [
89 label: 'docker',
90 imageName: 'pyca/cryptography-runner-ubuntu-rolling',
91 toxenvs: ['docs-linkcheck'],
92 ]
93 )
94}
95
96def downstreams = [
97 [
98 downstreamName: 'pyOpenSSL',
99 label: 'docker',
100 imageName: 'pyca/cryptography-runner-ubuntu-rolling',
101 script: """#!/bin/bash -xe
102 git clone --depth=1 https://github.com/pyca/pyopenssl.git pyopenssl
103 cd pyopenssl
104 virtualenv .venv
105 source .venv/bin/activate
106 pip install ../cryptography
107 pip install -e .
108 pip install pytest
109 pytest tests
110 """
111 ],
112 [
113 downstreamName: 'Twisted',
114 label: 'docker',
115 imageName: 'pyca/cryptography-runner-ubuntu-rolling',
116 script: """#!/bin/bash -xe
117 git clone --depth=1 https://github.com/twisted/twisted.git twisted
118 cd twisted
119 virtualenv .venv
120 source .venv/bin/activate
121 pip install ../cryptography
122 pip install pyopenssl service_identity pycrypto
123 pip install -e .
124 python -m twisted.trial src/twisted
125 """
126 ],
127 [
128 downstreamName: 'paramiko',
129 label: 'docker',
130 imageName: 'pyca/cryptography-runner-ubuntu-rolling',
131 script: """#!/bin/bash -xe
132 git clone --depth=1 https://github.com/paramiko/paramiko.git paramiko
133 cd paramiko
134 virtualenv .venv
135 source .venv/bin/activate
136 pip install ../cryptography
137 pip install -e .
138 pip install -r dev-requirements.txt
139 inv test
140 """
141 ],
142]
143
144def checkout_git(label) {
145 def script = ""
146 if (env.BRANCH_NAME.startsWith('PR-')) {
147 script = """
148 git clone --depth=1 https://github.com/pyca/cryptography.git cryptography
149 cd cryptography
150 git fetch origin +refs/pull/${env.CHANGE_ID}/merge:
151 git checkout -qf FETCH_HEAD
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700152 """
Paul Kehrera119d2e2017-05-23 22:02:50 -0700153 if (label.contains("windows")) {
154 bat script
155 } else {
156 sh """#!/bin/sh
157 set -xe
158 ${script}
159 """
160 }
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700161 } else {
Paul Kehrera119d2e2017-05-23 22:02:50 -0700162 checkout([
163 $class: 'GitSCM',
164 branches: [[name: "*/${env.BRANCH_NAME}"]],
165 doGenerateSubmoduleConfigurations: false,
166 extensions: [[
167 $class: 'RelativeTargetDirectory',
168 relativeTargetDir: 'cryptography'
169 ]],
170 submoduleCfg: [],
171 userRemoteConfigs: [[
172 'url': 'https://github.com/pyca/cryptography'
173 ]]
174 ])
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700175 }
176 if (label.contains("windows")) {
Paul Kehrera119d2e2017-05-23 22:02:50 -0700177 bat """
178 cd cryptography
179 git rev-parse HEAD
180 """
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700181 } else {
Paul Kehrera119d2e2017-05-23 22:02:50 -0700182 sh """
183 cd cryptography
184 git rev-parse HEAD
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700185 """
186 }
187}
Alex Gaynor40226372017-05-23 14:14:18 -0700188def build(toxenv, label, imageName, artifacts, artifactExcludes) {
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700189 try {
190 timeout(time: 30, unit: 'MINUTES') {
191
192 checkout_git(label)
193
194 withCredentials([string(credentialsId: 'cryptography-codecov-token', variable: 'CODECOV_TOKEN')]) {
195 withEnv(["LABEL=$label", "TOXENV=$toxenv", "IMAGE_NAME=$imageName"]) {
196 if (label.contains("windows")) {
197 def pythonPath = [
198 py26: "C:\\Python26\\python.exe",
199 py27: "C:\\Python27\\python.exe",
200 py33: "C:\\Python33\\python.exe",
201 py34: "C:\\Python34\\python.exe",
202 py35: "C:\\Python35\\python.exe",
203 py36: "C:\\Python36\\python.exe"
204 ]
205 if (toxenv == "py35" || toxenv == "py36") {
206 opensslPaths = [
207 "windows": [
208 "include": "C:\\OpenSSL-Win32-2015\\include",
209 "lib": "C:\\OpenSSL-Win32-2015\\lib"
210 ],
211 "windows64": [
212 "include": "C:\\OpenSSL-Win64-2015\\include",
213 "lib": "C:\\OpenSSL-Win64-2015\\lib"
214 ]
215 ]
216 } else {
217 opensslPaths = [
218 "windows": [
219 "include": "C:\\OpenSSL-Win32-2010\\include",
220 "lib": "C:\\OpenSSL-Win32-2010\\lib"
221 ],
222 "windows64": [
223 "include": "C:\\OpenSSL-Win64-2010\\include",
224 "lib": "C:\\OpenSSL-Win64-2010\\lib"
225 ]
226 ]
227 }
228 bat """
229 cd cryptography
230 @set PATH="C:\\Python27";"C:\\Python27\\Scripts";%PATH%
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700231 @set PYTHON="${pythonPath[toxenv]}"
232
233 @set INCLUDE="${opensslPaths[label]['include']}";%INCLUDE%
234 @set LIB="${opensslPaths[label]['lib']}";%LIB%
235 tox -r
236 IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL%
237 virtualenv .codecov
238 call .codecov/Scripts/activate
239 pip install codecov
240 codecov -e JOB_BASE_NAME,LABEL
241 """
242 } else if (label.contains("sierra") || label.contains("yosemite")) {
243 ansiColor {
244 sh """#!/usr/bin/env bash
245 set -xe
246 # Jenkins logs in as a non-interactive shell, so we don't even have /usr/local/bin in PATH
247 export PATH="/usr/local/bin:\${PATH}"
248 export PATH="/Users/jenkins/.pyenv/shims:\${PATH}"
249 cd cryptography
Paul Kehreradeaacf2017-05-24 12:49:18 -0700250 CRYPTOGRAPHY_SUPPRESS_LINK_FLAGS=1 \
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700251 LDFLAGS="/usr/local/opt/openssl\\@1.1/lib/libcrypto.a /usr/local/opt/openssl\\@1.1/lib/libssl.a" \
252 CFLAGS="-I/usr/local/opt/openssl\\@1.1/include -Werror -Wno-error=deprecated-declarations -Wno-error=incompatible-pointer-types -Wno-error=unused-function -Wno-error=unused-command-line-argument" \
253 tox -r -- --color=yes
254 virtualenv .venv
255 source .venv/bin/activate
256 pip install coverage
257 bash <(curl -s https://codecov.io/bash) -e JOB_BASE_NAME,LABEL
258 """
259 }
260 } else {
261 ansiColor {
262 sh """#!/usr/bin/env bash
263 set -xe
264 cd cryptography
265 if [[ "\${IMAGE_NAME}" == *"libressl"* ]]; then
266 LD_LIBRARY_PATH="/usr/local/libressl/lib:\$LD_LIBRARY_PATH" \
267 LDFLAGS="-L/usr/local/libressl/lib" \
268 CFLAGS="-I/usr/local/libressl/include" \
269 tox -r -- --color=yes
270 else
271 tox -r -- --color=yes
272 fi
273 virtualenv .venv
274 source .venv/bin/activate
275 pip install coverage
276 bash <(curl -s https://codecov.io/bash) -e JOB_BASE_NAME,LABEL
277 """
278 }
Alex Gaynor40226372017-05-23 14:14:18 -0700279 if (artifacts) {
280 archiveArtifacts artifacts: artifacts, excludes: artifactExcludes
281 }
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700282 }
283 }
284 }
285 }
286 } finally {
287 deleteDir()
288 }
289
290}
291
292def builders = [:]
293for (config in configs) {
294 def label = config["label"]
295 def toxenvs = config["toxenvs"]
Alex Gaynor40226372017-05-23 14:14:18 -0700296 def artifacts = config["artifacts"]
297 def artifactExcludes = config["artifactExcludes"]
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700298
299 for (_toxenv in toxenvs) {
300 def toxenv = _toxenv
301
302 if (label.contains("docker")) {
303 def imageName = config["imageName"]
304 def combinedName = "${imageName}-${toxenv}"
305 builders[combinedName] = {
306 node(label) {
307 stage(combinedName) {
308 docker.image(imageName).inside {
Alex Gaynor40226372017-05-23 14:14:18 -0700309 build(toxenv, label, imageName, artifacts, artifactExcludes)
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700310 }
311 }
312 }
313 }
314 } else {
315 def combinedName = "${label}-${toxenv}"
316 builders[combinedName] = {
317 node(label) {
318 stage(combinedName) {
Alex Gaynor40226372017-05-23 14:14:18 -0700319 build(toxenv, label, '', null, null)
Paul Kehrerba58e1f2017-05-22 18:08:29 -0700320 }
321 }
322 }
323 }
324 }
325}
326
327/* Add the python setup.py test builder */
328builders["setup.py-test"] = {
329 node("docker") {
330 stage("python setup.py test") {
331 docker.image("pyca/cryptography-runner-ubuntu-rolling").inside {
332 try {
333 checkout_git("docker")
334 sh """#!/usr/bin/env bash
335 set -xe
336 cd cryptography
337 virtualenv .venv
338 source .venv/bin/activate
339 python setup.py test
340 """
341 } finally {
342 deleteDir()
343 }
344
345 }
346 }
347 }
348}
349
350parallel builders
351
352def downstreamBuilders = [:]
353for (downstream in downstreams) {
354 def downstreamName = downstream["downstreamName"]
355 def imageName = downstream["imageName"]
356 def label = downstream["label"]
357 def script = downstream["script"]
358 downstreamBuilders[downstreamName] = {
359 node(label) {
360 docker.image(imageName).inside {
361 try {
362 timeout(time: 30, unit: 'MINUTES') {
363 checkout_git(label)
364 sh script
365 }
366 } finally {
367 deleteDir()
368 }
369 }
370 }
371 }
372}
373
374stage("Downstreams") {
375 parallel downstreamBuilders
376}