Jenkinsfile 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. def String PATCH_VERSION = new Date().format('yyMMddHHmm')
  2. def String INTERN_PORT = Math.abs( new Random().nextInt() % (22000 - 21000) ) + 21000
  3. def String SELENIUM_DOCKER_NAME = "selenium-" + System.currentTimeMillis()
  4. pipeline {
  5. agent { label getPipelineSlaveLabel() }
  6. options {
  7. buildDiscarder(logRotator(numToKeepStr:'10'))
  8. timestamps()
  9. }
  10. environment {
  11. RELEASE_NAME=asap("getBuildProperty releaseName")
  12. RETRY_TIMES=asap("getBuildProperty retryTimes")
  13. NPM_READ_REPOSITORY=asap("getBuildProperty NPM_READ_REPOSITORY")
  14. NPM_WRITE_REPOSITORY=asap("getBuildProperty NPM_WRITE_REPOSITORY")
  15. DOCKER_READ_REPOSITORY=asap("getBuildProperty DOCKER_READ_REPOSITORY")
  16. MAJOR_VERSION=asap("getBuildProperty majorVersion")
  17. MINOR_VERSION=asap("getBuildProperty minorVersion")
  18. COMPONENT_VERSION="$MAJOR_VERSION.$MINOR_VERSION.$PATCH_VERSION"
  19. COMPONENT_NAME=asap("getBuildProperty componentName")
  20. IMAGE_TAG="$COMPONENT_NAME-image"
  21. ASAP_PROPERTY_FILE=asap("getBuildProperty ASAP_PROPERTY_FILE")
  22. DOCKER_OPTS="--rm --user \$(id -u):\$(id -g) -v \$(pwd):/usr/src -w /usr/src -v \$(pwd):/root --env-file ${ASAP_PROPERTY_FILE}"
  23. NPM="docker run ${DOCKER_OPTS} ${IMAGE_TAG} npm"
  24. SELENIUM_DOCKER_IMAGE = asap("getBuildProperty SELENIUM_DOCKER_IMAGE")
  25. SELENIUM_DOCKER_VERSION = asap("getBuildProperty SELENIUM_DOCKER_VERSION")
  26. SELENIUM_DOCKER_NAME="$SELENIUM_DOCKER_NAME"
  27. SELENIUM_PORT=4444
  28. INTERN_PORT="$INTERN_PORT"
  29. }
  30. stages {
  31. stage('Pre-build') {
  32. when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
  33. steps {
  34. retry(RETRY_TIMES) {
  35. script {
  36. Map scopeMap = [
  37. '@watsonanalytics':"${NPM_READ_REPOSITORY}",
  38. '@waca':"${NPM_READ_REPOSITORY}",
  39. '@businessanalytics':"${NPM_READ_REPOSITORY}"
  40. ]
  41. asapMakeNpmrc(registry: "${NPM_READ_REPOSITORY}", scopeMap: scopeMap)
  42. }
  43. sh "docker build \
  44. --no-cache \
  45. --tag ${IMAGE_TAG} \
  46. --file ./Dockerfile \
  47. ."
  48. }
  49. }
  50. }
  51. stage('Build') {
  52. when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
  53. steps {
  54. retry(RETRY_TIMES) {
  55. sh "$NPM version $COMPONENT_VERSION"
  56. sh "$NPM install"
  57. sh "$NPM run build"
  58. }
  59. }
  60. }
  61. stage('Setup docker for Selenium') {
  62. when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
  63. steps {
  64. retry(RETRY_TIMES) {
  65. sh (
  66. label: "Clean up old selenium containers",
  67. script: "docker rm -f -v ${SELENIUM_DOCKER_NAME} || true"
  68. )
  69. sh (
  70. label: "Run selenium for testing",
  71. script: "docker run --detach --name ${SELENIUM_DOCKER_NAME} -v /dev/shm:/dev/shm selenium/${SELENIUM_DOCKER_IMAGE}:${SELENIUM_DOCKER_VERSION}" //Maps to port 4444
  72. )
  73. }
  74. }
  75. }
  76. stage('Test') {
  77. when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
  78. environment {
  79. SELENIUM_SERVER = sh (
  80. label: "Get selenium server ip",
  81. script: "docker inspect --format=\'{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}\' ${SELENIUM_DOCKER_NAME}",
  82. returnStdout: true
  83. ).trim()
  84. }
  85. steps {
  86. retry(RETRY_TIMES) {
  87. sh "$NPM run jest-tests"
  88. }
  89. }
  90. }
  91. stage('Publish Artifact to NPM registry') {
  92. when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
  93. steps {
  94. retry(RETRY_TIMES) {
  95. script{
  96. def scopeMap = [:]
  97. scopeMap =[
  98. '@waca':"${NPM_WRITE_REPOSITORY}",
  99. ]
  100. asapMakeNpmrc(registry:"${NPM_READ_REPOSITORY}", scopeMap: scopeMap)
  101. sh "$NPM publish --registry ${NPM_WRITE_REPOSITORY}"
  102. }
  103. }
  104. }
  105. }
  106. stage('ASAP Integration testing') {
  107. when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
  108. steps {
  109. retry(RETRY_TIMES) {
  110. script {
  111. DO_PROMOTE=env.BRANCH_NAME == asap("getBuildProperty releaseName") || env.BRANCH_NAME == 'master'
  112. asap("setBuildProperty promote=$DO_PROMOTE")
  113. asap("testAndPromote")
  114. }
  115. }
  116. }
  117. }
  118. stage('Trigger Downstream') {
  119. agent any
  120. when { expression { return env.RELEASE_NAME == env.BRANCH_NAME } }
  121. steps {
  122. retry(RETRY_TIMES) {
  123. build job: "BusinessAnalytics/glass-foundation/${BRANCH_NAME}", wait: false
  124. }
  125. }
  126. }
  127. }
  128. post {
  129. failure {
  130. script {
  131. if(env.RELEASE_NAME == env.BRANCH_NAME) {
  132. pipelineSlackSendBuildInfo(currentBuild, "", '#ba-glass-builds')
  133. }
  134. }
  135. }
  136. always {
  137. sh "docker rm -f -v ${SELENIUM_DOCKER_NAME} || true"
  138. asapPipelineTeardown()
  139. }
  140. }
  141. }