Jenkinsfile-alien-py-cloud-produ.groovy 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. // Same as repo root Jenkinsfile. Prefer editing /Jenkinsfile only.
  2. def DEFAULT_PROD_SSH_TARGET = 'alien_store@39.105.153.68'
  3. def DEFAULT_PROD_SSH_CREDENTIALS_ID = 'e611a045-2fdc-4613-babd-a72d69bf9814'
  4. pipeline {
  5. agent any
  6. options {
  7. buildDiscarder(logRotator(numToKeepStr: '10'))
  8. timestamps()
  9. }
  10. parameters {
  11. string(name: 'PROD_SSH_TARGET', defaultValue: DEFAULT_PROD_SSH_TARGET,
  12. description: 'Production host SSH target')
  13. string(name: 'PROD_SSH_CREDENTIALS_ID', defaultValue: DEFAULT_PROD_SSH_CREDENTIALS_ID,
  14. description: 'Jenkins SSH Username with private key credential ID')
  15. string(name: 'GIT_BRANCH', defaultValue: 'produ',
  16. description: 'alien_py_cloud branch to deploy')
  17. }
  18. environment {
  19. CODE_DIR_REMOTE = '/alien_produ/python/alien_py_cloud'
  20. ENV_FILE_REMOTE = '/alien_produ/python/alien_py_cloud/.env.produ'
  21. LOG_ROOT_REMOTE = '/alien_produ/python/alien_py_cloud/logs'
  22. IMAGE_STORE = 'alien_store:local'
  23. IMAGE_GATEWAY = 'alien_gateway:local'
  24. IMAGE_CONTRACT = 'alien_contract:local'
  25. CONTAINER_NAME_STORE = 'py_esign_produ'
  26. CONTAINER_NAME_GATEWAY = 'py_gateway_produ'
  27. CONTAINER_NAME_CONTRACT = 'py_contract_produ'
  28. PORT_STORE_INTERNAL = '48001'
  29. PORT_GATEWAY_INTERNAL = '43333'
  30. PORT_CONTRACT_INTERNAL = '8002'
  31. PORT_GATEWAY_HOST = '33333'
  32. PORT_CONTRACT_HOST = '8002'
  33. DOCKER_NET = 'alien_net_produ'
  34. }
  35. stages {
  36. stage('Verify SSH') {
  37. steps {
  38. script {
  39. def sshTarget = (params.PROD_SSH_TARGET ?: DEFAULT_PROD_SSH_TARGET).trim()
  40. def credId = (params.PROD_SSH_CREDENTIALS_ID ?: DEFAULT_PROD_SSH_CREDENTIALS_ID).trim()
  41. env.SSH_TARGET = sshTarget
  42. env.SSH_CRED_ID = credId
  43. sshagent(credentials: [credId]) {
  44. sh """
  45. set -e
  46. ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new '${sshTarget}' \\
  47. 'test -f ${ENV_FILE_REMOTE} && sudo docker info >/dev/null'
  48. echo ">>> SSH OK: ${sshTarget}"
  49. """
  50. }
  51. }
  52. }
  53. }
  54. stage('Git Pull on Production') {
  55. steps {
  56. sshagent(credentials: [env.SSH_CRED_ID]) {
  57. sh """
  58. set -e
  59. ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new '${env.SSH_TARGET}' bash -s <<'REMOTE_EOF'
  60. set -e
  61. cd '${CODE_DIR_REMOTE}'
  62. if [ ! -d .git ]; then
  63. echo "ERROR: ${CODE_DIR_REMOTE} is not a git repo. Clone manually first."
  64. exit 1
  65. fi
  66. git fetch origin
  67. git checkout '${params.GIT_BRANCH}'
  68. git pull origin '${params.GIT_BRANCH}'
  69. echo ">>> git at \$(git rev-parse --short HEAD) on \$(hostname)"
  70. REMOTE_EOF
  71. """
  72. }
  73. }
  74. }
  75. stage('Build Images on Production') {
  76. steps {
  77. sshagent(credentials: [env.SSH_CRED_ID]) {
  78. sh """
  79. set -e
  80. ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new '${env.SSH_TARGET}' bash -s <<'REMOTE_EOF'
  81. set -e
  82. cd '${CODE_DIR_REMOTE}'
  83. sudo docker build -f alien_store/Dockerfile -t ${IMAGE_STORE} .
  84. sudo docker build -f alien_gateway/Dockerfile -t ${IMAGE_GATEWAY} .
  85. sudo docker build -f alien_contract/Dockerfile -t ${IMAGE_CONTRACT} .
  86. echo ">>> images built on \$(hostname)"
  87. sudo docker images | grep -E 'alien_store|alien_gateway|alien_contract' | head -10
  88. REMOTE_EOF
  89. """
  90. }
  91. }
  92. }
  93. stage('Deploy on Production') {
  94. steps {
  95. sshagent(credentials: [env.SSH_CRED_ID]) {
  96. sh """
  97. set -e
  98. ssh -o BatchMode=yes -o StrictHostKeyChecking=accept-new '${env.SSH_TARGET}' bash -s <<'REMOTE_EOF'
  99. set -e
  100. sudo docker network create ${DOCKER_NET} 2>/dev/null || true
  101. mkdir -p ${LOG_ROOT_REMOTE}/store ${LOG_ROOT_REMOTE}/gateway ${LOG_ROOT_REMOTE}/contract
  102. sudo docker rm -f ${CONTAINER_NAME_STORE} ${CONTAINER_NAME_GATEWAY} ${CONTAINER_NAME_CONTRACT} 2>/dev/null || true
  103. sudo docker rm -f alien_store_produ alien_gateway_produ alien_contract_produ 2>/dev/null || true
  104. sudo docker run -d --name ${CONTAINER_NAME_STORE} \\
  105. --network ${DOCKER_NET} \\
  106. --env-file ${ENV_FILE_REMOTE} \\
  107. -v ${ENV_FILE_REMOTE}:/app/.env.produ:ro \\
  108. -v ${LOG_ROOT_REMOTE}/store:/app/common/logs/alien_store \\
  109. --restart unless-stopped \\
  110. ${IMAGE_STORE}
  111. sudo docker run -d --name ${CONTAINER_NAME_CONTRACT} \\
  112. --network ${DOCKER_NET} \\
  113. -p ${PORT_CONTRACT_HOST}:${PORT_CONTRACT_INTERNAL} \\
  114. --env-file ${ENV_FILE_REMOTE} \\
  115. -v ${ENV_FILE_REMOTE}:/app/.env.produ:ro \\
  116. -v ${LOG_ROOT_REMOTE}/contract:/app/common/logs/alien_contract \\
  117. --restart unless-stopped \\
  118. ${IMAGE_CONTRACT}
  119. sudo docker run -d --name ${CONTAINER_NAME_GATEWAY} \\
  120. --network ${DOCKER_NET} \\
  121. -p ${PORT_GATEWAY_HOST}:${PORT_GATEWAY_INTERNAL} \\
  122. --env-file ${ENV_FILE_REMOTE} \\
  123. -v ${ENV_FILE_REMOTE}:/app/.env.produ:ro \\
  124. -v ${LOG_ROOT_REMOTE}/gateway:/app/common/logs/alien_gateway \\
  125. -e STORE_BASE_URL=http://${CONTAINER_NAME_STORE}:${PORT_STORE_INTERNAL} \\
  126. --restart unless-stopped \\
  127. ${IMAGE_GATEWAY}
  128. sleep 3
  129. curl -sf http://127.0.0.1:${PORT_GATEWAY_HOST}/health || (echo 'gateway /health failed' && exit 1)
  130. curl -sf http://127.0.0.1:${PORT_CONTRACT_HOST}/health || (echo 'contract /health failed' && exit 1)
  131. sudo docker ps --filter name=${CONTAINER_NAME_STORE} --filter name=${CONTAINER_NAME_GATEWAY} --filter name=${CONTAINER_NAME_CONTRACT}
  132. REMOTE_EOF
  133. """
  134. }
  135. }
  136. }
  137. }
  138. post {
  139. success {
  140. echo ">>> alien_py_cloud deployed on ${env.SSH_TARGET}"
  141. }
  142. failure {
  143. echo '>>> failed: check SSH, .env.produ, sudo docker, and remote git path'
  144. }
  145. always {
  146. cleanWs()
  147. }
  148. }
  149. }