Advertisement
Guest User

Untitled

a guest
Jul 13th, 2018
689
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.68 KB | None | 0 0
  1. pipeline {
  2. agent any
  3. // Configuraiton for the variables used for this specific repo
  4. environment {
  5. EXT_RELEASE_TYPE = 'github_stable'
  6. EXT_GIT_BRANCH = 'master'
  7. EXT_USER = 'snipe'
  8. EXT_REPO = 'snipe-it'
  9. EXT_NPM = 'none'
  10. EXT_PIP = 'none'
  11. EXT_BLOB = 'none'
  12. JSON_URL = 'none'
  13. JSON_PATH = 'none'
  14. BUILD_VERSION_ARG = 'SNIPEIT_RELEASE'
  15. LS_USER = 'thelamer'
  16. LS_REPO = 'docker-snipe-it'
  17. DOCKERHUB_IMAGE = 'lspipelive/snipe-it'
  18. DEV_DOCKERHUB_IMAGE = 'lspipetest/snipe-it'
  19. PR_DOCKERHUB_IMAGE = 'lspipepr/snipe-it'
  20. BUILDS_DISCORD = credentials('build_webhook_url')
  21. GITHUB_TOKEN = credentials('github_token')
  22. DIST_IMAGE = 'alpine'
  23. DIST_TAG = '3.7'
  24. DIST_PACKAGES = 'curl \
  25. libxml2 \
  26. php7-bcmath \
  27. php7-ctype \
  28. php7-curl \
  29. php7-gd \
  30. php7-ldap \
  31. php7-mbstring \
  32. php7-mcrypt \
  33. php7-phar \
  34. php7-pdo_mysql \
  35. php7-pdo_sqlite \
  36. php7-sqlite3 \
  37. php7-tokenizer \
  38. php7-xml \
  39. php7-xmlreader \
  40. php7-zip \
  41. tar \
  42. unzip'
  43. DIST_REPO = 'none'
  44. DIST_REPO_PACKAGES = 'none'
  45. MULTIARCH='true'
  46. CI='true'
  47. CI_PORT='80'
  48. CI_SSL='false'
  49. CI_DELAY='5'
  50. CI_DOCKERENV='APP_URL=_|DB_CONNECTION=sqlite_testing'
  51. CI_AUTH='user:password'
  52. CI_WEBPATH=''
  53. CI_URL='none'
  54. }
  55. stages {
  56. // Setup all the basic environment variables needed for the build
  57. stage("Set ENV Variables base"){
  58. steps{
  59. script{
  60. env.LS_RELEASE = sh(
  61. script: '''curl -s https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases/latest | jq -r '. | .tag_name' ''',
  62. returnStdout: true).trim()
  63. env.LS_RELEASE_NOTES = sh(
  64. script: '''git log -1 --pretty=%B | sed -E ':a;N;$!ba;s/\\r{0,1}\\n/\\\\n/g' ''',
  65. returnStdout: true).trim()
  66. env.GITHUB_DATE = sh(
  67. script: '''date '+%Y-%m-%dT%H:%M:%S%:z' ''',
  68. returnStdout: true).trim()
  69. env.COMMIT_SHA = sh(
  70. script: '''git rev-parse HEAD''',
  71. returnStdout: true).trim()
  72. env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/commit/' + env.GIT_COMMIT
  73. env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DOCKERHUB_IMAGE + '/tags/'
  74. env.PULL_REQUEST = env.CHANGE_ID
  75. }
  76. script{
  77. env.LS_RELEASE_NUMBER = sh(
  78. script: '''echo ${LS_RELEASE} |sed 's/^.*-ls//g' ''',
  79. returnStdout: true).trim()
  80. }
  81. script{
  82. env.LS_TAG_NUMBER = sh(
  83. script: '''#! /bin/bash
  84. tagsha=$(git rev-list -n 1 ${LS_RELEASE} 2>/dev/null)
  85. if [ "${tagsha}" == "${COMMIT_SHA}" ]; then
  86. echo ${LS_RELEASE_NUMBER}
  87. elif [ -z "${GIT_COMMIT}" ]; then
  88. echo ${LS_RELEASE_NUMBER}
  89. else
  90. echo $((${LS_RELEASE_NUMBER} + 1))
  91. fi''',
  92. returnStdout: true).trim()
  93. }
  94. }
  95. }
  96. /* #######################
  97. Package Version Tagging
  98. ####################### */
  99. // If this is an alpine base image determine the base package tag to use
  100. stage("Set Package tag Alpine"){
  101. when {
  102. environment name: 'DIST_IMAGE', value: 'alpine'
  103. not {environment name: 'DIST_PACKAGES', value: 'none'}
  104. }
  105. steps{
  106. sh '''docker pull alpine:${DIST_TAG}'''
  107. script{
  108. env.PACKAGE_TAG = sh(
  109. script: '''docker run --rm alpine:${DIST_TAG} sh -c 'apk update --quiet\
  110. && apk info '"${DIST_PACKAGES}"' | md5sum | cut -c1-8' ''',
  111. returnStdout: true).trim()
  112. }
  113. }
  114. }
  115. // If this is an ubuntu base image determine the base package tag to use
  116. stage("Set Package tag Ubuntu"){
  117. when {
  118. environment name: 'DIST_IMAGE', value: 'ubuntu'
  119. not {environment name: 'DIST_PACKAGES', value: 'none'}
  120. }
  121. steps{
  122. sh '''docker pull ubuntu:${DIST_TAG}'''
  123. script{
  124. env.PACKAGE_TAG = sh(
  125. script: '''docker run --rm ubuntu:${DIST_TAG} sh -c\
  126. 'apt-get --allow-unauthenticated update -qq >/dev/null 2>&1 &&\
  127. apt-cache --no-all-versions show '"${DIST_PACKAGES}"' | md5sum | cut -c1-8' ''',
  128. returnStdout: true).trim()
  129. }
  130. }
  131. }
  132. // If there are no base packages to tag in this build config set to none
  133. stage("Set Package tag none"){
  134. when {
  135. environment name: 'DIST_PACKAGES', value: 'none'
  136. }
  137. steps{
  138. script{
  139. env.PACKAGE_TAG = sh(
  140. script: '''echo none''',
  141. returnStdout: true).trim()
  142. }
  143. }
  144. }
  145. /* ########################
  146. External Release Tagging
  147. ######################## */
  148. // If this is a stable github release use the latest endpoint from github to determine the ext tag
  149. stage("Set ENV github_stable"){
  150. when {
  151. environment name: 'EXT_RELEASE_TYPE', value: 'github_stable'
  152. }
  153. steps{
  154. script{
  155. env.EXT_RELEASE = sh(
  156. script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq -r '. | .tag_name' ''',
  157. returnStdout: true).trim()
  158. }
  159. }
  160. }
  161. // If this is an os release set release type to none to indicate no external release
  162. stage("Set ENV os"){
  163. when {
  164. environment name: 'EXT_RELEASE_TYPE', value: 'os'
  165. }
  166. steps{
  167. script{
  168. env.EXT_RELEASE = env.PACKAGE_TAG
  169. env.RELEASE_LINK = 'none'
  170. }
  171. }
  172. }
  173. // If this is a stable or devel github release generate the link for the build message
  174. stage("Set ENV github_link"){
  175. when {
  176. anyOf {
  177. environment name: 'EXT_RELEASE_TYPE', value: 'github_stable'
  178. environment name: 'EXT_RELEASE_TYPE', value: 'github_devel'
  179. }
  180. }
  181. steps{
  182. script{
  183. env.RELEASE_LINK = 'https://github.com/' + env.EXT_USER + '/' + env.EXT_REPO + '/releases/tag/' + env.EXT_RELEASE
  184. }
  185. }
  186. }
  187. // If this is a deb repo release calculate a hash for the package version
  188. stage("Set EXT tag deb repo"){
  189. when {
  190. environment name: 'EXT_RELEASE_TYPE', value: 'deb_repo'
  191. }
  192. steps{
  193. sh '''docker pull ${DIST_IMAGE}:${DIST_TAG}'''
  194. script{
  195. env.EXT_RELEASE = sh(
  196. script: '''docker run --rm ${DIST_IMAGE}:${DIST_TAG} bash -c\
  197. 'echo -e "'"${DIST_REPO}"'" > /etc/apt/sources.list.d/check.list \
  198. && apt-get --allow-unauthenticated update -qq >/dev/null 2>&1\
  199. && apt-cache --no-all-versions show '"${DIST_REPO_PACKAGES}"' | md5sum | cut -c1-8' ''',
  200. returnStdout: true).trim()
  201. env.RELEASE_LINK = 'deb_repo'
  202. }
  203. }
  204. }
  205. // If this is an alpine repo change for external version determine an md5 from the version string
  206. stage("Set tag Alpine Repo"){
  207. when {
  208. environment name: 'EXT_RELEASE_TYPE', value: 'alpine_repo'
  209. }
  210. steps{
  211. sh '''docker pull alpine:${DIST_TAG}'''
  212. script{
  213. env.EXT_RELEASE = sh(
  214. script: '''docker run --rm alpine:${DIST_TAG} sh -c 'apk update --quiet --repository '"${DIST_REPO}"'\
  215. && apk info --repository '"${DIST_REPO}"' '"${DIST_REPO_PACKAGES}"' | md5sum | cut -c1-8' ''',
  216. returnStdout: true).trim()
  217. env.RELEASE_LINK = 'alpine_repo'
  218. }
  219. }
  220. }
  221. // If this is a github commit trigger determine the current commit at head
  222. stage("Set ENV github_commit"){
  223. when {
  224. environment name: 'EXT_RELEASE_TYPE', value: 'github_commit'
  225. }
  226. steps{
  227. script{
  228. env.EXT_RELEASE = sh(
  229. script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_GIT_BRANCH} | jq -r '. | .sha' | cut -c1-8 ''',
  230. returnStdout: true).trim()
  231. }
  232. }
  233. }
  234. // If this is a github commit trigger Set the external release link
  235. stage("Set ENV commit_link"){
  236. when {
  237. environment name: 'EXT_RELEASE_TYPE', value: 'github_commit'
  238. }
  239. steps{
  240. script{
  241. env.RELEASE_LINK = 'https://github.com/' + env.EXT_USER + '/' + env.EXT_REPO + '/commit/' + env.EXT_RELEASE
  242. }
  243. }
  244. }
  245. // If this is a github tag trigger determine the current tag
  246. stage("Set ENV github_tag"){
  247. when {
  248. environment name: 'EXT_RELEASE_TYPE', value: 'github_tag'
  249. }
  250. steps{
  251. script{
  252. env.EXT_RELEASE = sh(
  253. script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/tags | jq -r '.[0] | .name' ''',
  254. returnStdout: true).trim()
  255. env.EXT_COMMIT_URL = sh(
  256. script: '''curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/tags | jq -r '.[0] | .commit.url' ''',
  257. returnStdout: true).trim()
  258. }
  259. }
  260. }
  261. // If this is a github tag trigger Set the external release link
  262. stage("Set ENV tag_link"){
  263. when {
  264. environment name: 'EXT_RELEASE_TYPE', value: 'github_tag'
  265. }
  266. steps{
  267. script{
  268. env.RELEASE_LINK = 'https://github.com/' + env.EXT_USER + '/' + env.EXT_REPO + '/releases/tag/' + env.EXT_RELEASE
  269. }
  270. }
  271. }
  272. // If this is a npm version change set the external release verison and link
  273. stage("Set ENV npm_version"){
  274. when {
  275. environment name: 'EXT_RELEASE_TYPE', value: 'npm_version'
  276. }
  277. steps{
  278. script{
  279. env.EXT_RELEASE = sh(
  280. script: '''curl -s https://skimdb.npmjs.com/registry/${EXT_NPM} |jq -r '. | .["dist-tags"].latest' ''',
  281. returnStdout: true).trim()
  282. env.RELEASE_LINK = 'https://www.npmjs.com/package/' + env.EXT_NPM
  283. }
  284. }
  285. }
  286. // If this is a pip version change set the external release verison and link
  287. stage("Set ENV pip_version"){
  288. when {
  289. environment name: 'EXT_RELEASE_TYPE', value: 'pip_version'
  290. }
  291. steps{
  292. script{
  293. env.EXT_RELEASE = sh(
  294. script: '''curl -s https://pypi.python.org/pypi/${EXT_PIP}/json |jq -r '. | .info.version' ''',
  295. returnStdout: true).trim()
  296. env.RELEASE_LINK = 'https://pypi.python.org/pypi/' + env.EXT_PIP
  297. }
  298. }
  299. }
  300. // If this is a File blob set the ext version based on the remote files md5
  301. stage("Set ENV external_blob"){
  302. when {
  303. environment name: 'EXT_RELEASE_TYPE', value: 'external_blob'
  304. }
  305. steps{
  306. script{
  307. env.EXT_RELEASE = sh(
  308. script: '''#! /bin/bash
  309. if [ $(curl -I -sL -w "%{http_code}" ${EXT_BLOB} -o /dev/null) == 200 ]; then
  310. curl -s -L ${EXT_BLOB} | md5sum | cut -c1-8
  311. else
  312. exit 1
  313. fi''',
  314. returnStdout: true).trim()
  315. env.RELEASE_LINK = 'Remote_Blob_Change'
  316. }
  317. }
  318. }
  319. // If this is a custom json endpoint parse the return to get external tag
  320. stage("Set ENV custom_json"){
  321. when {
  322. environment name: 'EXT_RELEASE_TYPE', value: 'custom_json'
  323. }
  324. steps{
  325. script{
  326. env.EXT_RELEASE = sh(
  327. script: '''curl -s ${JSON_URL} | jq -r ". | ${JSON_PATH}" ''',
  328. returnStdout: true).trim()
  329. env.RELEASE_LINK = env.JSON_URL
  330. }
  331. }
  332. }
  333. /* ###############
  334. Build Container
  335. ############### */
  336. // Build Docker container for push to LS Repo
  337. stage('Build-Single') {
  338. when {
  339. environment name: 'MULTIARCH', value: 'false'
  340. }
  341. steps {
  342. sh "docker build --no-cache -t ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} \
  343. --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
  344. script{
  345. env.CI_IMAGE = env.DOCKERHUB_IMAGE
  346. env.CI_TAGS = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER
  347. env.CI_META_TAG = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER
  348. }
  349. }
  350. }
  351. // Build MultiArch Docker container for push to LS Repo
  352. stage('Build-Multi') {
  353. when {
  354. environment name: 'MULTIARCH', value: 'true'
  355. }
  356. steps {
  357. sh "docker build --no-cache -f Dockerfile.amd64 -t ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} \
  358. --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
  359. sh "docker build --no-cache -f Dockerfile.armhf -t ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} \
  360. --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
  361. sh "docker build --no-cache -f Dockerfile.aarch64 -t ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} \
  362. --build-arg ${BUILD_VERSION_ARG}=${EXT_RELEASE} --build-arg VERSION=\"${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}\" --build-arg BUILD_DATE=${GITHUB_DATE} ."
  363. script{
  364. env.CI_IMAGE = env.DOCKERHUB_IMAGE
  365. env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm32v6-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER + '|arm64v8-' + env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER
  366. env.CI_META_TAG = env.EXT_RELEASE + '-ls' + env.LS_TAG_NUMBER
  367. }
  368. }
  369. }
  370. // Tag to the Dev user dockerhub endpoint when this is a non master branch
  371. stage('Docker-Tag-Dev-Single') {
  372. when {
  373. not {branch "master"}
  374. environment name: 'CHANGE_ID', value: ''
  375. environment name: 'MULTIARCH', value: 'false'
  376. }
  377. steps {
  378. sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:latest"
  379. sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  380. script{
  381. env.CI_IMAGE = env.DEV_DOCKERHUB_IMAGE
  382. env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
  383. env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
  384. }
  385. }
  386. }
  387. // Tag to the Dev user dockerhub endpoint when this is a non master branch
  388. stage('Docker-Tag-Dev-Multi') {
  389. when {
  390. not {branch "master"}
  391. environment name: 'CHANGE_ID', value: ''
  392. environment name: 'MULTIARCH', value: 'true'
  393. }
  394. steps {
  395. sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:amd64-latest"
  396. sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest"
  397. sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest"
  398. sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  399. sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  400. sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  401. script{
  402. env.CI_IMAGE = env.DEV_DOCKERHUB_IMAGE
  403. env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
  404. env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-dev-' + env.COMMIT_SHA
  405. }
  406. }
  407. }
  408. // Tag to PR user dockerhub endpoint when this is a pull request
  409. stage('Docker-Tag-PR-Single') {
  410. when {
  411. not {environment name: 'CHANGE_ID', value: ''}
  412. environment name: 'MULTIARCH', value: 'false'
  413. }
  414. steps {
  415. sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:latest"
  416. sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  417. script{
  418. env.CI_IMAGE = env.PR_DOCKERHUB_IMAGE
  419. env.CI_TAGS = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
  420. env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
  421. }
  422. }
  423. }
  424. // Tag to PR user dockerhub endpoint when this is a pull request
  425. stage('Docker-Tag-PR-Multi') {
  426. when {
  427. not {environment name: 'CHANGE_ID', value: ''}
  428. environment name: 'MULTIARCH', value: 'true'
  429. }
  430. steps {
  431. sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:amd64-latest"
  432. sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm32v6-latest"
  433. sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm64v8-latest"
  434. sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  435. sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  436. sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  437. script{
  438. env.CI_IMAGE = env.PR_DOCKERHUB_IMAGE
  439. env.CI_TAGS = 'amd64-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm32v6-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST + '|arm64v8-' + env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
  440. env.CI_META_TAG = env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-pr-' + env.PULL_REQUEST
  441. }
  442. }
  443. }
  444. /* #######
  445. Testing
  446. ####### */
  447. // Run Container tests
  448. stage('Test') {
  449. when {
  450. environment name: 'CI', value: 'true'
  451. }
  452. steps {
  453. withCredentials([
  454. string(credentialsId: 'spaces-key', variable: 'DO_KEY'),
  455. string(credentialsId: 'spaces-secret', variable: 'DO_SECRET')
  456. ]) {
  457. sh "docker pull lsiodev/ci:latest"
  458. sh '''docker run --rm -i \
  459. -v /var/run/docker.sock:/var/run/docker.sock \
  460. -e IMAGE="${CI_IMAGE}" \
  461. -e DELAY_START="${CI_DELAY} \
  462. -e TAGS="${CI_TAGS}" \
  463. -e META_TAG="${CI_META_TAG} \
  464. -e PORT="${CI_PORT}" \
  465. -e SSL="${CI_SSL}" \
  466. -e BASE="${DIST_IMAGE}" \
  467. -e SECRET_KEY="${DO_SECRET}" \
  468. -e ACCESS_KEY="${DO_KEY}" \
  469. -e DOCKER_ENV="${CI_DOCKERENV}" \
  470. -e WEB_AUTH="${CI_AUTH}" \
  471. -e WEB_PATH="${CI_WEBPATH}" \
  472. -e DO_REGION="ams3" \
  473. -e DO_BUCKET="lsio-ci" \
  474. -t lsiodev/ci:latest \
  475. python /ci/ci.py'''
  476. script{
  477. env.CI_URL = 'https://lsio-ci.ams3.digitaloceanspaces.com/' + env.CI_IMAGE + '/' + env.CI_META_TAG + '/index.html'
  478. }
  479. }
  480. }
  481. }
  482. /* ##################
  483. Live Release Logic
  484. ################## */
  485. // If this is a public release push this to the live repo triggered by an external repo update or LS repo update on master
  486. stage('Docker-Push-Release-Single') {
  487. when {
  488. branch "master"
  489. environment name: 'MULTIARCH', value: 'false'
  490. expression {
  491. env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER
  492. }
  493. }
  494. steps {
  495. withCredentials([
  496. [
  497. $class: 'UsernamePasswordMultiBinding',
  498. credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6',
  499. usernameVariable: 'DOCKERUSER',
  500. passwordVariable: 'DOCKERPASS'
  501. ]
  502. ]) {
  503. echo 'Logging into DockerHub'
  504. sh '''#! /bin/bash
  505. echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
  506. '''
  507. sh "docker tag ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:latest"
  508. sh "docker push ${DOCKERHUB_IMAGE}:latest"
  509. sh "docker push ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER}"
  510. }
  511. }
  512. }
  513. // If this is a public release push this to the live repo triggered by an external repo update or LS repo update on master
  514. stage('Docker-Push-Release-Multi') {
  515. when {
  516. branch "master"
  517. environment name: 'MULTIARCH', value: 'true'
  518. expression {
  519. env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER
  520. }
  521. }
  522. steps {
  523. withCredentials([
  524. [
  525. $class: 'UsernamePasswordMultiBinding',
  526. credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6',
  527. usernameVariable: 'DOCKERUSER',
  528. passwordVariable: 'DOCKERPASS'
  529. ]
  530. ]) {
  531. sh '''#! /bin/bash
  532. echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
  533. '''
  534. sh "docker tag ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:amd64-latest"
  535. sh "docker tag ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm32v6-latest"
  536. sh "docker tag ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm64v8-latest"
  537. sh "docker push ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER}"
  538. sh "docker push ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER}"
  539. sh "docker push ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER}"
  540. sh "docker push ${DOCKERHUB_IMAGE}:amd64-latest"
  541. sh "docker push ${DOCKERHUB_IMAGE}:arm32v6-latest"
  542. sh "docker push ${DOCKERHUB_IMAGE}:arm64v8-latest"
  543. sh "docker manifest create ${DOCKERHUB_IMAGE}:latest ${DOCKERHUB_IMAGE}:amd64-latest ${DOCKERHUB_IMAGE}:arm32v6-latest ${DOCKERHUB_IMAGE}:arm64v8-latest"
  544. sh "docker manifest annotate ${DOCKERHUB_IMAGE}:latest ${DOCKERHUB_IMAGE}:arm32v6-latest --os linux --arch arm"
  545. sh "docker manifest annotate ${DOCKERHUB_IMAGE}:latest ${DOCKERHUB_IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8"
  546. sh "docker manifest create ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER}"
  547. sh "docker manifest annotate ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-ls${LS_TAG_NUMBER} --os linux --arch arm"
  548. sh "docker manifest annotate ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER} ${DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-ls${LS_TAG_NUMBER} --os linux --arch arm64 --variant armv8"
  549. sh "docker manifest push --purge ${DOCKERHUB_IMAGE}:latest"
  550. sh "docker manifest push --purge ${DOCKERHUB_IMAGE}:${EXT_RELEASE}-ls${LS_TAG_NUMBER}"
  551. }
  552. }
  553. }
  554. // If this is a public release tag it in the LS Github and push a changelog from external repo and our internal one
  555. stage('Github-Tag-Push-Release') {
  556. when {
  557. branch "master"
  558. expression {
  559. env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER
  560. }
  561. environment name: 'CHANGE_ID', value: ''
  562. }
  563. steps {
  564. echo "Pushing New tag for current commit ${EXT_RELEASE}-pkg-${PACKAGE_TAG}-ls${LS_TAG_NUMBER}"
  565. sh '''curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/git/tags \
  566. -d '{"tag":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  567. "object": "'${COMMIT_SHA}'",\
  568. "message": "Tagging Release '${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}' to master",\
  569. "type": "commit",\
  570. "tagger": {"name": "LinuxServer Jenkins","email": "jenkins@linuxserver.io","date": "'${GITHUB_DATE}'"}}' '''
  571. echo "Pushing New release for Tag"
  572. sh '''#! /bin/bash
  573. if [ ${EXT_RELEASE_TYPE} == 'github_stable' ] || [ ${EXT_RELEASE_TYPE} == 'github_devel' ]; then
  574. curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/releases/latest | jq '. |.body' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json
  575. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  576. "target_commitish": "master",\
  577. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  578. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start
  579. # Grabbing the current release body from external repo
  580. elif [ ${EXT_RELEASE_TYPE} == 'github_commit' ]; then
  581. curl -s https://api.github.com/repos/${EXT_USER}/${EXT_REPO}/commits/${EXT_GIT_BRANCH} | jq '. | .commit.message' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json
  582. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  583. "target_commitish": "master",\
  584. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  585. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start
  586. elif [ ${EXT_RELEASE_TYPE} == 'github_tag' ]; then
  587. curl -s ${EXT_COMMIT_URL} | jq '. | .commit.message' | sed 's:^.\\(.*\\).$:\\1:' > releasebody.json
  588. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  589. "target_commitish": "master",\
  590. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  591. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**'${EXT_REPO}' Changes:**\\n\\n' > start
  592. elif [ ${EXT_RELEASE_TYPE} == 'os' ]; then
  593. echo "Updating base packages to ${PACKAGE_TAG}" > releasebody.json
  594. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  595. "target_commitish": "master",\
  596. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  597. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**OS Changes:**\\n\\n' > start
  598. elif [ ${EXT_RELEASE_TYPE} == 'deb_repo' ] || [ ${EXT_RELEASE_TYPE} == 'alpine_repo' ]; then
  599. echo "Updating external repo packages to ${EXT_RELEASE}" > releasebody.json
  600. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  601. "target_commitish": "master",\
  602. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  603. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Repo Changes:**\\n\\n' > start
  604. elif [ ${EXT_RELEASE_TYPE} == 'npm_version' ]; then
  605. echo "Updating NPM version of ${EXT_NPM} to ${EXT_RELEASE}" > releasebody.json
  606. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  607. "target_commitish": "master",\
  608. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  609. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**NPM Changes:**\\n\\n' > start
  610. elif [ ${EXT_RELEASE_TYPE} == 'pip_version' ]; then
  611. echo "Updating PIP version of ${EXT_PIP} to ${EXT_RELEASE}" > releasebody.json
  612. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  613. "target_commitish": "master",\
  614. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  615. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**PIP Changes:**\\n\\n' > start
  616. elif [ ${EXT_RELEASE_TYPE} == 'external_blob' ]; then
  617. echo "External Release file changed at ${EXT_BLOB}" > releasebody.json
  618. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  619. "target_commitish": "master",\
  620. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  621. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Remote Changes:**\\n\\n' > start
  622. elif [ ${EXT_RELEASE_TYPE} == 'custom_json' ]; then
  623. echo "Data change at JSON endpoint ${JSON_URL}" > releasebody.json
  624. echo '{"tag_name":"'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  625. "target_commitish": "master",\
  626. "name": "'${EXT_RELEASE}'-pkg-'${PACKAGE_TAG}'-ls'${LS_TAG_NUMBER}'",\
  627. "body": "**LinuxServer Changes:**\\n\\n'${LS_RELEASE_NOTES}'\\n**Remote Changes:**\\n\\n' > start
  628. fi
  629. printf '","draft": false,"prerelease": false}' >> releasebody.json
  630. paste -d'\\0' start releasebody.json > releasebody.json.done
  631. curl -H "Authorization: token ${GITHUB_TOKEN}" -X POST https://api.github.com/repos/${LS_USER}/${LS_REPO}/releases -d @releasebody.json.done'''
  632. }
  633. }
  634. // Use helper container to push the current README in master to the DockerHub Repo
  635. stage('Sync-README') {
  636. when {
  637. branch "master"
  638. expression {
  639. env.LS_RELEASE != env.EXT_RELEASE + '-pkg-' + env.PACKAGE_TAG + '-ls' + env.LS_TAG_NUMBER
  640. }
  641. }
  642. steps {
  643. withCredentials([
  644. [
  645. $class: 'UsernamePasswordMultiBinding',
  646. credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6',
  647. usernameVariable: 'DOCKERUSER',
  648. passwordVariable: 'DOCKERPASS'
  649. ]
  650. ]) {
  651. sh '''#! /bin/bash
  652. docker pull lsiodev/readme-sync
  653. docker run --rm=true \
  654. -e DOCKERHUB_USERNAME=$DOCKERUSER \
  655. -e DOCKERHUB_PASSWORD=$DOCKERPASS \
  656. -e GIT_REPOSITORY=${LS_USER}/${LS_REPO} \
  657. -e DOCKER_REPOSITORY=${DOCKERHUB_IMAGE} \
  658. -e GIT_BRANCH=master \
  659. lsiodev/readme-sync bash -c 'node sync' '''
  660. }
  661. }
  662. }
  663. /* #################
  664. Dev Release Logic
  665. ################# */
  666. // Push to the Dev user dockerhub endpoint when this is a non master branch
  667. stage('Docker-Push-Dev-Single') {
  668. when {
  669. not {branch "master"}
  670. environment name: 'CHANGE_ID', value: ''
  671. environment name: 'MULTIARCH', value: 'false'
  672. }
  673. steps {
  674. withCredentials([
  675. [
  676. $class: 'UsernamePasswordMultiBinding',
  677. credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6',
  678. usernameVariable: 'DOCKERUSER',
  679. passwordVariable: 'DOCKERPASS'
  680. ]
  681. ]) {
  682. sh '''#! /bin/bash
  683. echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
  684. '''
  685. sh "docker push ${DEV_DOCKERHUB_IMAGE}:latest"
  686. sh "docker push ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  687. }
  688. script{
  689. env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/'
  690. }
  691. }
  692. }
  693. // Push to the Dev user dockerhub endpoint when this is a non master branch
  694. stage('Docker-Push-Dev-Multi') {
  695. when {
  696. not {branch "master"}
  697. environment name: 'CHANGE_ID', value: ''
  698. environment name: 'MULTIARCH', value: 'true'
  699. }
  700. steps {
  701. withCredentials([
  702. [
  703. $class: 'UsernamePasswordMultiBinding',
  704. credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6',
  705. usernameVariable: 'DOCKERUSER',
  706. passwordVariable: 'DOCKERPASS'
  707. ]
  708. ]) {
  709. sh '''#! /bin/bash
  710. echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
  711. '''
  712. sh "docker push ${DEV_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  713. sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  714. sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  715. sh "docker push ${DEV_DOCKERHUB_IMAGE}:amd64-latest"
  716. sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest"
  717. sh "docker push ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest"
  718. sh "docker manifest create ${DEV_DOCKERHUB_IMAGE}:latest ${DEV_DOCKERHUB_IMAGE}:amd64-latest ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest"
  719. sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:latest ${DEV_DOCKERHUB_IMAGE}:arm32v6-latest --os linux --arch arm"
  720. sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:latest ${DEV_DOCKERHUB_IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8"
  721. sh "docker manifest create ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  722. sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} --os linux --arch arm"
  723. sh "docker manifest annotate ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} ${DEV_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA} --os linux --arch arm64 --variant armv8"
  724. sh "docker manifest push --purge ${DEV_DOCKERHUB_IMAGE}:latest"
  725. sh "docker manifest push --purge ${DEV_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-dev-${COMMIT_SHA}"
  726. }
  727. script{
  728. env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.DEV_DOCKERHUB_IMAGE + '/tags/'
  729. }
  730. }
  731. }
  732. /* ################
  733. PR Release Logic
  734. ################ */
  735. // Push to PR user dockerhub endpoint when this is a pull request
  736. stage('Docker-Push-PR-Single') {
  737. when {
  738. not {environment name: 'CHANGE_ID', value: ''}
  739. environment name: 'MULTIARCH', value: 'false'
  740. }
  741. steps {
  742. withCredentials([
  743. [
  744. $class: 'UsernamePasswordMultiBinding',
  745. credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6',
  746. usernameVariable: 'DOCKERUSER',
  747. passwordVariable: 'DOCKERPASS'
  748. ]
  749. ]) {
  750. sh '''#! /bin/bash
  751. echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
  752. '''
  753. sh "docker push ${PR_DOCKERHUB_IMAGE}:latest"
  754. sh "docker push ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  755. }
  756. script{
  757. env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST
  758. env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/'
  759. }
  760. }
  761. }
  762. // Push to PR user dockerhub endpoint when this is a pull request
  763. stage('Docker-Push-PR-Multi') {
  764. when {
  765. not {environment name: 'CHANGE_ID', value: ''}
  766. environment name: 'MULTIARCH', value: 'true'
  767. }
  768. steps {
  769. withCredentials([
  770. [
  771. $class: 'UsernamePasswordMultiBinding',
  772. credentialsId: 'c1701109-4bdc-4a9c-b3ea-480bec9a2ca6',
  773. usernameVariable: 'DOCKERUSER',
  774. passwordVariable: 'DOCKERPASS'
  775. ]
  776. ]) {
  777. sh '''#! /bin/bash
  778. echo $DOCKERPASS | docker login -u $DOCKERUSER --password-stdin
  779. '''
  780. sh "docker push ${PR_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  781. sh "docker push ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  782. sh "docker push ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  783. sh "docker push ${PR_DOCKERHUB_IMAGE}:amd64-latest"
  784. sh "docker push ${PR_DOCKERHUB_IMAGE}:arm32v6-latest"
  785. sh "docker push ${PR_DOCKERHUB_IMAGE}:arm64v8-latest"
  786. sh "docker manifest create ${PR_DOCKERHUB_IMAGE}:latest ${PR_DOCKERHUB_IMAGE}:amd64-latest ${PR_DOCKERHUB_IMAGE}:arm32v6-latest ${PR_DOCKERHUB_IMAGE}:arm64v8-latest"
  787. sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:latest ${PR_DOCKERHUB_IMAGE}:arm32v6-latest --os linux --arch arm"
  788. sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:latest ${PR_DOCKERHUB_IMAGE}:arm64v8-latest --os linux --arch arm64 --variant armv8"
  789. sh "docker manifest create ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:amd64-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  790. sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm32v6-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} --os linux --arch arm"
  791. sh "docker manifest annotate ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} ${PR_DOCKERHUB_IMAGE}:arm64v8-${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST} --os linux --arch arm64 --variant armv8"
  792. sh "docker manifest push --purge ${PR_DOCKERHUB_IMAGE}:latest"
  793. sh "docker manifest push --purge ${PR_DOCKERHUB_IMAGE}:${EXT_RELEASE}-pkg-${PACKAGE_TAG}-pr-${PULL_REQUEST}"
  794. }
  795. script{
  796. env.CODE_URL = 'https://github.com/' + env.LS_USER + '/' + env.LS_REPO + '/pull/' + env.PULL_REQUEST
  797. env.DOCKERHUB_LINK = 'https://hub.docker.com/r/' + env.PR_DOCKERHUB_IMAGE + '/tags/'
  798. }
  799. }
  800. }
  801. }
  802. /* ######################
  803. Send status to Discord
  804. ###################### */
  805. post {
  806. success {
  807. sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 1681177,\
  808. "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** Success\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
  809. "username": "Jenkins"}' ${BUILDS_DISCORD} '''
  810. }
  811. failure {
  812. sh ''' curl -X POST --data '{"avatar_url": "https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png","embeds": [{"color": 16711680,\
  813. "description": "**Build:** '${BUILD_NUMBER}'\\n**CI Results:** '${CI_URL}'\\n**Status:** failure\\n**Job:** '${RUN_DISPLAY_URL}'\\n**Change:** '${CODE_URL}'\\n**External Release:**: '${RELEASE_LINK}'\\n**DockerHub:** '${DOCKERHUB_LINK}'\\n"}],\
  814. "username": "Jenkins"}' ${BUILDS_DISCORD} '''
  815. }
  816. }
  817. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement