@catladder/pipeline 1.170.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist/bash/BashExpression.d.ts +1 -6
  2. package/dist/bash/BashExpression.js +2 -15
  3. package/dist/bash/bashEscape.d.ts +34 -0
  4. package/dist/bash/bashEscape.js +114 -0
  5. package/dist/bash/bashYaml.js +25 -2
  6. package/dist/bash/getInjectVarsScript.js +4 -2
  7. package/dist/bash/index.d.ts +2 -0
  8. package/dist/bash/index.js +26 -0
  9. package/dist/build/base/createAppBuildJob.js +3 -3
  10. package/dist/build/base/writeDotEnv.js +6 -4
  11. package/dist/build/custom/testJob.js +12 -12
  12. package/dist/build/docker.d.ts +3 -3
  13. package/dist/build/node/buildJob.js +1 -1
  14. package/dist/build/node/cache.d.ts +2 -4
  15. package/dist/build/node/cache.js +3 -24
  16. package/dist/build/node/testJob.js +11 -11
  17. package/dist/build/rails/build.js +1 -1
  18. package/dist/build/rails/test.js +8 -8
  19. package/dist/build/types.d.ts +0 -10
  20. package/dist/constants.js +1 -1
  21. package/dist/context/createComponentContext.js +0 -1
  22. package/dist/context/getEnvConfig.js +2 -1
  23. package/dist/context/getEnvironment.js +1 -2
  24. package/dist/context/getEnvironmentVariables.d.ts +5 -6
  25. package/dist/context/getEnvironmentVariables.js +50 -38
  26. package/dist/deploy/base/deploy.js +3 -3
  27. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +2 -2
  28. package/dist/deploy/cloudRun/index.js +2 -2
  29. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +1 -1
  30. package/dist/deploy/kubernetes/cloudSql/index.d.ts +2 -2
  31. package/dist/deploy/kubernetes/cloudSql/index.js +3 -14
  32. package/dist/deploy/kubernetes/deployJob.js +1 -3
  33. package/dist/deploy/kubernetes/index.js +2 -2
  34. package/dist/deploy/kubernetes/kubeEnv.d.ts +3 -3
  35. package/dist/deploy/kubernetes/kubeValues.d.ts +3 -4
  36. package/dist/deploy/kubernetes/kubeValues.js +2 -3
  37. package/dist/deploy/types/base.d.ts +0 -6
  38. package/dist/deploy/types/kubernetes.d.ts +1 -34
  39. package/dist/globalScriptFunctions/index.d.ts +14 -0
  40. package/dist/globalScriptFunctions/index.js +37 -0
  41. package/dist/index.d.ts +3 -1
  42. package/dist/index.js +3 -1
  43. package/dist/pipeline/gitlab/createGitlabJobs.js +3 -5
  44. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +1 -0
  45. package/dist/pipeline/gitlab/createGitlabPipeline.js +38 -2
  46. package/dist/pipeline/packageManager.js +1 -1
  47. package/dist/runner/index.d.ts +1 -1
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/dist/types/config.d.ts +6 -9
  50. package/dist/types/context.d.ts +2 -9
  51. package/dist/types/gitlab-types.d.ts +1 -0
  52. package/dist/types/jobs.d.ts +0 -8
  53. package/dist/utils/gitlab.js +4 -1
  54. package/dist/utils/writeFiles.js +1 -7
  55. package/dist/variables/VariableValue.d.ts +3 -0
  56. package/dist/variables/VariableValue.js +5 -0
  57. package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
  58. package/dist/variables/VariableValueContainingReferences.js +97 -0
  59. package/dist/variables/__tests__/resolveAllReferences.test.js +219 -0
  60. package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
  61. package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
  62. package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
  63. package/dist/variables/__tests__/resolveReferencesOnce.test.js +202 -0
  64. package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
  65. package/dist/variables/__tests__/variableValue.test.js +36 -0
  66. package/dist/variables/resolveAllReferences.d.ts +3 -0
  67. package/dist/{bash/replaceAsync.js → variables/resolveAllReferences.js} +60 -40
  68. package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
  69. package/dist/variables/resolveAllReferencesOnce.js +191 -0
  70. package/dist/variables/resolveReferencesOnce.d.ts +8 -0
  71. package/dist/variables/resolveReferencesOnce.js +22 -0
  72. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +312 -238
  73. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +312 -238
  74. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +312 -222
  75. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1436 -0
  76. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +312 -238
  77. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +316 -238
  78. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +312 -238
  79. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +313 -238
  80. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +312 -238
  81. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +312 -238
  82. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +312 -238
  83. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +312 -238
  84. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +316 -238
  85. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +294 -220
  86. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +312 -238
  87. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +652 -486
  88. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +282 -288
  89. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +312 -238
  90. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +284 -194
  91. package/examples/__snapshots__/custom-build-job.test.ts.snap +278 -188
  92. package/examples/__snapshots__/custom-deploy.test.ts.snap +220 -154
  93. package/examples/__snapshots__/custom-envs.test.ts.snap +216 -126
  94. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +278 -188
  95. package/examples/__snapshots__/git-submodule.test.ts.snap +312 -238
  96. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +231 -253
  97. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +240 -262
  98. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +504 -506
  99. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +239 -261
  100. package/examples/__snapshots__/local-dot-env.test.ts.snap +236 -238
  101. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +236 -242
  102. package/examples/__snapshots__/multiline-var.test.ts.snap +1355 -973
  103. package/examples/__snapshots__/native-app.test.ts.snap +438 -392
  104. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +312 -238
  105. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +312 -238
  106. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +186 -188
  107. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +162 -164
  108. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +971 -765
  109. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +330 -228
  110. package/examples/__snapshots__/{workspace-api-www-custom-cache.test.ts.snap → workspace-api-www-turbo-cache.test.ts.snap} +457 -499
  111. package/examples/__snapshots__/workspace-api-www.test.ts.snap +452 -482
  112. package/examples/{workspace-api-www-custom-cache.test.ts → cloud-run-nextjs.test.ts} +2 -2
  113. package/examples/cloud-run-nextjs.ts +28 -0
  114. package/examples/cloud-run-with-sql.ts +0 -1
  115. package/examples/kubernetes-application-customization.ts +1 -0
  116. package/examples/kubernetes-with-cloud-sql.ts +1 -0
  117. package/examples/kubernetes-with-jobs.ts +1 -0
  118. package/examples/kubernetes-with-mongodb.ts +1 -0
  119. package/examples/meteor-kubernetes.ts +1 -1
  120. package/examples/native-app.ts +10 -7
  121. package/examples/rails-k8s-with-worker.ts +7 -1
  122. package/examples/{kubernetes-with-cloud-sql-legacy.test.ts → workspace-api-www-turbo-cache.test.ts} +2 -2
  123. package/examples/{workspace-api-www-custom-cache.ts → workspace-api-www-turbo-cache.ts} +4 -3
  124. package/examples/workspace-api-www.ts +3 -2
  125. package/package.json +2 -6
  126. package/scripts/generate-examples-test.ts +0 -7
  127. package/src/bash/BashExpression.ts +0 -13
  128. package/src/bash/bashEscape.ts +158 -0
  129. package/src/bash/bashYaml.ts +36 -2
  130. package/src/bash/getInjectVarsScript.ts +11 -2
  131. package/src/bash/index.ts +2 -0
  132. package/src/build/base/createAppBuildJob.ts +0 -1
  133. package/src/build/base/writeDotEnv.ts +6 -6
  134. package/src/build/custom/testJob.ts +0 -1
  135. package/src/build/node/buildJob.ts +2 -2
  136. package/src/build/node/cache.ts +0 -29
  137. package/src/build/node/testJob.ts +0 -1
  138. package/src/build/rails/build.ts +0 -1
  139. package/src/build/rails/test.ts +0 -1
  140. package/src/build/types.ts +0 -13
  141. package/src/context/createComponentContext.ts +0 -1
  142. package/src/context/getEnvConfig.ts +2 -2
  143. package/src/context/getEnvironment.ts +1 -1
  144. package/src/context/getEnvironmentContext.ts +1 -1
  145. package/src/context/getEnvironmentVariables.ts +44 -51
  146. package/src/deploy/base/deploy.ts +1 -1
  147. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +4 -12
  148. package/src/deploy/cloudRun/index.ts +2 -2
  149. package/src/deploy/kubernetes/cloudSql/index.ts +3 -16
  150. package/src/deploy/kubernetes/deployJob.ts +0 -2
  151. package/src/deploy/kubernetes/index.ts +2 -2
  152. package/src/deploy/kubernetes/kubeEnv.ts +3 -3
  153. package/src/deploy/kubernetes/kubeValues.ts +5 -8
  154. package/src/deploy/types/base.ts +0 -6
  155. package/src/deploy/types/kubernetes.ts +1 -36
  156. package/src/globalScriptFunctions/index.ts +30 -0
  157. package/src/index.ts +2 -0
  158. package/src/pipeline/gitlab/createGitlabJobs.ts +1 -4
  159. package/src/pipeline/gitlab/createGitlabPipeline.ts +8 -1
  160. package/src/pipeline/packageManager.ts +7 -5
  161. package/src/runner/index.ts +0 -1
  162. package/src/types/config.ts +6 -9
  163. package/src/types/context.ts +3 -9
  164. package/src/types/gitlab-types.ts +1 -0
  165. package/src/types/jobs.ts +0 -8
  166. package/src/utils/gitlab.ts +19 -2
  167. package/src/utils/writeFiles.ts +1 -2
  168. package/src/variables/VariableValue.ts +6 -0
  169. package/src/variables/VariableValueContainingReferences.ts +89 -0
  170. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  171. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  172. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  173. package/src/variables/__tests__/variableValue.test.ts +73 -0
  174. package/src/variables/resolveAllReferences.ts +46 -0
  175. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  176. package/src/variables/resolveReferencesOnce.ts +29 -0
  177. package/bin/catladder-gitlab-dev.js +0 -3
  178. package/bin/catladder-gitlab.js +0 -3
  179. package/dist/bash/replaceAsync.d.ts +0 -2
  180. package/dist/bundles/catladder-gitlab/index.js +0 -15
  181. package/dist/context/__tests__/resolveReferences.test.js +0 -368
  182. package/dist/context/resolveReferences.d.ts +0 -6
  183. package/dist/context/resolveReferences.js +0 -286
  184. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -85
  185. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -33
  186. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +0 -1795
  187. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -35
  188. package/scripts/bundle +0 -2
  189. package/src/bash/replaceAsync.ts +0 -49
  190. package/src/context/__tests__/resolveReferences.test.ts +0 -148
  191. package/src/context/resolveReferences.ts +0 -93
  192. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -35
  193. /package/dist/{context/__tests__/resolveReferences.test.d.ts → variables/__tests__/resolveAllReferences.test.d.ts} +0 -0
@@ -1,1795 +0,0 @@
1
- // Jest Snapshot v1, https://goo.gl/fbAQLP
2
-
3
- exports[`matches snapshot for kubernetes-with-cloud-sql-legacy local pipeline YAML 1`] = `
4
- "image: path/to/docker/jobs-default:the-version
5
- stages:
6
- - setup
7
- - setup dev
8
- - setup review
9
- - setup stage
10
- - setup prod
11
- - test
12
- - test dev
13
- - test review
14
- - test stage
15
- - test prod
16
- - build
17
- - build dev
18
- - build review
19
- - build stage
20
- - build prod
21
- - deploy
22
- - deploy dev
23
- - deploy review
24
- - deploy stage
25
- - deploy prod
26
- - verify
27
- - verify dev
28
- - verify review
29
- - verify stage
30
- - verify prod
31
- - rollback
32
- - rollback dev
33
- - rollback review
34
- - rollback stage
35
- - rollback prod
36
- - stop
37
- - stop dev
38
- - stop review
39
- - stop stage
40
- - stop prod
41
- - release
42
- variables:
43
- FF_USE_FASTZIP: 'true'
44
- ARTIFACT_COMPRESSION_LEVEL: fast
45
- CACHE_COMPRESSION_LEVEL: fast
46
- TRANSFER_METER_FREQUENCY: 5s
47
- GIT_DEPTH: '1'
48
- api 🛡 audit:
49
- stage: test
50
- image: path/to/docker/jobs-default:the-version
51
- variables:
52
- KUBERNETES_CPU_REQUEST: '0.45'
53
- KUBERNETES_MEMORY_REQUEST: 1Gi
54
- KUBERNETES_MEMORY_LIMIT: 4Gi
55
- script:
56
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
- - export APP_PATH="api"
58
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
- - cd api
60
- - yarn npm audit --environment production
61
- rules:
62
- - when: never
63
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
64
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
65
- - if: $CI_MERGE_REQUEST_ID
66
- needs: []
67
- retry: &a1
68
- max: 2
69
- when:
70
- - runner_system_failure
71
- - stuck_or_timeout_failure
72
- interruptible: true
73
- allow_failure: true
74
- api 👮 lint:
75
- stage: test
76
- image: path/to/docker/jobs-default:the-version
77
- variables:
78
- KUBERNETES_CPU_REQUEST: '0.45'
79
- KUBERNETES_MEMORY_REQUEST: 1Gi
80
- KUBERNETES_MEMORY_LIMIT: 4Gi
81
- script:
82
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
83
- - export APP_PATH="api"
84
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
86
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
87
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
88
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
89
- - cd api
90
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
91
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
92
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
93
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
94
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
95
- - yarn install --immutable
96
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
97
- - yarn lint
98
- cache:
99
- - key: api-yarn
100
- policy: pull-push
101
- paths:
102
- - api/.yarn
103
- - key: api-node-modules
104
- policy: pull-push
105
- paths:
106
- - api/node_modules
107
- rules:
108
- - when: never
109
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
110
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
111
- - if: $CI_MERGE_REQUEST_ID
112
- needs: []
113
- retry: *a1
114
- interruptible: true
115
- api 🧪 test:
116
- stage: test
117
- image: path/to/docker/jobs-testing-chrome:the-version
118
- variables:
119
- KUBERNETES_CPU_REQUEST: '0.45'
120
- KUBERNETES_MEMORY_REQUEST: 1Gi
121
- KUBERNETES_MEMORY_LIMIT: 4Gi
122
- script:
123
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
124
- - export APP_PATH="api"
125
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
126
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
127
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
128
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
129
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
130
- - cd api
131
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
132
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
133
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
134
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
135
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
136
- - yarn install --immutable
137
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
138
- - yarn test
139
- cache:
140
- - key: api-yarn
141
- policy: pull-push
142
- paths:
143
- - api/.yarn
144
- - key: api-node-modules
145
- policy: pull-push
146
- paths:
147
- - api/node_modules
148
- rules:
149
- - when: never
150
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
151
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
152
- - if: $CI_MERGE_REQUEST_ID
153
- needs: []
154
- retry: *a1
155
- interruptible: true
156
- 'api 🔨 app | dev ':
157
- stage: build
158
- image: path/to/docker/jobs-default:the-version
159
- variables:
160
- KUBERNETES_CPU_REQUEST: '0.45'
161
- KUBERNETES_MEMORY_REQUEST: 1Gi
162
- KUBERNETES_MEMORY_LIMIT: 4Gi
163
- script:
164
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
165
- - export ENV_SHORT="dev"
166
- - export APP_DIR="api"
167
- - export ENV_TYPE="dev"
168
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
169
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
170
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
171
- - export HOST="api.dev.test-app.pan.panter.cloud"
172
- - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
173
- - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
174
- - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
175
- - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
176
- - export KUBE_NAMESPACE="pan-test-app-dev"
177
- - export KUBE_APP_NAME="api"
178
- - export KUBE_APP_NAME_PREFIX=""
179
- - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
180
- - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
181
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
182
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
183
- - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
184
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
185
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
186
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
187
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
188
- - cd api
189
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
190
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
191
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
192
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
193
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
194
- - yarn install --immutable
195
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
196
- - yarn build
197
- cache:
198
- - key: api-yarn
199
- policy: pull-push
200
- paths:
201
- - api/.yarn
202
- - key: api-node-modules
203
- policy: pull-push
204
- paths:
205
- - api/node_modules
206
- - key: api-next-cache
207
- policy: pull-push
208
- paths:
209
- - api/.next/cache
210
- artifacts:
211
- paths:
212
- - api/__build_info.json
213
- - api/.next
214
- - api/dist
215
- expire_in: 1 day
216
- when: always
217
- reports: {}
218
- rules:
219
- - when: never
220
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
221
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
222
- needs: []
223
- retry: *a1
224
- interruptible: true
225
- 'api 🔨 docker | dev ':
226
- stage: build
227
- image: path/to/docker/docker-build:the-version
228
- services:
229
- - name: docker:24.0.6-dind
230
- command:
231
- - --tls=false
232
- - --registry-mirror=https://mirror.gcr.io
233
- variables:
234
- DOCKER_HOST: tcp://0.0.0.0:2375
235
- DOCKER_TLS_CERTDIR: ''
236
- DOCKER_DRIVER: overlay2
237
- DOCKER_BUILDKIT: '1'
238
- KUBERNETES_CPU_REQUEST: '0.45'
239
- KUBERNETES_MEMORY_REQUEST: 1Gi
240
- KUBERNETES_MEMORY_LIMIT: 2Gi
241
- script:
242
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
243
- - export APP_DIR="api"
244
- - export DOCKER_BUILD_CONTEXT="."
245
- - export DOCKER_REGISTRY="$CI_REGISTRY"
246
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
247
- - export DOCKER_IMAGE_NAME="dev/api"
248
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
249
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
250
- - |-
251
- export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
252
- RUN yarn plugin import workspace-tools
253
- RUN yarn workspaces focus --production && yarn rebuild"
254
- - |-
255
- export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
256
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
257
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
258
- COPY --chown=node:node .yarn /app/.yarn"
259
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
260
- - ensureNodeDockerfile
261
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
262
- - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
263
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
264
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
265
- - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
266
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
267
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
268
- - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
269
- - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
270
- - docker push $DOCKER_CACHE_IMAGE
271
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
272
- cache:
273
- - key: api-yarn
274
- policy: pull
275
- paths:
276
- - api/.yarn
277
- rules:
278
- - when: never
279
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
280
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
281
- needs:
282
- - 'api 🔨 app | dev '
283
- retry: *a1
284
- interruptible: true
285
- 'api 🧾 sbom | dev ':
286
- stage: build
287
- image: aquasec/trivy:0.38.3
288
- variables: {}
289
- script:
290
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
291
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
292
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
293
- artifacts:
294
- paths:
295
- - __sbom.json
296
- rules:
297
- - when: never
298
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
299
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
300
- needs: []
301
- retry: *a1
302
- interruptible: true
303
- allow_failure: true
304
- 'api 🚀 Deploy | dev ':
305
- stage: deploy dev
306
- image: path/to/docker/kubernetes:the-version
307
- variables:
308
- KUBERNETES_CPU_REQUEST: '0.22'
309
- KUBERNETES_MEMORY_REQUEST: 200Mi
310
- KUBERNETES_MEMORY_LIMIT: 400Mi
311
- script:
312
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
313
- - export ENV_SHORT="dev"
314
- - export APP_DIR="api"
315
- - export ENV_TYPE="dev"
316
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
317
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
318
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
319
- - export HOST="api.dev.test-app.pan.panter.cloud"
320
- - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
321
- - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
322
- - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
323
- - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
324
- - export KUBE_NAMESPACE="pan-test-app-dev"
325
- - export KUBE_APP_NAME="api"
326
- - export KUBE_APP_NAME_PREFIX=""
327
- - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
328
- - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
329
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
330
- - export DOCKER_REGISTRY="$CI_REGISTRY"
331
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
332
- - export DOCKER_IMAGE_NAME="dev/api"
333
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
334
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
335
- - export RELEASE_NAME="pan-test-app-dev-api"
336
- - export HELM_EXPERIMENTAL_OCI="1"
337
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
338
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
339
- - export HELM_ARGS=""
340
- - export COMPONENT_NAME="api"
341
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
342
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
343
- - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
344
- - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
345
- - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
346
- - kubectl config use-context "kube-pan-test-app-dev-api"
347
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
348
- - |
349
- cat > __all_values.yml <<EOF
350
- env:
351
- secret:
352
- POSTGRESQL_PASSWORD: |-
353
- $(printf %s "$CL_dev_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
354
- cloudsqlProxyCredentials: |-
355
- $(printf %s "$CL_dev_api_cloudsqlProxyCredentials" | sed 's/^/ /')
356
- public:
357
- ENV_SHORT: |-
358
- dev
359
- APP_DIR: |-
360
- api
361
- ENV_TYPE: |-
362
- dev
363
- BUILD_INFO_BUILD_ID: |-
364
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
365
- BUILD_INFO_BUILD_TIME: |-
366
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
367
- BUILD_INFO_CURRENT_VERSION: |-
368
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
369
- HOST: |-
370
- api.dev.test-app.pan.panter.cloud
371
- ROOT_URL: |-
372
- https://api.dev.test-app.pan.panter.cloud
373
- HOST_INTERNAL: |-
374
- api.dev.test-app.pan.panter.cloud
375
- HOST_CANONICAL: |-
376
- api.dev.test-app.pan.panter.cloud
377
- ROOT_URL_INTERNAL: |-
378
- https://api.dev.test-app.pan.panter.cloud
379
- KUBE_NAMESPACE: |-
380
- pan-test-app-dev
381
- KUBE_APP_NAME: |-
382
- api
383
- KUBE_APP_NAME_PREFIX: ""
384
- _ALL_ENV_VAR_KEYS: |-
385
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
386
- application:
387
- host: |-
388
- api.dev.test-app.pan.panter.cloud
389
- command: |-
390
- yarn start
391
- livenessProbe:
392
- httpGet:
393
- path: |-
394
- __health
395
- readinessProbe:
396
- httpGet:
397
- path: |-
398
- __health
399
- startupProbe:
400
- httpGet:
401
- path: |-
402
- __health
403
- cloudsql:
404
- enabled: true
405
- dbUser: |-
406
- postgres
407
- instanceConnectionName: |-
408
- skynet-164509:europe-west6:pan-test-app-dev
409
- proxyCredentials: |-
410
- $CL_dev_api_cloudsqlProxyCredentials
411
- fullDbName: |-
412
- api
413
-
414
- EOF
415
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
416
- - kubernetesCreateSecret
417
- - kubernetesDeploy
418
- - echo 'Uploading SBOM to Dependency Track'
419
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
420
- - echo deployment successful 😻
421
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
422
- environment:
423
- name: dev/api
424
- url: $CL_GITLAB_ENVIRONMENT_URL
425
- on_stop: 'api 🛑 Stop ⚠️ | dev '
426
- auto_stop_in: 4 weeks
427
- artifacts:
428
- reports:
429
- dotenv: gitlab_environment.env
430
- rules:
431
- - when: never
432
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
433
- - when: on_success
434
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
435
- needs:
436
- - job: api 👮 lint
437
- artifacts: false
438
- - job: 'api 🔨 app | dev '
439
- artifacts: false
440
- - job: 'api 🔨 docker | dev '
441
- artifacts: false
442
- - job: api 🧪 test
443
- artifacts: false
444
- - job: 'api 🧾 sbom | dev '
445
- artifacts: true
446
- - job: api 🛡 audit
447
- artifacts: false
448
- retry: *a1
449
- interruptible: true
450
- allow_failure: false
451
- 'api 🛑 Stop ⚠️ | dev ':
452
- stage: stop dev
453
- image: path/to/docker/kubernetes:the-version
454
- variables:
455
- KUBERNETES_CPU_REQUEST: '0.22'
456
- KUBERNETES_MEMORY_REQUEST: 200Mi
457
- KUBERNETES_MEMORY_LIMIT: 400Mi
458
- GIT_STRATEGY: none
459
- script:
460
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
461
- - export ENV_SHORT="dev"
462
- - export APP_DIR="api"
463
- - export ENV_TYPE="dev"
464
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
465
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
466
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
467
- - export HOST="api.dev.test-app.pan.panter.cloud"
468
- - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
469
- - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
470
- - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
471
- - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
472
- - export KUBE_NAMESPACE="pan-test-app-dev"
473
- - export KUBE_APP_NAME="api"
474
- - export KUBE_APP_NAME_PREFIX=""
475
- - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
476
- - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
477
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
478
- - export RELEASE_NAME="pan-test-app-dev-api"
479
- - export HELM_EXPERIMENTAL_OCI="1"
480
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
481
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
482
- - export HELM_ARGS=""
483
- - export COMPONENT_NAME="api"
484
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
485
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
486
- - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
487
- - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
488
- - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
489
- - kubectl config use-context "kube-pan-test-app-dev-api"
490
- - kubernetesDelete
491
- - echo 'Disabling component in Dependency Track'
492
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true
493
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
494
- environment:
495
- name: dev/api
496
- url: $CL_GITLAB_ENVIRONMENT_URL
497
- action: stop
498
- artifacts:
499
- reports:
500
- dotenv: gitlab_environment.env
501
- rules:
502
- - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
503
- when: on_success
504
- - when: never
505
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
506
- - when: manual
507
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
508
- needs: []
509
- retry: *a1
510
- interruptible: true
511
- allow_failure: true
512
- 'api ↩️ Rollback ⚠️ | dev ':
513
- stage: rollback dev
514
- image: path/to/docker/kubernetes:the-version
515
- variables:
516
- KUBERNETES_CPU_REQUEST: '0.22'
517
- KUBERNETES_MEMORY_REQUEST: 200Mi
518
- KUBERNETES_MEMORY_LIMIT: 400Mi
519
- GIT_STRATEGY: none
520
- script:
521
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
522
- - export ENV_SHORT="dev"
523
- - export APP_DIR="api"
524
- - export ENV_TYPE="dev"
525
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
526
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
527
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
528
- - export HOST="api.dev.test-app.pan.panter.cloud"
529
- - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
530
- - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
531
- - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
532
- - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
533
- - export KUBE_NAMESPACE="pan-test-app-dev"
534
- - export KUBE_APP_NAME="api"
535
- - export KUBE_APP_NAME_PREFIX=""
536
- - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
537
- - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
538
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
539
- - export RELEASE_NAME="pan-test-app-dev-api"
540
- - export HELM_EXPERIMENTAL_OCI="1"
541
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
542
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
543
- - export HELM_ARGS=""
544
- - export COMPONENT_NAME="api"
545
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
546
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
547
- - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
548
- - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
549
- - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
550
- - kubectl config use-context "kube-pan-test-app-dev-api"
551
- - kubernetesRollback
552
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
553
- environment:
554
- name: dev/api
555
- url: $CL_GITLAB_ENVIRONMENT_URL
556
- action: access
557
- artifacts:
558
- reports:
559
- dotenv: gitlab_environment.env
560
- rules:
561
- - when: never
562
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
563
- - when: manual
564
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
565
- needs: []
566
- retry: *a1
567
- interruptible: true
568
- allow_failure: true
569
- 'api 🔨 app | review ':
570
- stage: build
571
- image: path/to/docker/jobs-default:the-version
572
- variables:
573
- KUBERNETES_CPU_REQUEST: '0.45'
574
- KUBERNETES_MEMORY_REQUEST: 1Gi
575
- KUBERNETES_MEMORY_LIMIT: 4Gi
576
- script:
577
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
578
- - export ENV_SHORT="review"
579
- - export APP_DIR="api"
580
- - export ENV_TYPE="review"
581
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
582
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
583
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
584
- - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
585
- - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
586
- - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
587
- - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
588
- - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
589
- - export KUBE_NAMESPACE="pan-test-app-review"
590
- - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
591
- - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
592
- - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
593
- - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
594
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
595
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
596
- - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
597
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
598
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
599
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
600
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
601
- - cd api
602
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
603
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
604
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
605
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
606
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
607
- - yarn install --immutable
608
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
609
- - yarn build
610
- cache:
611
- - key: api-yarn
612
- policy: pull-push
613
- paths:
614
- - api/.yarn
615
- - key: api-node-modules
616
- policy: pull-push
617
- paths:
618
- - api/node_modules
619
- - key: api-next-cache
620
- policy: pull-push
621
- paths:
622
- - api/.next/cache
623
- artifacts:
624
- paths:
625
- - api/__build_info.json
626
- - api/.next
627
- - api/dist
628
- expire_in: 1 day
629
- when: always
630
- reports: {}
631
- rules:
632
- - if: $CI_MERGE_REQUEST_ID
633
- needs: []
634
- retry: *a1
635
- interruptible: true
636
- 'api 🔨 docker | review ':
637
- stage: build
638
- image: path/to/docker/docker-build:the-version
639
- services:
640
- - name: docker:24.0.6-dind
641
- command:
642
- - --tls=false
643
- - --registry-mirror=https://mirror.gcr.io
644
- variables:
645
- DOCKER_HOST: tcp://0.0.0.0:2375
646
- DOCKER_TLS_CERTDIR: ''
647
- DOCKER_DRIVER: overlay2
648
- DOCKER_BUILDKIT: '1'
649
- KUBERNETES_CPU_REQUEST: '0.45'
650
- KUBERNETES_MEMORY_REQUEST: 1Gi
651
- KUBERNETES_MEMORY_LIMIT: 2Gi
652
- script:
653
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
654
- - export APP_DIR="api"
655
- - export DOCKER_BUILD_CONTEXT="."
656
- - export DOCKER_REGISTRY="$CI_REGISTRY"
657
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
658
- - export DOCKER_IMAGE_NAME="review/api"
659
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
660
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
661
- - |-
662
- export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
663
- RUN yarn plugin import workspace-tools
664
- RUN yarn workspaces focus --production && yarn rebuild"
665
- - |-
666
- export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
667
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
668
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
669
- COPY --chown=node:node .yarn /app/.yarn"
670
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
671
- - ensureNodeDockerfile
672
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
673
- - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
674
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
675
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
676
- - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
677
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
678
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
679
- - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
680
- - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
681
- - docker push $DOCKER_CACHE_IMAGE
682
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
683
- cache:
684
- - key: api-yarn
685
- policy: pull
686
- paths:
687
- - api/.yarn
688
- rules:
689
- - if: $CI_MERGE_REQUEST_ID
690
- needs:
691
- - 'api 🔨 app | review '
692
- retry: *a1
693
- interruptible: true
694
- 'api 🧾 sbom | review ':
695
- stage: build
696
- image: aquasec/trivy:0.38.3
697
- variables: {}
698
- script:
699
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
700
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
701
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
702
- artifacts:
703
- paths:
704
- - __sbom.json
705
- rules:
706
- - if: $CI_MERGE_REQUEST_ID
707
- needs: []
708
- retry: *a1
709
- interruptible: true
710
- allow_failure: true
711
- 'api 🚀 Deploy | review ':
712
- stage: deploy review
713
- image: path/to/docker/kubernetes:the-version
714
- variables:
715
- KUBERNETES_CPU_REQUEST: '0.22'
716
- KUBERNETES_MEMORY_REQUEST: 200Mi
717
- KUBERNETES_MEMORY_LIMIT: 400Mi
718
- script:
719
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
720
- - export ENV_SHORT="review"
721
- - export APP_DIR="api"
722
- - export ENV_TYPE="review"
723
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
724
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
725
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
726
- - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
727
- - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
728
- - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
729
- - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
730
- - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
731
- - export KUBE_NAMESPACE="pan-test-app-review"
732
- - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
733
- - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
734
- - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
735
- - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
736
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
737
- - export DOCKER_REGISTRY="$CI_REGISTRY"
738
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
739
- - export DOCKER_IMAGE_NAME="review/api"
740
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
741
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
742
- - export RELEASE_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
743
- - export HELM_EXPERIMENTAL_OCI="1"
744
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
745
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
746
- - export HELM_ARGS=""
747
- - export COMPONENT_NAME="api"
748
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
749
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
750
- - kubectl config set-cluster "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
751
- - kubectl config set-credentials "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --token="$CL_review_api_KUBE_TOKEN"
752
- - kubectl config set-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --cluster="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --user="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --namespace="pan-test-app-review"
753
- - kubectl config use-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
754
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
755
- - |
756
- cat > __all_values.yml <<EOF
757
- env:
758
- secret:
759
- POSTGRESQL_PASSWORD: |-
760
- $(printf %s "$CL_review_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
761
- cloudsqlProxyCredentials: |-
762
- $(printf %s "$CL_review_api_cloudsqlProxyCredentials" | sed 's/^/ /')
763
- public:
764
- ENV_SHORT: |-
765
- review
766
- APP_DIR: |-
767
- api
768
- ENV_TYPE: |-
769
- review
770
- BUILD_INFO_BUILD_ID: |-
771
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
772
- BUILD_INFO_BUILD_TIME: |-
773
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
774
- BUILD_INFO_CURRENT_VERSION: |-
775
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
776
- HOST: |-
777
- $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
778
- ROOT_URL: |-
779
- $(printf %s "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
780
- HOST_INTERNAL: |-
781
- $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
782
- HOST_CANONICAL: |-
783
- $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
784
- ROOT_URL_INTERNAL: |-
785
- $(printf %s "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
786
- KUBE_NAMESPACE: |-
787
- pan-test-app-review
788
- KUBE_APP_NAME: |-
789
- $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
790
- KUBE_APP_NAME_PREFIX: |-
791
- $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed 's/^/ /')
792
- _ALL_ENV_VAR_KEYS: |-
793
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
794
- application:
795
- host: |-
796
- $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
797
- command: |-
798
- yarn start
799
- livenessProbe:
800
- httpGet:
801
- path: |-
802
- __health
803
- readinessProbe:
804
- httpGet:
805
- path: |-
806
- __health
807
- startupProbe:
808
- httpGet:
809
- path: |-
810
- __health
811
- cloudsql:
812
- enabled: true
813
- dbUser: |-
814
- postgres
815
- instanceConnectionName: |-
816
- skynet-164509:europe-west6:pan-test-app-review
817
- proxyCredentials: |-
818
- $CL_review_api_cloudsqlProxyCredentials
819
- fullDbName: |-
820
- $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
821
-
822
- EOF
823
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
824
- - kubernetesCreateSecret
825
- - kubernetesDeploy
826
- - echo 'Uploading SBOM to Dependency Track'
827
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
828
- - echo deployment successful 😻
829
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
830
- environment:
831
- name: review/$CI_COMMIT_REF_NAME/api
832
- url: $CL_GITLAB_ENVIRONMENT_URL
833
- on_stop: 'api 🛑 Stop ⚠️ | review '
834
- auto_stop_in: 1 week
835
- artifacts:
836
- reports:
837
- dotenv: gitlab_environment.env
838
- rules:
839
- - when: on_success
840
- if: $CI_MERGE_REQUEST_ID
841
- needs:
842
- - job: api 👮 lint
843
- artifacts: false
844
- - job: 'api 🔨 app | review '
845
- artifacts: false
846
- - job: 'api 🔨 docker | review '
847
- artifacts: false
848
- - job: api 🧪 test
849
- artifacts: false
850
- - job: 'api 🧾 sbom | review '
851
- artifacts: true
852
- - job: api 🛡 audit
853
- artifacts: false
854
- retry: *a1
855
- interruptible: true
856
- allow_failure: false
857
- 'api 🛑 Stop ⚠️ | review ':
858
- stage: stop review
859
- image: path/to/docker/kubernetes:the-version
860
- variables:
861
- KUBERNETES_CPU_REQUEST: '0.22'
862
- KUBERNETES_MEMORY_REQUEST: 200Mi
863
- KUBERNETES_MEMORY_LIMIT: 400Mi
864
- GIT_STRATEGY: none
865
- script:
866
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
867
- - export ENV_SHORT="review"
868
- - export APP_DIR="api"
869
- - export ENV_TYPE="review"
870
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
871
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
872
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
873
- - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
874
- - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
875
- - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
876
- - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
877
- - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
878
- - export KUBE_NAMESPACE="pan-test-app-review"
879
- - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
880
- - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
881
- - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
882
- - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
883
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
884
- - export RELEASE_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
885
- - export HELM_EXPERIMENTAL_OCI="1"
886
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
887
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
888
- - export HELM_ARGS=""
889
- - export COMPONENT_NAME="api"
890
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
891
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
892
- - kubectl config set-cluster "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
893
- - kubectl config set-credentials "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --token="$CL_review_api_KUBE_TOKEN"
894
- - kubectl config set-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --cluster="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --user="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --namespace="pan-test-app-review"
895
- - kubectl config use-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
896
- - kubernetesDelete
897
- - echo 'Disabling component in Dependency Track'
898
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" || true
899
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
900
- environment:
901
- name: review/$CI_COMMIT_REF_NAME/api
902
- url: $CL_GITLAB_ENVIRONMENT_URL
903
- action: stop
904
- artifacts:
905
- reports:
906
- dotenv: gitlab_environment.env
907
- rules:
908
- - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
909
- when: on_success
910
- - when: manual
911
- if: $CI_MERGE_REQUEST_ID
912
- needs: []
913
- retry: *a1
914
- interruptible: true
915
- allow_failure: true
916
- 'api ↩️ Rollback ⚠️ | review ':
917
- stage: rollback review
918
- image: path/to/docker/kubernetes:the-version
919
- variables:
920
- KUBERNETES_CPU_REQUEST: '0.22'
921
- KUBERNETES_MEMORY_REQUEST: 200Mi
922
- KUBERNETES_MEMORY_LIMIT: 400Mi
923
- GIT_STRATEGY: none
924
- script:
925
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
926
- - export ENV_SHORT="review"
927
- - export APP_DIR="api"
928
- - export ENV_TYPE="review"
929
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
930
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
931
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
932
- - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
933
- - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
934
- - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
935
- - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
936
- - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
937
- - export KUBE_NAMESPACE="pan-test-app-review"
938
- - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
939
- - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
940
- - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
941
- - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
942
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
943
- - export RELEASE_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
944
- - export HELM_EXPERIMENTAL_OCI="1"
945
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
946
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
947
- - export HELM_ARGS=""
948
- - export COMPONENT_NAME="api"
949
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
950
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
951
- - kubectl config set-cluster "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
952
- - kubectl config set-credentials "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --token="$CL_review_api_KUBE_TOKEN"
953
- - kubectl config set-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --cluster="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --user="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --namespace="pan-test-app-review"
954
- - kubectl config use-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
955
- - kubernetesRollback
956
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
957
- environment:
958
- name: review/$CI_COMMIT_REF_NAME/api
959
- url: $CL_GITLAB_ENVIRONMENT_URL
960
- action: access
961
- artifacts:
962
- reports:
963
- dotenv: gitlab_environment.env
964
- rules:
965
- - when: manual
966
- if: $CI_MERGE_REQUEST_ID
967
- needs: []
968
- retry: *a1
969
- interruptible: true
970
- allow_failure: true
971
- 'api 🔨 app | stage ':
972
- stage: build
973
- image: path/to/docker/jobs-default:the-version
974
- variables:
975
- KUBERNETES_CPU_REQUEST: '0.45'
976
- KUBERNETES_MEMORY_REQUEST: 1Gi
977
- KUBERNETES_MEMORY_LIMIT: 4Gi
978
- script:
979
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
980
- - export ENV_SHORT="stage"
981
- - export APP_DIR="api"
982
- - export ENV_TYPE="stage"
983
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
984
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
985
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
986
- - export HOST="api.stage.test-app.pan.panter.cloud"
987
- - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
988
- - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
989
- - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
990
- - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
991
- - export KUBE_NAMESPACE="pan-test-app-stage"
992
- - export KUBE_APP_NAME="api"
993
- - export KUBE_APP_NAME_PREFIX=""
994
- - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
995
- - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
996
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
997
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
998
- - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
999
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1000
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1001
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1002
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1003
- - cd api
1004
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1005
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1006
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1007
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1008
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1009
- - yarn install --immutable
1010
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1011
- - yarn build
1012
- cache:
1013
- - key: api-yarn
1014
- policy: pull-push
1015
- paths:
1016
- - api/.yarn
1017
- - key: api-node-modules
1018
- policy: pull-push
1019
- paths:
1020
- - api/node_modules
1021
- - key: api-next-cache
1022
- policy: pull-push
1023
- paths:
1024
- - api/.next/cache
1025
- artifacts:
1026
- paths:
1027
- - api/__build_info.json
1028
- - api/.next
1029
- - api/dist
1030
- expire_in: 1 day
1031
- when: always
1032
- reports: {}
1033
- rules:
1034
- - if: $CI_COMMIT_TAG
1035
- needs: []
1036
- retry: *a1
1037
- interruptible: true
1038
- 'api 🔨 docker | stage ':
1039
- stage: build
1040
- image: path/to/docker/docker-build:the-version
1041
- services:
1042
- - name: docker:24.0.6-dind
1043
- command:
1044
- - --tls=false
1045
- - --registry-mirror=https://mirror.gcr.io
1046
- variables:
1047
- DOCKER_HOST: tcp://0.0.0.0:2375
1048
- DOCKER_TLS_CERTDIR: ''
1049
- DOCKER_DRIVER: overlay2
1050
- DOCKER_BUILDKIT: '1'
1051
- KUBERNETES_CPU_REQUEST: '0.45'
1052
- KUBERNETES_MEMORY_REQUEST: 1Gi
1053
- KUBERNETES_MEMORY_LIMIT: 2Gi
1054
- script:
1055
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1056
- - export APP_DIR="api"
1057
- - export DOCKER_BUILD_CONTEXT="."
1058
- - export DOCKER_REGISTRY="$CI_REGISTRY"
1059
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1060
- - export DOCKER_IMAGE_NAME="stage/api"
1061
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1062
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1063
- - |-
1064
- export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1065
- RUN yarn plugin import workspace-tools
1066
- RUN yarn workspaces focus --production && yarn rebuild"
1067
- - |-
1068
- export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1069
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1070
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1071
- COPY --chown=node:node .yarn /app/.yarn"
1072
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1073
- - ensureNodeDockerfile
1074
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1075
- - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1076
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1077
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1078
- - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1079
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1080
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1081
- - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1082
- - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1083
- - docker push $DOCKER_CACHE_IMAGE
1084
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1085
- cache:
1086
- - key: api-yarn
1087
- policy: pull
1088
- paths:
1089
- - api/.yarn
1090
- rules:
1091
- - if: $CI_COMMIT_TAG
1092
- needs:
1093
- - 'api 🔨 app | stage '
1094
- retry: *a1
1095
- interruptible: true
1096
- 'api 🧾 sbom | stage ':
1097
- stage: build
1098
- image: aquasec/trivy:0.38.3
1099
- variables: {}
1100
- script:
1101
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1102
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1103
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1104
- artifacts:
1105
- paths:
1106
- - __sbom.json
1107
- rules:
1108
- - if: $CI_COMMIT_TAG
1109
- needs: []
1110
- retry: *a1
1111
- interruptible: true
1112
- allow_failure: true
1113
- 'api 🚀 Deploy | stage ':
1114
- stage: deploy stage
1115
- image: path/to/docker/kubernetes:the-version
1116
- variables:
1117
- KUBERNETES_CPU_REQUEST: '0.22'
1118
- KUBERNETES_MEMORY_REQUEST: 200Mi
1119
- KUBERNETES_MEMORY_LIMIT: 400Mi
1120
- script:
1121
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1122
- - export ENV_SHORT="stage"
1123
- - export APP_DIR="api"
1124
- - export ENV_TYPE="stage"
1125
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1126
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1127
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1128
- - export HOST="api.stage.test-app.pan.panter.cloud"
1129
- - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1130
- - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1131
- - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1132
- - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1133
- - export KUBE_NAMESPACE="pan-test-app-stage"
1134
- - export KUBE_APP_NAME="api"
1135
- - export KUBE_APP_NAME_PREFIX=""
1136
- - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1137
- - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1138
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1139
- - export DOCKER_REGISTRY="$CI_REGISTRY"
1140
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1141
- - export DOCKER_IMAGE_NAME="stage/api"
1142
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1143
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1144
- - export RELEASE_NAME="pan-test-app-stage-api"
1145
- - export HELM_EXPERIMENTAL_OCI="1"
1146
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1147
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1148
- - export HELM_ARGS=""
1149
- - export COMPONENT_NAME="api"
1150
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1151
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1152
- - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1153
- - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1154
- - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1155
- - kubectl config use-context "kube-pan-test-app-stage-api"
1156
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1157
- - |
1158
- cat > __all_values.yml <<EOF
1159
- env:
1160
- secret:
1161
- POSTGRESQL_PASSWORD: |-
1162
- $(printf %s "$CL_stage_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1163
- cloudsqlProxyCredentials: |-
1164
- $(printf %s "$CL_stage_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1165
- public:
1166
- ENV_SHORT: |-
1167
- stage
1168
- APP_DIR: |-
1169
- api
1170
- ENV_TYPE: |-
1171
- stage
1172
- BUILD_INFO_BUILD_ID: |-
1173
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1174
- BUILD_INFO_BUILD_TIME: |-
1175
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1176
- BUILD_INFO_CURRENT_VERSION: |-
1177
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1178
- HOST: |-
1179
- api.stage.test-app.pan.panter.cloud
1180
- ROOT_URL: |-
1181
- https://api.stage.test-app.pan.panter.cloud
1182
- HOST_INTERNAL: |-
1183
- api.stage.test-app.pan.panter.cloud
1184
- HOST_CANONICAL: |-
1185
- api.stage.test-app.pan.panter.cloud
1186
- ROOT_URL_INTERNAL: |-
1187
- https://api.stage.test-app.pan.panter.cloud
1188
- KUBE_NAMESPACE: |-
1189
- pan-test-app-stage
1190
- KUBE_APP_NAME: |-
1191
- api
1192
- KUBE_APP_NAME_PREFIX: ""
1193
- _ALL_ENV_VAR_KEYS: |-
1194
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
1195
- application:
1196
- host: |-
1197
- api.stage.test-app.pan.panter.cloud
1198
- command: |-
1199
- yarn start
1200
- livenessProbe:
1201
- httpGet:
1202
- path: |-
1203
- __health
1204
- readinessProbe:
1205
- httpGet:
1206
- path: |-
1207
- __health
1208
- startupProbe:
1209
- httpGet:
1210
- path: |-
1211
- __health
1212
- cloudsql:
1213
- enabled: true
1214
- dbUser: |-
1215
- postgres
1216
- instanceConnectionName: |-
1217
- skynet-164509:europe-west6:pan-test-app-stage
1218
- proxyCredentials: |-
1219
- $CL_stage_api_cloudsqlProxyCredentials
1220
- fullDbName: |-
1221
- api
1222
-
1223
- EOF
1224
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1225
- - kubernetesCreateSecret
1226
- - kubernetesDeploy
1227
- - echo 'Uploading SBOM to Dependency Track'
1228
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
1229
- - echo deployment successful 😻
1230
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1231
- environment:
1232
- name: stage/api
1233
- url: $CL_GITLAB_ENVIRONMENT_URL
1234
- on_stop: 'api 🛑 Stop ⚠️ | stage '
1235
- artifacts:
1236
- reports:
1237
- dotenv: gitlab_environment.env
1238
- rules:
1239
- - when: on_success
1240
- if: $CI_COMMIT_TAG
1241
- needs:
1242
- - job: 'api 🔨 app | stage '
1243
- artifacts: false
1244
- - job: 'api 🔨 docker | stage '
1245
- artifacts: false
1246
- - job: 'api 🧾 sbom | stage '
1247
- artifacts: true
1248
- retry: *a1
1249
- interruptible: true
1250
- allow_failure: false
1251
- 'api 🛑 Stop ⚠️ | stage ':
1252
- stage: stop stage
1253
- image: path/to/docker/kubernetes:the-version
1254
- variables:
1255
- KUBERNETES_CPU_REQUEST: '0.22'
1256
- KUBERNETES_MEMORY_REQUEST: 200Mi
1257
- KUBERNETES_MEMORY_LIMIT: 400Mi
1258
- GIT_STRATEGY: none
1259
- script:
1260
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1261
- - export ENV_SHORT="stage"
1262
- - export APP_DIR="api"
1263
- - export ENV_TYPE="stage"
1264
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1265
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1266
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1267
- - export HOST="api.stage.test-app.pan.panter.cloud"
1268
- - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1269
- - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1270
- - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1271
- - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1272
- - export KUBE_NAMESPACE="pan-test-app-stage"
1273
- - export KUBE_APP_NAME="api"
1274
- - export KUBE_APP_NAME_PREFIX=""
1275
- - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1276
- - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1277
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1278
- - export RELEASE_NAME="pan-test-app-stage-api"
1279
- - export HELM_EXPERIMENTAL_OCI="1"
1280
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1281
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1282
- - export HELM_ARGS=""
1283
- - export COMPONENT_NAME="api"
1284
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1285
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1286
- - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1287
- - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1288
- - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1289
- - kubectl config use-context "kube-pan-test-app-stage-api"
1290
- - kubernetesDelete
1291
- - echo 'Disabling component in Dependency Track'
1292
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true
1293
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1294
- environment:
1295
- name: stage/api
1296
- url: $CL_GITLAB_ENVIRONMENT_URL
1297
- action: stop
1298
- artifacts:
1299
- reports:
1300
- dotenv: gitlab_environment.env
1301
- rules:
1302
- - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1303
- when: on_success
1304
- - when: manual
1305
- if: $CI_COMMIT_TAG
1306
- needs: []
1307
- retry: *a1
1308
- interruptible: true
1309
- allow_failure: true
1310
- 'api ↩️ Rollback ⚠️ | stage ':
1311
- stage: rollback stage
1312
- image: path/to/docker/kubernetes:the-version
1313
- variables:
1314
- KUBERNETES_CPU_REQUEST: '0.22'
1315
- KUBERNETES_MEMORY_REQUEST: 200Mi
1316
- KUBERNETES_MEMORY_LIMIT: 400Mi
1317
- GIT_STRATEGY: none
1318
- script:
1319
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1320
- - export ENV_SHORT="stage"
1321
- - export APP_DIR="api"
1322
- - export ENV_TYPE="stage"
1323
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1324
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1325
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1326
- - export HOST="api.stage.test-app.pan.panter.cloud"
1327
- - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1328
- - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1329
- - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1330
- - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1331
- - export KUBE_NAMESPACE="pan-test-app-stage"
1332
- - export KUBE_APP_NAME="api"
1333
- - export KUBE_APP_NAME_PREFIX=""
1334
- - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1335
- - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1336
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1337
- - export RELEASE_NAME="pan-test-app-stage-api"
1338
- - export HELM_EXPERIMENTAL_OCI="1"
1339
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1340
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1341
- - export HELM_ARGS=""
1342
- - export COMPONENT_NAME="api"
1343
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1344
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1345
- - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1346
- - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1347
- - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1348
- - kubectl config use-context "kube-pan-test-app-stage-api"
1349
- - kubernetesRollback
1350
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1351
- environment:
1352
- name: stage/api
1353
- url: $CL_GITLAB_ENVIRONMENT_URL
1354
- action: access
1355
- artifacts:
1356
- reports:
1357
- dotenv: gitlab_environment.env
1358
- rules:
1359
- - when: manual
1360
- if: $CI_COMMIT_TAG
1361
- needs: []
1362
- retry: *a1
1363
- interruptible: true
1364
- allow_failure: true
1365
- 'api 🔨 app | prod ':
1366
- stage: build
1367
- image: path/to/docker/jobs-default:the-version
1368
- variables:
1369
- KUBERNETES_CPU_REQUEST: '0.45'
1370
- KUBERNETES_MEMORY_REQUEST: 1Gi
1371
- KUBERNETES_MEMORY_LIMIT: 4Gi
1372
- script:
1373
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1374
- - export ENV_SHORT="prod"
1375
- - export APP_DIR="api"
1376
- - export ENV_TYPE="prod"
1377
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1378
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1379
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1380
- - export HOST="api.prod.test-app.pan.panter.cloud"
1381
- - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1382
- - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1383
- - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1384
- - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1385
- - export KUBE_NAMESPACE="pan-test-app-prod"
1386
- - export KUBE_APP_NAME="api"
1387
- - export KUBE_APP_NAME_PREFIX=""
1388
- - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1389
- - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1390
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1391
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1392
- - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1393
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1394
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1395
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1396
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1397
- - cd api
1398
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1399
- - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1400
- - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1401
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1402
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1403
- - yarn install --immutable
1404
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1405
- - yarn build
1406
- cache:
1407
- - key: api-yarn
1408
- policy: pull-push
1409
- paths:
1410
- - api/.yarn
1411
- - key: api-node-modules
1412
- policy: pull-push
1413
- paths:
1414
- - api/node_modules
1415
- - key: api-next-cache
1416
- policy: pull-push
1417
- paths:
1418
- - api/.next/cache
1419
- artifacts:
1420
- paths:
1421
- - api/__build_info.json
1422
- - api/.next
1423
- - api/dist
1424
- expire_in: 1 day
1425
- when: always
1426
- reports: {}
1427
- rules:
1428
- - if: $CI_COMMIT_TAG
1429
- needs: []
1430
- retry: *a1
1431
- interruptible: true
1432
- 'api 🔨 docker | prod ':
1433
- stage: build
1434
- image: path/to/docker/docker-build:the-version
1435
- services:
1436
- - name: docker:24.0.6-dind
1437
- command:
1438
- - --tls=false
1439
- - --registry-mirror=https://mirror.gcr.io
1440
- variables:
1441
- DOCKER_HOST: tcp://0.0.0.0:2375
1442
- DOCKER_TLS_CERTDIR: ''
1443
- DOCKER_DRIVER: overlay2
1444
- DOCKER_BUILDKIT: '1'
1445
- KUBERNETES_CPU_REQUEST: '0.45'
1446
- KUBERNETES_MEMORY_REQUEST: 1Gi
1447
- KUBERNETES_MEMORY_LIMIT: 2Gi
1448
- script:
1449
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1450
- - export APP_DIR="api"
1451
- - export DOCKER_BUILD_CONTEXT="."
1452
- - export DOCKER_REGISTRY="$CI_REGISTRY"
1453
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1454
- - export DOCKER_IMAGE_NAME="prod/api"
1455
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1456
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1457
- - |-
1458
- export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1459
- RUN yarn plugin import workspace-tools
1460
- RUN yarn workspaces focus --production && yarn rebuild"
1461
- - |-
1462
- export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1463
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1464
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1465
- COPY --chown=node:node .yarn /app/.yarn"
1466
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1467
- - ensureNodeDockerfile
1468
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1469
- - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1470
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1471
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1472
- - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1473
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1474
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1475
- - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1476
- - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1477
- - docker push $DOCKER_CACHE_IMAGE
1478
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1479
- cache:
1480
- - key: api-yarn
1481
- policy: pull
1482
- paths:
1483
- - api/.yarn
1484
- rules:
1485
- - if: $CI_COMMIT_TAG
1486
- needs:
1487
- - 'api 🔨 app | prod '
1488
- retry: *a1
1489
- interruptible: true
1490
- 'api 🧾 sbom | prod ':
1491
- stage: build
1492
- image: aquasec/trivy:0.38.3
1493
- variables: {}
1494
- script:
1495
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1496
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1497
- - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1498
- artifacts:
1499
- paths:
1500
- - __sbom.json
1501
- rules:
1502
- - if: $CI_COMMIT_TAG
1503
- needs: []
1504
- retry: *a1
1505
- interruptible: true
1506
- allow_failure: true
1507
- 'api 🚀 Deploy | prod ':
1508
- stage: deploy prod
1509
- image: path/to/docker/kubernetes:the-version
1510
- variables:
1511
- KUBERNETES_CPU_REQUEST: '0.22'
1512
- KUBERNETES_MEMORY_REQUEST: 200Mi
1513
- KUBERNETES_MEMORY_LIMIT: 400Mi
1514
- script:
1515
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1516
- - export ENV_SHORT="prod"
1517
- - export APP_DIR="api"
1518
- - export ENV_TYPE="prod"
1519
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1520
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1521
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1522
- - export HOST="api.prod.test-app.pan.panter.cloud"
1523
- - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1524
- - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1525
- - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1526
- - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1527
- - export KUBE_NAMESPACE="pan-test-app-prod"
1528
- - export KUBE_APP_NAME="api"
1529
- - export KUBE_APP_NAME_PREFIX=""
1530
- - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1531
- - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1532
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1533
- - export DOCKER_REGISTRY="$CI_REGISTRY"
1534
- - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1535
- - export DOCKER_IMAGE_NAME="prod/api"
1536
- - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1537
- - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1538
- - export RELEASE_NAME="pan-test-app-prod-api"
1539
- - export HELM_EXPERIMENTAL_OCI="1"
1540
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1541
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1542
- - export HELM_ARGS=""
1543
- - export COMPONENT_NAME="api"
1544
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1545
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1546
- - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1547
- - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1548
- - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1549
- - kubectl config use-context "kube-pan-test-app-prod-api"
1550
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1551
- - |
1552
- cat > __all_values.yml <<EOF
1553
- env:
1554
- secret:
1555
- POSTGRESQL_PASSWORD: |-
1556
- $(printf %s "$CL_prod_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1557
- cloudsqlProxyCredentials: |-
1558
- $(printf %s "$CL_prod_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1559
- public:
1560
- ENV_SHORT: |-
1561
- prod
1562
- APP_DIR: |-
1563
- api
1564
- ENV_TYPE: |-
1565
- prod
1566
- BUILD_INFO_BUILD_ID: |-
1567
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1568
- BUILD_INFO_BUILD_TIME: |-
1569
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1570
- BUILD_INFO_CURRENT_VERSION: |-
1571
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1572
- HOST: |-
1573
- api.prod.test-app.pan.panter.cloud
1574
- ROOT_URL: |-
1575
- https://api.prod.test-app.pan.panter.cloud
1576
- HOST_INTERNAL: |-
1577
- api.prod.test-app.pan.panter.cloud
1578
- HOST_CANONICAL: |-
1579
- api.prod.test-app.pan.panter.cloud
1580
- ROOT_URL_INTERNAL: |-
1581
- https://api.prod.test-app.pan.panter.cloud
1582
- KUBE_NAMESPACE: |-
1583
- pan-test-app-prod
1584
- KUBE_APP_NAME: |-
1585
- api
1586
- KUBE_APP_NAME_PREFIX: ""
1587
- _ALL_ENV_VAR_KEYS: |-
1588
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
1589
- application:
1590
- host: |-
1591
- api.prod.test-app.pan.panter.cloud
1592
- command: |-
1593
- yarn start
1594
- livenessProbe:
1595
- httpGet:
1596
- path: |-
1597
- __health
1598
- readinessProbe:
1599
- httpGet:
1600
- path: |-
1601
- __health
1602
- startupProbe:
1603
- httpGet:
1604
- path: |-
1605
- __health
1606
- cloudsql:
1607
- enabled: true
1608
- dbUser: |-
1609
- postgres
1610
- instanceConnectionName: |-
1611
- skynet-164509:europe-west6:pan-test-app-prod
1612
- proxyCredentials: |-
1613
- $CL_prod_api_cloudsqlProxyCredentials
1614
- fullDbName: |-
1615
- api
1616
-
1617
- EOF
1618
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1619
- - kubernetesCreateSecret
1620
- - kubernetesDeploy
1621
- - echo 'Uploading SBOM to Dependency Track'
1622
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
1623
- - echo deployment successful 😻
1624
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1625
- environment:
1626
- name: prod/api
1627
- url: $CL_GITLAB_ENVIRONMENT_URL
1628
- on_stop: 'api 🛑 Stop ⚠️ | prod '
1629
- artifacts:
1630
- reports:
1631
- dotenv: gitlab_environment.env
1632
- rules:
1633
- - when: manual
1634
- if: $CI_COMMIT_TAG
1635
- needs:
1636
- - job: 'api 🔨 app | prod '
1637
- artifacts: false
1638
- - job: 'api 🔨 docker | prod '
1639
- artifacts: false
1640
- - job: 'api 🧾 sbom | prod '
1641
- artifacts: true
1642
- retry: *a1
1643
- interruptible: true
1644
- allow_failure: true
1645
- 'api 🛑 Stop ⚠️ | prod ':
1646
- stage: stop prod
1647
- image: path/to/docker/kubernetes:the-version
1648
- variables:
1649
- KUBERNETES_CPU_REQUEST: '0.22'
1650
- KUBERNETES_MEMORY_REQUEST: 200Mi
1651
- KUBERNETES_MEMORY_LIMIT: 400Mi
1652
- GIT_STRATEGY: none
1653
- script:
1654
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1655
- - export ENV_SHORT="prod"
1656
- - export APP_DIR="api"
1657
- - export ENV_TYPE="prod"
1658
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1659
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1660
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1661
- - export HOST="api.prod.test-app.pan.panter.cloud"
1662
- - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1663
- - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1664
- - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1665
- - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1666
- - export KUBE_NAMESPACE="pan-test-app-prod"
1667
- - export KUBE_APP_NAME="api"
1668
- - export KUBE_APP_NAME_PREFIX=""
1669
- - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1670
- - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1671
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1672
- - export RELEASE_NAME="pan-test-app-prod-api"
1673
- - export HELM_EXPERIMENTAL_OCI="1"
1674
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1675
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1676
- - export HELM_ARGS=""
1677
- - export COMPONENT_NAME="api"
1678
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1679
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1680
- - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1681
- - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1682
- - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1683
- - kubectl config use-context "kube-pan-test-app-prod-api"
1684
- - kubernetesDelete
1685
- - echo 'Disabling component in Dependency Track'
1686
- - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true
1687
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1688
- environment:
1689
- name: prod/api
1690
- url: $CL_GITLAB_ENVIRONMENT_URL
1691
- action: stop
1692
- artifacts:
1693
- reports:
1694
- dotenv: gitlab_environment.env
1695
- rules:
1696
- - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1697
- when: on_success
1698
- - when: manual
1699
- if: $CI_COMMIT_TAG
1700
- needs: []
1701
- retry: *a1
1702
- interruptible: true
1703
- allow_failure: true
1704
- 'api ↩️ Rollback ⚠️ | prod ':
1705
- stage: rollback prod
1706
- image: path/to/docker/kubernetes:the-version
1707
- variables:
1708
- KUBERNETES_CPU_REQUEST: '0.22'
1709
- KUBERNETES_MEMORY_REQUEST: 200Mi
1710
- KUBERNETES_MEMORY_LIMIT: 400Mi
1711
- GIT_STRATEGY: none
1712
- script:
1713
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1714
- - export ENV_SHORT="prod"
1715
- - export APP_DIR="api"
1716
- - export ENV_TYPE="prod"
1717
- - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1718
- - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1719
- - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1720
- - export HOST="api.prod.test-app.pan.panter.cloud"
1721
- - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1722
- - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1723
- - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1724
- - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1725
- - export KUBE_NAMESPACE="pan-test-app-prod"
1726
- - export KUBE_APP_NAME="api"
1727
- - export KUBE_APP_NAME_PREFIX=""
1728
- - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1729
- - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1730
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1731
- - export RELEASE_NAME="pan-test-app-prod-api"
1732
- - export HELM_EXPERIMENTAL_OCI="1"
1733
- - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1734
- - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1735
- - export HELM_ARGS=""
1736
- - export COMPONENT_NAME="api"
1737
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1738
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1739
- - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1740
- - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1741
- - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1742
- - kubectl config use-context "kube-pan-test-app-prod-api"
1743
- - kubernetesRollback
1744
- - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1745
- environment:
1746
- name: prod/api
1747
- url: $CL_GITLAB_ENVIRONMENT_URL
1748
- action: access
1749
- artifacts:
1750
- reports:
1751
- dotenv: gitlab_environment.env
1752
- rules:
1753
- - when: manual
1754
- if: $CI_COMMIT_TAG
1755
- needs: []
1756
- retry: *a1
1757
- interruptible: true
1758
- allow_failure: true
1759
- create release:
1760
- stage: release
1761
- image: path/to/docker/semantic-release:the-version
1762
- script:
1763
- - semanticRelease
1764
- after_script:
1765
- - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1766
- rules:
1767
- - &a2
1768
- if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1769
- when: never
1770
- - &a3
1771
- if: $CI_PIPELINE_SOURCE == "schedule"
1772
- when: never
1773
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1774
- when: on_success
1775
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1776
- when: manual
1777
- - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1778
- when: manual
1779
- ⚠️ force create release:
1780
- stage: release
1781
- image: path/to/docker/semantic-release:the-version
1782
- script:
1783
- - semanticRelease
1784
- after_script:
1785
- - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1786
- rules:
1787
- - *a2
1788
- - *a3
1789
- - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1790
- when: manual
1791
- - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1792
- when: manual
1793
- needs: []
1794
- "
1795
- `;