@catladder/pipeline 0.0.0-node16-ddfae617 → 0.0.0-prettier-cbceeed9

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 (275) hide show
  1. package/bin/catladder-gitlab-dev.js +3 -0
  2. package/bin/catladder-gitlab.js +1 -1
  3. package/dist/build/base/createBuildJob.d.ts +2 -2
  4. package/dist/build/base/createBuildJob.js +15 -30
  5. package/dist/build/base/writeBuildInfo.d.ts +2 -0
  6. package/dist/build/base/{getBuildInfo.js → writeBuildInfo.js} +3 -6
  7. package/dist/build/custom/buildJob.d.ts +3 -0
  8. package/dist/build/custom/buildJob.js +83 -0
  9. package/dist/build/custom/index.d.ts +3 -0
  10. package/dist/build/custom/index.js +40 -0
  11. package/dist/build/docker.d.ts +33 -9
  12. package/dist/build/docker.js +51 -54
  13. package/dist/build/index.d.ts +6 -5
  14. package/dist/build/index.js +20 -6
  15. package/dist/build/node/buildJob.d.ts +2 -2
  16. package/dist/build/node/buildJob.js +3 -25
  17. package/dist/build/node/cache.d.ts +2 -2
  18. package/dist/build/node/cache.js +19 -22
  19. package/dist/build/node/index.d.ts +1 -1
  20. package/dist/build/node/index.js +3 -16
  21. package/dist/build/node/meteor.d.ts +1 -1
  22. package/dist/build/node/meteor.js +9 -20
  23. package/dist/build/node/testJob.d.ts +2 -2
  24. package/dist/build/node/testJob.js +7 -21
  25. package/dist/build/node/yarn.d.ts +1 -1
  26. package/dist/build/node/yarn.js +14 -15
  27. package/dist/build/rails/build.d.ts +3 -0
  28. package/dist/build/rails/build.js +51 -0
  29. package/dist/build/rails/index.d.ts +3 -0
  30. package/dist/build/rails/index.js +41 -0
  31. package/dist/build/rails/test.d.ts +3 -0
  32. package/dist/build/rails/test.js +94 -0
  33. package/dist/build/types.d.ts +84 -9
  34. package/dist/build/types.js +0 -4
  35. package/dist/bundles/catladder-gitlab/index.js +32979 -0
  36. package/dist/catladder-gitlab.js +7 -26
  37. package/dist/config/{configruedEnvs.test.d.ts → __tests__/configruedEnvs.test.d.ts} +0 -0
  38. package/dist/config/{configruedEnvs.test.js → __tests__/configruedEnvs.test.js} +10 -12
  39. package/dist/config/configruedEnvs.d.ts +1 -1
  40. package/dist/config/configruedEnvs.js +7 -22
  41. package/dist/config/index.js +0 -4
  42. package/dist/config/readConfig.d.ts +1 -1
  43. package/dist/config/readConfig.js +2 -13
  44. package/dist/constants.js +1 -1
  45. package/dist/context/{resolveReferences.test.d.ts → __tests__/resolveReferences.test.d.ts} +0 -0
  46. package/dist/context/__tests__/resolveReferences.test.js +336 -0
  47. package/dist/context/getEnvConfig.d.ts +2 -0
  48. package/dist/context/getEnvConfig.js +18 -0
  49. package/dist/context/getEnvType.d.ts +4 -0
  50. package/dist/context/getEnvType.js +13 -0
  51. package/dist/context/getEnvironment.d.ts +3 -0
  52. package/dist/{pipeline/createChildPipeline.test.js → context/getEnvironment.js} +42 -84
  53. package/dist/context/getEnvironmentContext.d.ts +4 -0
  54. package/dist/context/getEnvironmentContext.js +33 -0
  55. package/dist/context/getEnvironmentVariables.d.ts +10 -0
  56. package/dist/context/getEnvironmentVariables.js +260 -0
  57. package/dist/context/getLabels.d.ts +8 -0
  58. package/dist/context/getLabels.js +38 -0
  59. package/dist/context/index.d.ts +5 -6
  60. package/dist/context/index.js +158 -208
  61. package/dist/context/resolveReferences.d.ts +1 -3
  62. package/dist/context/resolveReferences.js +213 -52
  63. package/dist/defaults/index.d.ts +1 -1
  64. package/dist/deploy/base.d.ts +4 -2
  65. package/dist/deploy/base.js +38 -33
  66. package/dist/deploy/cloudRun/deployJob.d.ts +3 -0
  67. package/dist/deploy/cloudRun/deployJob.js +238 -0
  68. package/dist/deploy/cloudRun/index.d.ts +4 -0
  69. package/dist/deploy/cloudRun/index.js +112 -0
  70. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +11 -0
  71. package/dist/deploy/cloudRun/utils/createArgsString.js +55 -0
  72. package/dist/deploy/cloudRun/utils/database.d.ts +4 -0
  73. package/dist/deploy/cloudRun/utils/database.js +64 -0
  74. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -0
  75. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +10 -0
  76. package/dist/deploy/cloudRun/utils/jobName.d.ts +1 -0
  77. package/dist/deploy/cloudRun/utils/jobName.js +8 -0
  78. package/dist/deploy/custom/deployJob.d.ts +2 -2
  79. package/dist/deploy/custom/deployJob.js +10 -16
  80. package/dist/deploy/custom/index.d.ts +2 -1
  81. package/dist/deploy/custom/index.js +14 -19
  82. package/dist/deploy/dockerTag/deployJob.d.ts +3 -0
  83. package/dist/deploy/dockerTag/deployJob.js +24 -0
  84. package/dist/deploy/dockerTag/index.d.ts +2 -0
  85. package/dist/deploy/dockerTag/index.js +17 -0
  86. package/dist/deploy/index.d.ts +12 -8
  87. package/dist/deploy/index.js +7 -20
  88. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +4 -0
  89. package/dist/deploy/kubernetes/additionalSecretKeys.js +24 -0
  90. package/dist/deploy/kubernetes/cloudSql/index.d.ts +13 -0
  91. package/dist/deploy/kubernetes/cloudSql/index.js +30 -0
  92. package/dist/deploy/kubernetes/deployJob.d.ts +2 -2
  93. package/dist/deploy/kubernetes/deployJob.js +17 -91
  94. package/dist/deploy/kubernetes/index.d.ts +3 -1
  95. package/dist/deploy/kubernetes/index.js +42 -4
  96. package/dist/deploy/kubernetes/kubeEnv.d.ts +9 -0
  97. package/dist/deploy/kubernetes/kubeEnv.js +72 -0
  98. package/dist/deploy/kubernetes/kubeValues.d.ts +97 -0
  99. package/dist/deploy/kubernetes/kubeValues.js +124 -0
  100. package/dist/deploy/kubernetes/mongodb.d.ts +18 -5
  101. package/dist/deploy/kubernetes/mongodb.js +96 -10
  102. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +25 -21
  103. package/dist/deploy/kubernetes/processSecretsAsFiles.js +2 -10
  104. package/dist/deploy/types/base.d.ts +14 -0
  105. package/dist/deploy/types/base.js +3 -0
  106. package/dist/deploy/types/custom.d.ts +33 -0
  107. package/dist/deploy/types/custom.js +3 -0
  108. package/dist/deploy/types/dockerTag.d.ts +10 -0
  109. package/dist/deploy/types/dockerTag.js +3 -0
  110. package/dist/deploy/types/googleCloudRun.d.ts +121 -0
  111. package/dist/deploy/types/googleCloudRun.js +3 -0
  112. package/dist/deploy/types/index.d.ts +22 -0
  113. package/dist/deploy/types/index.js +31 -0
  114. package/dist/deploy/types/kubernetes.d.ts +276 -0
  115. package/dist/deploy/types/kubernetes.js +3 -0
  116. package/dist/deploy/utils.d.ts +2 -2
  117. package/dist/deploy/utils.js +3 -10
  118. package/dist/index.js +0 -10
  119. package/dist/pipeline/commitInfo/getBuildId.d.ts +1 -0
  120. package/dist/pipeline/commitInfo/getBuildId.js +135 -0
  121. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +2 -0
  122. package/dist/pipeline/commitInfo/getCommitInfo.js +140 -0
  123. package/dist/pipeline/createAllJobs.d.ts +8 -0
  124. package/dist/{build/tests/storybook.test.js → pipeline/createAllJobs.js} +54 -104
  125. package/dist/pipeline/createChildPipeline.d.ts +2 -2
  126. package/dist/pipeline/createChildPipeline.js +40 -121
  127. package/dist/pipeline/createJobsForComponent.d.ts +3 -0
  128. package/dist/pipeline/{createJobs.js → createJobsForComponent.js} +33 -192
  129. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +14 -0
  130. package/dist/pipeline/gitlab/createGitlabJobs.js +260 -0
  131. package/dist/pipeline/index.d.ts +1 -1
  132. package/dist/pipeline/index.js +1 -5
  133. package/dist/pipeline/packageManager.d.ts +1 -1
  134. package/dist/pipeline/packageManager.js +20 -173
  135. package/dist/pipeline/yarn/yarnUtils.d.ts +4 -0
  136. package/dist/pipeline/yarn/yarnUtils.js +193 -0
  137. package/dist/rules/index.d.ts +3 -1
  138. package/dist/rules/index.js +7 -6
  139. package/dist/runner/index.d.ts +2 -3
  140. package/dist/runner/index.js +0 -3
  141. package/dist/tsconfig.tsbuildinfo +1 -1
  142. package/dist/types/config.d.ts +19 -25
  143. package/dist/types/config.js +6 -16
  144. package/dist/types/context.d.ts +16 -3
  145. package/dist/types/environmentContext.d.ts +28 -0
  146. package/dist/types/environmentContext.js +3 -0
  147. package/dist/types/gitlab-types.d.ts +39 -7
  148. package/dist/types/index.js +0 -6
  149. package/dist/types/jobs.d.ts +25 -17
  150. package/dist/types/jobs.js +1 -1
  151. package/dist/types/pipeline.d.ts +1 -1
  152. package/dist/types/utils.d.ts +1 -0
  153. package/dist/types/utils.js +3 -0
  154. package/dist/utils/gitlab.d.ts +5 -0
  155. package/dist/utils/gitlab.js +48 -0
  156. package/dist/utils/index.js +5 -15
  157. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +1560 -0
  158. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +1560 -0
  159. package/examples/__snapshots__/cloud-run-non-public.ts.snap +1560 -0
  160. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +3092 -0
  161. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +3103 -0
  162. package/examples/__snapshots__/custom-build-job.ts.snap +1162 -0
  163. package/examples/__snapshots__/custom-envs.ts.snap +261 -0
  164. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +2280 -0
  165. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +4077 -0
  166. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +1911 -0
  167. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +1626 -0
  168. package/examples/__utils__/helpers.ts +14 -0
  169. package/examples/cloud-run-memory-limit.ts +28 -0
  170. package/examples/cloud-run-no-cpu-throttling.ts +33 -0
  171. package/examples/cloud-run-non-public.ts +27 -0
  172. package/examples/cloud-run-with-sql-reuse-db.ts +54 -0
  173. package/examples/cloud-run-with-sql.ts +61 -0
  174. package/examples/custom-build-job.ts +28 -0
  175. package/examples/custom-envs.ts +31 -0
  176. package/examples/kubernetes-application-customization.ts +57 -0
  177. package/examples/kubernetes-with-jobs.ts +68 -0
  178. package/examples/rails-k8s-with-worker.ts +95 -0
  179. package/examples/wait-for-other-deploy.ts +36 -0
  180. package/package.json +16 -13
  181. package/scripts/bundle +2 -0
  182. package/src/build/base/createBuildJob.ts +12 -5
  183. package/src/build/base/{getBuildInfo.ts → writeBuildInfo.ts} +2 -2
  184. package/src/build/custom/buildJob.ts +64 -0
  185. package/src/build/custom/index.ts +7 -0
  186. package/src/build/docker.ts +58 -33
  187. package/src/build/index.ts +24 -5
  188. package/src/build/node/buildJob.ts +2 -2
  189. package/src/build/node/cache.ts +19 -8
  190. package/src/build/node/index.ts +1 -1
  191. package/src/build/node/meteor.ts +8 -2
  192. package/src/build/node/testJob.ts +4 -2
  193. package/src/build/node/yarn.ts +21 -10
  194. package/src/build/rails/build.ts +38 -0
  195. package/src/build/rails/index.ts +8 -0
  196. package/src/build/rails/test.ts +86 -0
  197. package/src/build/types.ts +97 -2
  198. package/src/catladder-gitlab.ts +4 -2
  199. package/src/config/{configruedEnvs.test.ts → __tests__/configruedEnvs.test.ts} +3 -3
  200. package/src/config/configruedEnvs.ts +2 -7
  201. package/src/config/readConfig.ts +1 -1
  202. package/src/context/{resolveReferences.test.ts → __tests__/resolveReferences.test.ts} +23 -38
  203. package/src/context/getEnvConfig.ts +21 -0
  204. package/src/context/getEnvType.ts +17 -0
  205. package/src/context/getEnvironment.ts +40 -0
  206. package/src/context/getEnvironmentContext.ts +57 -0
  207. package/src/context/getEnvironmentVariables.ts +155 -0
  208. package/src/context/getLabels.ts +20 -0
  209. package/src/context/index.ts +28 -193
  210. package/src/context/resolveReferences.ts +35 -31
  211. package/src/defaults/index.ts +1 -1
  212. package/src/deploy/base.ts +43 -19
  213. package/src/deploy/cloudRun/deployJob.ts +276 -0
  214. package/src/deploy/cloudRun/index.ts +95 -0
  215. package/src/deploy/cloudRun/utils/createArgsString.ts +26 -0
  216. package/src/deploy/cloudRun/utils/database.ts +55 -0
  217. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +14 -0
  218. package/src/deploy/cloudRun/utils/jobName.ts +2 -0
  219. package/src/deploy/custom/deployJob.ts +13 -3
  220. package/src/deploy/custom/index.ts +9 -1
  221. package/src/deploy/dockerTag/deployJob.ts +31 -0
  222. package/src/deploy/dockerTag/index.ts +9 -0
  223. package/src/deploy/index.ts +26 -17
  224. package/src/deploy/kubernetes/additionalSecretKeys.ts +23 -0
  225. package/src/deploy/kubernetes/cloudSql/index.ts +28 -0
  226. package/src/deploy/kubernetes/deployJob.ts +21 -78
  227. package/src/deploy/kubernetes/index.ts +42 -1
  228. package/src/deploy/kubernetes/kubeEnv.ts +48 -0
  229. package/src/deploy/kubernetes/kubeValues.ts +96 -0
  230. package/src/deploy/kubernetes/mongodb.ts +104 -7
  231. package/src/deploy/kubernetes/processSecretsAsFiles.ts +1 -1
  232. package/src/deploy/types/base.ts +17 -0
  233. package/src/deploy/types/custom.ts +36 -0
  234. package/src/deploy/types/dockerTag.ts +12 -0
  235. package/src/deploy/types/googleCloudRun.ts +179 -0
  236. package/src/deploy/types/index.ts +28 -0
  237. package/src/deploy/types/kubernetes.ts +301 -0
  238. package/src/deploy/utils.ts +6 -2
  239. package/src/pipeline/commitInfo/getBuildId.ts +6 -0
  240. package/src/pipeline/commitInfo/getCommitInfo.ts +12 -0
  241. package/src/pipeline/createAllJobs.ts +38 -0
  242. package/src/pipeline/createChildPipeline.ts +9 -20
  243. package/src/pipeline/createJobsForComponent.ts +64 -0
  244. package/src/pipeline/gitlab/createGitlabJobs.ts +149 -0
  245. package/src/pipeline/index.ts +1 -1
  246. package/src/pipeline/packageManager.ts +4 -38
  247. package/src/pipeline/yarn/yarnUtils.ts +37 -0
  248. package/src/rules/index.ts +9 -6
  249. package/src/runner/index.ts +2 -1
  250. package/src/types/config.ts +26 -13
  251. package/src/types/context.ts +23 -2
  252. package/src/types/environmentContext.ts +33 -0
  253. package/src/types/gitlab-types.ts +36 -6
  254. package/src/types/jobs.ts +30 -6
  255. package/src/types/pipeline.ts +1 -1
  256. package/src/types/utils.ts +7 -0
  257. package/src/utils/gitlab.ts +23 -0
  258. package/tsconfig.json +3 -1
  259. package/dist/build/base/getBuildInfo.d.ts +0 -2
  260. package/dist/build/tests/storybook.test.d.ts +0 -1
  261. package/dist/context/resolveReferences.test.js +0 -141
  262. package/dist/deploy/kubernetes/cloudsql.d.ts +0 -6
  263. package/dist/deploy/kubernetes/cloudsql.js +0 -16
  264. package/dist/deploy/types.d.ts +0 -196
  265. package/dist/deploy/types.js +0 -16
  266. package/dist/pipeline/createChildPipeline.test.d.ts +0 -1
  267. package/dist/pipeline/createJobs.d.ts +0 -3
  268. package/dist/pipeline/gitlab/makeGitlabJob.d.ts +0 -8
  269. package/dist/pipeline/gitlab/makeGitlabJob.js +0 -45
  270. package/src/build/tests/storybook.test.ts +0 -54
  271. package/src/deploy/kubernetes/cloudsql.ts +0 -12
  272. package/src/deploy/types.ts +0 -189
  273. package/src/pipeline/createChildPipeline.test.ts +0 -49
  274. package/src/pipeline/createJobs.ts +0 -195
  275. package/src/pipeline/gitlab/makeGitlabJob.ts +0 -16
@@ -0,0 +1,3103 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot 1`] = `
4
+ {
5
+ "mainBranch": {
6
+ "image": "path/to/docker/jobs-default:the-version",
7
+ "jobs": {
8
+ "api 👮 lint": {
9
+ "cache": [
10
+ {
11
+ "key": "api-yarn",
12
+ "paths": [
13
+ "api/.yarn",
14
+ ],
15
+ "policy": "pull-push",
16
+ },
17
+ {
18
+ "key": "api-node-modules",
19
+ "paths": [
20
+ "api/node_modules",
21
+ ],
22
+ "policy": "pull-push",
23
+ },
24
+ ],
25
+ "environment": undefined,
26
+ "interruptible": true,
27
+ "needs": [],
28
+ "retry": {
29
+ "max": 2,
30
+ "when": [
31
+ "runner_system_failure",
32
+ "stuck_or_timeout_failure",
33
+ ],
34
+ },
35
+ "script": [
36
+ "cd api",
37
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
38
+ "yarn install --immutable",
39
+ "yarn lint",
40
+ ],
41
+ "stage": "test",
42
+ "variables": {
43
+ "APP_PATH": "api",
44
+ "KUBERNETES_CPU_LIMIT": "2",
45
+ "KUBERNETES_CPU_REQUEST": "0.5",
46
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
47
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
48
+ },
49
+ },
50
+ "api 🔨 app | dev ": {
51
+ "artifacts": {
52
+ "paths": [
53
+ "api/__build_info.json",
54
+ "api/dist",
55
+ "api/.next",
56
+ ],
57
+ "reports": {
58
+ "junit": undefined,
59
+ },
60
+ },
61
+ "cache": [
62
+ {
63
+ "key": "api-yarn",
64
+ "paths": [
65
+ "api/.yarn",
66
+ ],
67
+ "policy": "pull-push",
68
+ },
69
+ {
70
+ "key": "api-node-modules",
71
+ "paths": [
72
+ "api/node_modules",
73
+ ],
74
+ "policy": "pull-push",
75
+ },
76
+ {
77
+ "key": "api-next-cache",
78
+ "paths": [
79
+ "api/.next/cache/",
80
+ ],
81
+ "policy": "pull-push",
82
+ },
83
+ ],
84
+ "environment": undefined,
85
+ "image": "path/to/docker/jobs-default:the-version",
86
+ "interruptible": true,
87
+ "needs": [],
88
+ "retry": {
89
+ "max": 2,
90
+ "when": [
91
+ "runner_system_failure",
92
+ "stuck_or_timeout_failure",
93
+ ],
94
+ },
95
+ "script": [
96
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
97
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
98
+ "cd api",
99
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
100
+ "yarn install --immutable",
101
+ "yarn build",
102
+ ],
103
+ "stage": "build",
104
+ "variables": {
105
+ "APP_DIR": "api",
106
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run",
107
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run",
108
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
109
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
110
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
111
+ "DB_NAME": "pan-test-app-dev-api",
112
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
113
+ "DB_USER": "my-user",
114
+ "ENV_SHORT": "dev",
115
+ "ENV_TYPE": "dev",
116
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
117
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
118
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
119
+ "KUBERNETES_CPU_LIMIT": "2",
120
+ "KUBERNETES_CPU_REQUEST": "0.5",
121
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
122
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
123
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
124
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
125
+ },
126
+ },
127
+ "api 🔨 docker | dev ": {
128
+ "cache": [
129
+ {
130
+ "key": "api-yarn",
131
+ "paths": [
132
+ "api/.yarn",
133
+ ],
134
+ "policy": "pull",
135
+ },
136
+ ],
137
+ "environment": undefined,
138
+ "image": "path/to/docker/docker-build:the-version",
139
+ "interruptible": true,
140
+ "needs": [
141
+ "api 🔨 app | dev ",
142
+ ],
143
+ "retry": {
144
+ "max": 2,
145
+ "when": [
146
+ "runner_system_failure",
147
+ "stuck_or_timeout_failure",
148
+ ],
149
+ },
150
+ "script": [
151
+ "ensureNodeDockerfile",
152
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
153
+ "docker version",
154
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
155
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
156
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
157
+ "docker push $DOCKER_CACHE_IMAGE",
158
+ ],
159
+ "services": [
160
+ {
161
+ "command": [
162
+ "--tls=false",
163
+ ],
164
+ "name": "docker:20-dind",
165
+ },
166
+ ],
167
+ "stage": "build",
168
+ "variables": {
169
+ "APP_DIR": "api",
170
+ "DOCKERFILE_ADDITIONS": undefined,
171
+ "DOCKERFILE_ADDITIONS_END": undefined,
172
+ "DOCKER_BUILDKIT": "1",
173
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
174
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
175
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
176
+ "DOCKER_DIR": ".",
177
+ "DOCKER_DRIVER": "overlay2",
178
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
179
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
180
+ "DOCKER_IMAGE_NAME": "dev/api",
181
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
182
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
183
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
184
+ "DOCKER_TLS_CERTDIR": "",
185
+ "KUBERNETES_CPU_LIMIT": "1",
186
+ "KUBERNETES_CPU_REQUEST": "0.5",
187
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
188
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
189
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
190
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
191
+ },
192
+ },
193
+ "api 🚀 Deploy | dev ": {
194
+ "allow_failure": false,
195
+ "artifacts": {
196
+ "paths": [
197
+ "____envvars.yaml",
198
+ ],
199
+ },
200
+ "environment": {
201
+ "auto_stop_in": "4 weeks",
202
+ "name": "dev/api",
203
+ "on_stop": "api 🛑 Stop ⚠️ | dev ",
204
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
205
+ },
206
+ "image": "path/to/docker/gcloud:the-version",
207
+ "interruptible": true,
208
+ "needs": [
209
+ {
210
+ "artifacts": false,
211
+ "job": "api 👮 lint",
212
+ },
213
+ {
214
+ "artifacts": false,
215
+ "job": "api 🔨 app | dev ",
216
+ },
217
+ {
218
+ "artifacts": false,
219
+ "job": "api 🔨 docker | dev ",
220
+ },
221
+ {
222
+ "artifacts": false,
223
+ "job": "api 🧪 test",
224
+ },
225
+ {
226
+ "artifacts": false,
227
+ "job": "api 🛡 audit",
228
+ },
229
+ ],
230
+ "retry": {
231
+ "max": 2,
232
+ "when": [
233
+ "runner_system_failure",
234
+ "stuck_or_timeout_failure",
235
+ ],
236
+ },
237
+ "rules": [
238
+ {
239
+ "when": "on_success",
240
+ },
241
+ ],
242
+ "script": [
243
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
244
+ ",
245
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
246
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
247
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
248
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
249
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
250
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
251
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
252
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
253
+ "echo "$ENV_VARS" > ____envvars.yaml",
254
+ "set +e",
255
+ "echo "ensuring Database..."",
256
+ "gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId",
257
+ "set -e",
258
+ "set +e",
259
+ "gcloud scheduler jobs create http pan-test-app-dev-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
260
+ "set -e",
261
+ "gcloud scheduler jobs update http pan-test-app-dev-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
262
+ "set +e",
263
+ "gcloud beta run jobs create pan-test-app-dev-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --memory=512Mi",
264
+ "set -e",
265
+ "gcloud beta run jobs update pan-test-app-dev-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
266
+ "set +e",
267
+ "gcloud beta run jobs create pan-test-app-dev-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --memory=512Mi",
268
+ "set -e",
269
+ "gcloud beta run jobs update pan-test-app-dev-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
270
+ "gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated",
271
+ "gcloud beta run jobs execute pan-test-app-dev-api-migration --project=google-project-id --region=europe-west6",
272
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
273
+ ],
274
+ "services": [
275
+ {
276
+ "command": [
277
+ "--tls=false",
278
+ ],
279
+ "name": "docker:20-dind",
280
+ },
281
+ ],
282
+ "stage": "deploy dev",
283
+ "variables": {
284
+ "APP_DIR": "api",
285
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
286
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run",
287
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run",
288
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
289
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
290
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
291
+ "DB_NAME": "pan-test-app-dev-api",
292
+ "DB_PASSWORD": "$CL_dev_api_DB_PASSWORD",
293
+ "DB_USER": "my-user",
294
+ "DOCKER_BUILDKIT": "1",
295
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
296
+ "DOCKER_DRIVER": "overlay2",
297
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
298
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
299
+ "DOCKER_IMAGE_NAME": "dev/api",
300
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
301
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
302
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
303
+ "DOCKER_TLS_CERTDIR": "",
304
+ "ENV_SHORT": "dev",
305
+ "ENV_TYPE": "dev",
306
+ "ENV_VARS": "ENV_SHORT: 'dev'
307
+ APP_DIR: 'api'
308
+ ENV_TYPE: 'dev'
309
+ HOST: 'pan-test-app-dev-api-unknown-host.example.com'
310
+ ROOT_URL: 'https://pan-test-app-dev-api-unknown-host.example.com'
311
+ HOST_CANONICAL: 'pan-test-app-dev-api-unknown-host.example.com'
312
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
313
+ DB_NAME: 'pan-test-app-dev-api'
314
+ DB_USER: 'my-user'
315
+ DB_PASSWORD: '$CL_dev_api_DB_PASSWORD'
316
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
317
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
318
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run'
319
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run'
320
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]'
321
+ ",
322
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey",
323
+ "HOST": "pan-test-app-dev-api-unknown-host.example.com",
324
+ "HOST_CANONICAL": "pan-test-app-dev-api-unknown-host.example.com",
325
+ "KUBERNETES_CPU_LIMIT": "1",
326
+ "KUBERNETES_CPU_REQUEST": "0.5",
327
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
328
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
329
+ "ROOT_URL": "https://pan-test-app-dev-api-unknown-host.example.com",
330
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
331
+ },
332
+ },
333
+ "api 🛑 Stop ⚠️ | dev ": {
334
+ "environment": {
335
+ "action": "stop",
336
+ "name": "dev/api",
337
+ "url": "https://pan-test-app-dev-api-unknown-host.example.com",
338
+ },
339
+ "image": "path/to/docker/gcloud:the-version",
340
+ "interruptible": true,
341
+ "needs": [],
342
+ "retry": {
343
+ "max": 2,
344
+ "when": [
345
+ "runner_system_failure",
346
+ "stuck_or_timeout_failure",
347
+ ],
348
+ },
349
+ "rules": [
350
+ {
351
+ "allow_failure": true,
352
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
353
+ "when": "on_success",
354
+ },
355
+ {
356
+ "allow_failure": true,
357
+ "when": "manual",
358
+ },
359
+ ],
360
+ "script": [
361
+ "echo $CL_dev_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
362
+ ",
363
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
364
+ "gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6",
365
+ "set +e",
366
+ "gcloud scheduler jobs delete pan-test-app-dev-api-send-reminders-scheduler --project=google-project-id --location=europe-west6",
367
+ "set -e",
368
+ "gcloud beta run jobs delete pan-test-app-dev-api-migration --project=google-project-id --region=europe-west6",
369
+ "gcloud beta run jobs delete pan-test-app-dev-api-send-reminders --project=google-project-id --region=europe-west6",
370
+ ],
371
+ "stage": "stop dev",
372
+ "variables": {
373
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
374
+ "GIT_STRATEGY": "none",
375
+ "KUBERNETES_CPU_LIMIT": "1",
376
+ "KUBERNETES_CPU_REQUEST": "0.5",
377
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
378
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
379
+ },
380
+ },
381
+ "api 🛡 audit": {
382
+ "allow_failure": true,
383
+ "cache": undefined,
384
+ "environment": undefined,
385
+ "interruptible": true,
386
+ "needs": [],
387
+ "retry": {
388
+ "max": 2,
389
+ "when": [
390
+ "runner_system_failure",
391
+ "stuck_or_timeout_failure",
392
+ ],
393
+ },
394
+ "script": [
395
+ "cd api",
396
+ "yarn npm audit --environment production",
397
+ ],
398
+ "stage": "test",
399
+ "variables": {
400
+ "APP_PATH": "api",
401
+ "KUBERNETES_CPU_LIMIT": "2",
402
+ "KUBERNETES_CPU_REQUEST": "0.5",
403
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
404
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
405
+ },
406
+ },
407
+ "api 🧪 test": {
408
+ "cache": [
409
+ {
410
+ "key": "api-yarn",
411
+ "paths": [
412
+ "api/.yarn",
413
+ ],
414
+ "policy": "pull-push",
415
+ },
416
+ {
417
+ "key": "api-node-modules",
418
+ "paths": [
419
+ "api/node_modules",
420
+ ],
421
+ "policy": "pull-push",
422
+ },
423
+ ],
424
+ "environment": undefined,
425
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
426
+ "interruptible": true,
427
+ "needs": [],
428
+ "retry": {
429
+ "max": 2,
430
+ "when": [
431
+ "runner_system_failure",
432
+ "stuck_or_timeout_failure",
433
+ ],
434
+ },
435
+ "script": [
436
+ "cd api",
437
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
438
+ "yarn install --immutable",
439
+ "yarn test",
440
+ ],
441
+ "stage": "test",
442
+ "variables": {
443
+ "APP_PATH": "api",
444
+ "KUBERNETES_CPU_LIMIT": "2",
445
+ "KUBERNETES_CPU_REQUEST": "0.5",
446
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
447
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
448
+ },
449
+ },
450
+ "www 👮 lint": {
451
+ "cache": [
452
+ {
453
+ "key": "www-yarn",
454
+ "paths": [
455
+ "www/.yarn",
456
+ ],
457
+ "policy": "pull-push",
458
+ },
459
+ {
460
+ "key": "www-node-modules",
461
+ "paths": [
462
+ "www/node_modules",
463
+ ],
464
+ "policy": "pull-push",
465
+ },
466
+ ],
467
+ "environment": undefined,
468
+ "interruptible": true,
469
+ "needs": [],
470
+ "retry": {
471
+ "max": 2,
472
+ "when": [
473
+ "runner_system_failure",
474
+ "stuck_or_timeout_failure",
475
+ ],
476
+ },
477
+ "script": [
478
+ "cd www",
479
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
480
+ "yarn install --immutable",
481
+ "yarn lint",
482
+ ],
483
+ "stage": "test",
484
+ "variables": {
485
+ "APP_PATH": "www",
486
+ "KUBERNETES_CPU_LIMIT": "2",
487
+ "KUBERNETES_CPU_REQUEST": "0.5",
488
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
489
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
490
+ },
491
+ },
492
+ "www 🔨 app | dev ": {
493
+ "artifacts": {
494
+ "paths": [
495
+ "www/__build_info.json",
496
+ "www/dist",
497
+ "www/.next",
498
+ ],
499
+ "reports": {
500
+ "junit": undefined,
501
+ },
502
+ },
503
+ "cache": [
504
+ {
505
+ "key": "www-yarn",
506
+ "paths": [
507
+ "www/.yarn",
508
+ ],
509
+ "policy": "pull-push",
510
+ },
511
+ {
512
+ "key": "www-node-modules",
513
+ "paths": [
514
+ "www/node_modules",
515
+ ],
516
+ "policy": "pull-push",
517
+ },
518
+ {
519
+ "key": "www-next-cache",
520
+ "paths": [
521
+ "www/.next/cache/",
522
+ ],
523
+ "policy": "pull-push",
524
+ },
525
+ ],
526
+ "environment": undefined,
527
+ "image": "path/to/docker/jobs-default:the-version",
528
+ "interruptible": true,
529
+ "needs": [],
530
+ "retry": {
531
+ "max": 2,
532
+ "when": [
533
+ "runner_system_failure",
534
+ "stuck_or_timeout_failure",
535
+ ],
536
+ },
537
+ "script": [
538
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > www/__build_info.json",
539
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
540
+ "cd www",
541
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
542
+ "yarn install --immutable",
543
+ "yarn build",
544
+ ],
545
+ "stage": "build",
546
+ "variables": {
547
+ "API_URL": "https://pan-test-app-dev-api-unknown-host.example.com/graphql",
548
+ "APP_DIR": "www",
549
+ "ENV_SHORT": "dev",
550
+ "ENV_TYPE": "dev",
551
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey",
552
+ "HOST": "pan-test-app-dev-www-unknown-host.example.com",
553
+ "HOST_CANONICAL": "pan-test-app-dev-www-unknown-host.example.com",
554
+ "KUBERNETES_CPU_LIMIT": "2",
555
+ "KUBERNETES_CPU_REQUEST": "0.5",
556
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
557
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
558
+ "ROOT_URL": "https://pan-test-app-dev-www-unknown-host.example.com",
559
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
560
+ },
561
+ },
562
+ "www 🔨 docker | dev ": {
563
+ "cache": [
564
+ {
565
+ "key": "www-yarn",
566
+ "paths": [
567
+ "www/.yarn",
568
+ ],
569
+ "policy": "pull",
570
+ },
571
+ ],
572
+ "environment": undefined,
573
+ "image": "path/to/docker/docker-build:the-version",
574
+ "interruptible": true,
575
+ "needs": [
576
+ "www 🔨 app | dev ",
577
+ ],
578
+ "retry": {
579
+ "max": 2,
580
+ "when": [
581
+ "runner_system_failure",
582
+ "stuck_or_timeout_failure",
583
+ ],
584
+ },
585
+ "script": [
586
+ "ensureNodeDockerfile",
587
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
588
+ "docker version",
589
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
590
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
591
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
592
+ "docker push $DOCKER_CACHE_IMAGE",
593
+ ],
594
+ "services": [
595
+ {
596
+ "command": [
597
+ "--tls=false",
598
+ ],
599
+ "name": "docker:20-dind",
600
+ },
601
+ ],
602
+ "stage": "build",
603
+ "variables": {
604
+ "APP_DIR": "www",
605
+ "DOCKERFILE_ADDITIONS": undefined,
606
+ "DOCKERFILE_ADDITIONS_END": undefined,
607
+ "DOCKER_BUILDKIT": "1",
608
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
609
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node www/package.json /app/www/package.json
610
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock",
611
+ "DOCKER_DIR": ".",
612
+ "DOCKER_DRIVER": "overlay2",
613
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
614
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
615
+ "DOCKER_IMAGE_NAME": "dev/www",
616
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
617
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
618
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
619
+ "DOCKER_TLS_CERTDIR": "",
620
+ "KUBERNETES_CPU_LIMIT": "1",
621
+ "KUBERNETES_CPU_REQUEST": "0.5",
622
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
623
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
624
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
625
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
626
+ },
627
+ },
628
+ "www 🚀 Deploy | dev ": {
629
+ "allow_failure": false,
630
+ "artifacts": {
631
+ "paths": [
632
+ "____envvars.yaml",
633
+ ],
634
+ },
635
+ "environment": {
636
+ "auto_stop_in": "4 weeks",
637
+ "name": "dev/www",
638
+ "on_stop": "www 🛑 Stop ⚠️ | dev ",
639
+ "url": "https://pan-test-app-dev-www-unknown-host.example.com",
640
+ },
641
+ "image": "path/to/docker/gcloud:the-version",
642
+ "interruptible": true,
643
+ "needs": [
644
+ {
645
+ "artifacts": false,
646
+ "job": "www 👮 lint",
647
+ },
648
+ {
649
+ "artifacts": false,
650
+ "job": "www 🔨 app | dev ",
651
+ },
652
+ {
653
+ "artifacts": false,
654
+ "job": "www 🔨 docker | dev ",
655
+ },
656
+ {
657
+ "artifacts": false,
658
+ "job": "www 🧪 test",
659
+ },
660
+ {
661
+ "artifacts": false,
662
+ "job": "www 🛡 audit",
663
+ },
664
+ ],
665
+ "retry": {
666
+ "max": 2,
667
+ "when": [
668
+ "runner_system_failure",
669
+ "stuck_or_timeout_failure",
670
+ ],
671
+ },
672
+ "rules": [
673
+ {
674
+ "when": "on_success",
675
+ },
676
+ ],
677
+ "script": [
678
+ "echo $CL_dev_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
679
+ ",
680
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
681
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
682
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
683
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
684
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
685
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
686
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
687
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
688
+ "echo "$ENV_VARS" > ____envvars.yaml",
689
+ "gcloud run deploy pan-test-app-dev-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,app-name=test-app,env-type=dev,env-name=dev,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
690
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
691
+ ],
692
+ "services": [
693
+ {
694
+ "command": [
695
+ "--tls=false",
696
+ ],
697
+ "name": "docker:20-dind",
698
+ },
699
+ ],
700
+ "stage": "deploy dev",
701
+ "variables": {
702
+ "API_URL": "https://pan-test-app-dev-api-unknown-host.example.com/graphql",
703
+ "APP_DIR": "www",
704
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
705
+ "DOCKER_BUILDKIT": "1",
706
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
707
+ "DOCKER_DRIVER": "overlay2",
708
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
709
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
710
+ "DOCKER_IMAGE_NAME": "dev/www",
711
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
712
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
713
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
714
+ "DOCKER_TLS_CERTDIR": "",
715
+ "ENV_SHORT": "dev",
716
+ "ENV_TYPE": "dev",
717
+ "ENV_VARS": "ENV_SHORT: 'dev'
718
+ APP_DIR: 'www'
719
+ ENV_TYPE: 'dev'
720
+ HOST: 'pan-test-app-dev-www-unknown-host.example.com'
721
+ ROOT_URL: 'https://pan-test-app-dev-www-unknown-host.example.com'
722
+ HOST_CANONICAL: 'pan-test-app-dev-www-unknown-host.example.com'
723
+ API_URL: 'https://pan-test-app-dev-api-unknown-host.example.com/graphql'
724
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]'
725
+ ",
726
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey",
727
+ "HOST": "pan-test-app-dev-www-unknown-host.example.com",
728
+ "HOST_CANONICAL": "pan-test-app-dev-www-unknown-host.example.com",
729
+ "KUBERNETES_CPU_LIMIT": "1",
730
+ "KUBERNETES_CPU_REQUEST": "0.5",
731
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
732
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
733
+ "ROOT_URL": "https://pan-test-app-dev-www-unknown-host.example.com",
734
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
735
+ },
736
+ },
737
+ "www 🛑 Stop ⚠️ | dev ": {
738
+ "environment": {
739
+ "action": "stop",
740
+ "name": "dev/www",
741
+ "url": "https://pan-test-app-dev-www-unknown-host.example.com",
742
+ },
743
+ "image": "path/to/docker/gcloud:the-version",
744
+ "interruptible": true,
745
+ "needs": [],
746
+ "retry": {
747
+ "max": 2,
748
+ "when": [
749
+ "runner_system_failure",
750
+ "stuck_or_timeout_failure",
751
+ ],
752
+ },
753
+ "rules": [
754
+ {
755
+ "allow_failure": true,
756
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
757
+ "when": "on_success",
758
+ },
759
+ {
760
+ "allow_failure": true,
761
+ "when": "manual",
762
+ },
763
+ ],
764
+ "script": [
765
+ "echo $CL_dev_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
766
+ ",
767
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
768
+ "gcloud run services delete pan-test-app-dev-www --project=google-project-id --region=europe-west6",
769
+ ],
770
+ "stage": "stop dev",
771
+ "variables": {
772
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
773
+ "GIT_STRATEGY": "none",
774
+ "KUBERNETES_CPU_LIMIT": "1",
775
+ "KUBERNETES_CPU_REQUEST": "0.5",
776
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
777
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
778
+ },
779
+ },
780
+ "www 🛡 audit": {
781
+ "allow_failure": true,
782
+ "cache": undefined,
783
+ "environment": undefined,
784
+ "interruptible": true,
785
+ "needs": [],
786
+ "retry": {
787
+ "max": 2,
788
+ "when": [
789
+ "runner_system_failure",
790
+ "stuck_or_timeout_failure",
791
+ ],
792
+ },
793
+ "script": [
794
+ "cd www",
795
+ "yarn npm audit --environment production",
796
+ ],
797
+ "stage": "test",
798
+ "variables": {
799
+ "APP_PATH": "www",
800
+ "KUBERNETES_CPU_LIMIT": "2",
801
+ "KUBERNETES_CPU_REQUEST": "0.5",
802
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
803
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
804
+ },
805
+ },
806
+ "www 🧪 test": {
807
+ "cache": [
808
+ {
809
+ "key": "www-yarn",
810
+ "paths": [
811
+ "www/.yarn",
812
+ ],
813
+ "policy": "pull-push",
814
+ },
815
+ {
816
+ "key": "www-node-modules",
817
+ "paths": [
818
+ "www/node_modules",
819
+ ],
820
+ "policy": "pull-push",
821
+ },
822
+ ],
823
+ "environment": undefined,
824
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
825
+ "interruptible": true,
826
+ "needs": [],
827
+ "retry": {
828
+ "max": 2,
829
+ "when": [
830
+ "runner_system_failure",
831
+ "stuck_or_timeout_failure",
832
+ ],
833
+ },
834
+ "script": [
835
+ "cd www",
836
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
837
+ "yarn install --immutable",
838
+ "yarn test",
839
+ ],
840
+ "stage": "test",
841
+ "variables": {
842
+ "APP_PATH": "www",
843
+ "KUBERNETES_CPU_LIMIT": "2",
844
+ "KUBERNETES_CPU_REQUEST": "0.5",
845
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
846
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
847
+ },
848
+ },
849
+ },
850
+ "stages": [
851
+ "setup",
852
+ "setup dev",
853
+ "setup review",
854
+ "setup stage",
855
+ "setup prod",
856
+ "setup local",
857
+ "test",
858
+ "test dev",
859
+ "test review",
860
+ "test stage",
861
+ "test prod",
862
+ "test local",
863
+ "build",
864
+ "build dev",
865
+ "build review",
866
+ "build stage",
867
+ "build prod",
868
+ "build local",
869
+ "deploy",
870
+ "deploy dev",
871
+ "deploy review",
872
+ "deploy stage",
873
+ "deploy prod",
874
+ "deploy local",
875
+ "verify",
876
+ "verify dev",
877
+ "verify review",
878
+ "verify stage",
879
+ "verify prod",
880
+ "verify local",
881
+ "rollback",
882
+ "rollback dev",
883
+ "rollback review",
884
+ "rollback stage",
885
+ "rollback prod",
886
+ "rollback local",
887
+ "stop",
888
+ "stop dev",
889
+ "stop review",
890
+ "stop stage",
891
+ "stop prod",
892
+ "stop local",
893
+ ],
894
+ "variables": {
895
+ "FF_USE_FASTZIP": "true",
896
+ },
897
+ "workflow": {
898
+ "rules": [
899
+ {
900
+ "if": "$CI_COMMIT_TAG",
901
+ },
902
+ {
903
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
904
+ "when": "never",
905
+ },
906
+ {
907
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
908
+ },
909
+ {
910
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
911
+ },
912
+ {
913
+ "if": "$CI_MERGE_REQUEST_ID",
914
+ },
915
+ ],
916
+ },
917
+ },
918
+ "mr": {
919
+ "image": "path/to/docker/jobs-default:the-version",
920
+ "jobs": {
921
+ "api 👮 lint": {
922
+ "cache": [
923
+ {
924
+ "key": "api-yarn",
925
+ "paths": [
926
+ "api/.yarn",
927
+ ],
928
+ "policy": "pull-push",
929
+ },
930
+ {
931
+ "key": "api-node-modules",
932
+ "paths": [
933
+ "api/node_modules",
934
+ ],
935
+ "policy": "pull-push",
936
+ },
937
+ ],
938
+ "environment": undefined,
939
+ "interruptible": true,
940
+ "needs": [],
941
+ "retry": {
942
+ "max": 2,
943
+ "when": [
944
+ "runner_system_failure",
945
+ "stuck_or_timeout_failure",
946
+ ],
947
+ },
948
+ "script": [
949
+ "cd api",
950
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
951
+ "yarn install --immutable",
952
+ "yarn lint",
953
+ ],
954
+ "stage": "test",
955
+ "variables": {
956
+ "APP_PATH": "api",
957
+ "KUBERNETES_CPU_LIMIT": "2",
958
+ "KUBERNETES_CPU_REQUEST": "0.5",
959
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
960
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
961
+ },
962
+ },
963
+ "api 🔨 app | review ": {
964
+ "artifacts": {
965
+ "paths": [
966
+ "api/__build_info.json",
967
+ "api/dist",
968
+ "api/.next",
969
+ ],
970
+ "reports": {
971
+ "junit": undefined,
972
+ },
973
+ },
974
+ "cache": [
975
+ {
976
+ "key": "api-yarn",
977
+ "paths": [
978
+ "api/.yarn",
979
+ ],
980
+ "policy": "pull-push",
981
+ },
982
+ {
983
+ "key": "api-node-modules",
984
+ "paths": [
985
+ "api/node_modules",
986
+ ],
987
+ "policy": "pull-push",
988
+ },
989
+ {
990
+ "key": "api-next-cache",
991
+ "paths": [
992
+ "api/.next/cache/",
993
+ ],
994
+ "policy": "pull-push",
995
+ },
996
+ ],
997
+ "environment": undefined,
998
+ "image": "path/to/docker/jobs-default:the-version",
999
+ "interruptible": true,
1000
+ "needs": [],
1001
+ "retry": {
1002
+ "max": 2,
1003
+ "when": [
1004
+ "runner_system_failure",
1005
+ "stuck_or_timeout_failure",
1006
+ ],
1007
+ },
1008
+ "script": [
1009
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1010
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1011
+ "cd api",
1012
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1013
+ "yarn install --immutable",
1014
+ "yarn build",
1015
+ ],
1016
+ "stage": "build",
1017
+ "variables": {
1018
+ "APP_DIR": "api",
1019
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-migration:run",
1020
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-send-reminders:run",
1021
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1022
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1023
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1024
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1025
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1026
+ "DB_USER": "my-user",
1027
+ "ENV_SHORT": "review",
1028
+ "ENV_TYPE": "review",
1029
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
1030
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1031
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1032
+ "KUBERNETES_CPU_LIMIT": "2",
1033
+ "KUBERNETES_CPU_REQUEST": "0.5",
1034
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1035
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1036
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1037
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
1038
+ },
1039
+ },
1040
+ "api 🔨 docker | review ": {
1041
+ "cache": [
1042
+ {
1043
+ "key": "api-yarn",
1044
+ "paths": [
1045
+ "api/.yarn",
1046
+ ],
1047
+ "policy": "pull",
1048
+ },
1049
+ ],
1050
+ "environment": undefined,
1051
+ "image": "path/to/docker/docker-build:the-version",
1052
+ "interruptible": true,
1053
+ "needs": [
1054
+ "api 🔨 app | review ",
1055
+ ],
1056
+ "retry": {
1057
+ "max": 2,
1058
+ "when": [
1059
+ "runner_system_failure",
1060
+ "stuck_or_timeout_failure",
1061
+ ],
1062
+ },
1063
+ "script": [
1064
+ "ensureNodeDockerfile",
1065
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1066
+ "docker version",
1067
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1068
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1069
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1070
+ "docker push $DOCKER_CACHE_IMAGE",
1071
+ ],
1072
+ "services": [
1073
+ {
1074
+ "command": [
1075
+ "--tls=false",
1076
+ ],
1077
+ "name": "docker:20-dind",
1078
+ },
1079
+ ],
1080
+ "stage": "build",
1081
+ "variables": {
1082
+ "APP_DIR": "api",
1083
+ "DOCKERFILE_ADDITIONS": undefined,
1084
+ "DOCKERFILE_ADDITIONS_END": undefined,
1085
+ "DOCKER_BUILDKIT": "1",
1086
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1087
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1088
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
1089
+ "DOCKER_DIR": ".",
1090
+ "DOCKER_DRIVER": "overlay2",
1091
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1092
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1093
+ "DOCKER_IMAGE_NAME": "review/api",
1094
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1095
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1096
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1097
+ "DOCKER_TLS_CERTDIR": "",
1098
+ "KUBERNETES_CPU_LIMIT": "1",
1099
+ "KUBERNETES_CPU_REQUEST": "0.5",
1100
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1101
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1102
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1103
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1104
+ },
1105
+ },
1106
+ "api 🚀 Deploy | review ": {
1107
+ "allow_failure": false,
1108
+ "artifacts": {
1109
+ "paths": [
1110
+ "____envvars.yaml",
1111
+ ],
1112
+ },
1113
+ "environment": {
1114
+ "auto_stop_in": "2 week",
1115
+ "name": "review/some-commit/api",
1116
+ "on_stop": "api 🛑 Stop ⚠️ | review ",
1117
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1118
+ },
1119
+ "image": "path/to/docker/gcloud:the-version",
1120
+ "interruptible": true,
1121
+ "needs": [
1122
+ {
1123
+ "artifacts": false,
1124
+ "job": "api 👮 lint",
1125
+ },
1126
+ {
1127
+ "artifacts": false,
1128
+ "job": "api 🔨 app | review ",
1129
+ },
1130
+ {
1131
+ "artifacts": false,
1132
+ "job": "api 🔨 docker | review ",
1133
+ },
1134
+ {
1135
+ "artifacts": false,
1136
+ "job": "api 🧪 test",
1137
+ },
1138
+ {
1139
+ "artifacts": false,
1140
+ "job": "api 🛡 audit",
1141
+ },
1142
+ ],
1143
+ "retry": {
1144
+ "max": 2,
1145
+ "when": [
1146
+ "runner_system_failure",
1147
+ "stuck_or_timeout_failure",
1148
+ ],
1149
+ },
1150
+ "rules": [
1151
+ {
1152
+ "when": "on_success",
1153
+ },
1154
+ ],
1155
+ "script": [
1156
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1157
+ ",
1158
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1159
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1160
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1161
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1162
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1163
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1164
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1165
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1166
+ "echo "$ENV_VARS" > ____envvars.yaml",
1167
+ "set +e",
1168
+ "echo "ensuring Database..."",
1169
+ "gcloud sql databases create pan-test-app-review-mr1234-api --instance=instancename --project projectId",
1170
+ "set -e",
1171
+ "set +e",
1172
+ "gcloud scheduler jobs create http pan-test-app-review-mr1234-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
1173
+ "set -e",
1174
+ "gcloud scheduler jobs update http pan-test-app-review-mr1234-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
1175
+ "set +e",
1176
+ "gcloud beta run jobs create pan-test-app-review-mr1234-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --memory=512Mi",
1177
+ "set -e",
1178
+ "gcloud beta run jobs update pan-test-app-review-mr1234-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
1179
+ "set +e",
1180
+ "gcloud beta run jobs create pan-test-app-review-mr1234-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --memory=512Mi",
1181
+ "set -e",
1182
+ "gcloud beta run jobs update pan-test-app-review-mr1234-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
1183
+ "gcloud run deploy pan-test-app-review-mr1234-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated",
1184
+ "gcloud beta run jobs execute pan-test-app-review-mr1234-api-migration --project=google-project-id --region=europe-west6",
1185
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1186
+ ],
1187
+ "services": [
1188
+ {
1189
+ "command": [
1190
+ "--tls=false",
1191
+ ],
1192
+ "name": "docker:20-dind",
1193
+ },
1194
+ ],
1195
+ "stage": "deploy review",
1196
+ "variables": {
1197
+ "APP_DIR": "api",
1198
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1199
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-migration:run",
1200
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-send-reminders:run",
1201
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1202
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1203
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1204
+ "DB_NAME": "pan-test-app-review-mr1234-api",
1205
+ "DB_PASSWORD": "$CL_review_api_DB_PASSWORD",
1206
+ "DB_USER": "my-user",
1207
+ "DOCKER_BUILDKIT": "1",
1208
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
1209
+ "DOCKER_DRIVER": "overlay2",
1210
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1211
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1212
+ "DOCKER_IMAGE_NAME": "review/api",
1213
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1214
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1215
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1216
+ "DOCKER_TLS_CERTDIR": "",
1217
+ "ENV_SHORT": "review",
1218
+ "ENV_TYPE": "review",
1219
+ "ENV_VARS": "ENV_SHORT: 'review'
1220
+ APP_DIR: 'api'
1221
+ ENV_TYPE: 'review'
1222
+ HOST: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1223
+ ROOT_URL: 'https://pan-test-app-review-mr1234-api-unknown-host.example.com'
1224
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-api-unknown-host.example.com'
1225
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
1226
+ DB_NAME: 'pan-test-app-review-mr1234-api'
1227
+ DB_USER: 'my-user'
1228
+ DB_PASSWORD: '$CL_review_api_DB_PASSWORD'
1229
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
1230
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
1231
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-migration:run'
1232
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-review-mr1234-api-send-reminders:run'
1233
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]'
1234
+ ",
1235
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_api_GCLOUD_DEPLOY_credentialsKey",
1236
+ "HOST": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1237
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-api-unknown-host.example.com",
1238
+ "KUBERNETES_CPU_LIMIT": "1",
1239
+ "KUBERNETES_CPU_REQUEST": "0.5",
1240
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1241
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1242
+ "ROOT_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1243
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
1244
+ },
1245
+ },
1246
+ "api 🛑 Stop ⚠️ | review ": {
1247
+ "environment": {
1248
+ "action": "stop",
1249
+ "name": "review/some-commit/api",
1250
+ "url": "https://pan-test-app-review-mr1234-api-unknown-host.example.com",
1251
+ },
1252
+ "image": "path/to/docker/gcloud:the-version",
1253
+ "interruptible": true,
1254
+ "needs": [],
1255
+ "retry": {
1256
+ "max": 2,
1257
+ "when": [
1258
+ "runner_system_failure",
1259
+ "stuck_or_timeout_failure",
1260
+ ],
1261
+ },
1262
+ "rules": [
1263
+ {
1264
+ "allow_failure": true,
1265
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1266
+ "when": "on_success",
1267
+ },
1268
+ {
1269
+ "allow_failure": true,
1270
+ "when": "manual",
1271
+ },
1272
+ ],
1273
+ "script": [
1274
+ "echo $CL_review_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1275
+ ",
1276
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1277
+ "gcloud run services delete pan-test-app-review-mr1234-api --project=google-project-id --region=europe-west6",
1278
+ "set +e",
1279
+ "gcloud scheduler jobs delete pan-test-app-review-mr1234-api-send-reminders-scheduler --project=google-project-id --location=europe-west6",
1280
+ "set -e",
1281
+ "gcloud beta run jobs delete pan-test-app-review-mr1234-api-migration --project=google-project-id --region=europe-west6",
1282
+ "gcloud beta run jobs delete pan-test-app-review-mr1234-api-send-reminders --project=google-project-id --region=europe-west6",
1283
+ "echo "deleting database pan-test-app-review-mr1234-api..."",
1284
+ "echo "👆 this can take multiple attemps (3-5min), because google cloud run may still have a connection to the database after the cloud run service is shut down"",
1285
+ "
1286
+ until gcloud sql databases delete pan-test-app-review-mr1234-api --instance=instancename --project projectId &> /dev/null
1287
+ do
1288
+ echo "Trying again."
1289
+ sleep 10
1290
+ done
1291
+ ",
1292
+ ],
1293
+ "stage": "stop review",
1294
+ "variables": {
1295
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1296
+ "GIT_STRATEGY": "none",
1297
+ "KUBERNETES_CPU_LIMIT": "1",
1298
+ "KUBERNETES_CPU_REQUEST": "0.5",
1299
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1300
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1301
+ },
1302
+ },
1303
+ "api 🛡 audit": {
1304
+ "allow_failure": true,
1305
+ "cache": undefined,
1306
+ "environment": undefined,
1307
+ "interruptible": true,
1308
+ "needs": [],
1309
+ "retry": {
1310
+ "max": 2,
1311
+ "when": [
1312
+ "runner_system_failure",
1313
+ "stuck_or_timeout_failure",
1314
+ ],
1315
+ },
1316
+ "script": [
1317
+ "cd api",
1318
+ "yarn npm audit --environment production",
1319
+ ],
1320
+ "stage": "test",
1321
+ "variables": {
1322
+ "APP_PATH": "api",
1323
+ "KUBERNETES_CPU_LIMIT": "2",
1324
+ "KUBERNETES_CPU_REQUEST": "0.5",
1325
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1326
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1327
+ },
1328
+ },
1329
+ "api 🧪 test": {
1330
+ "cache": [
1331
+ {
1332
+ "key": "api-yarn",
1333
+ "paths": [
1334
+ "api/.yarn",
1335
+ ],
1336
+ "policy": "pull-push",
1337
+ },
1338
+ {
1339
+ "key": "api-node-modules",
1340
+ "paths": [
1341
+ "api/node_modules",
1342
+ ],
1343
+ "policy": "pull-push",
1344
+ },
1345
+ ],
1346
+ "environment": undefined,
1347
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
1348
+ "interruptible": true,
1349
+ "needs": [],
1350
+ "retry": {
1351
+ "max": 2,
1352
+ "when": [
1353
+ "runner_system_failure",
1354
+ "stuck_or_timeout_failure",
1355
+ ],
1356
+ },
1357
+ "script": [
1358
+ "cd api",
1359
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1360
+ "yarn install --immutable",
1361
+ "yarn test",
1362
+ ],
1363
+ "stage": "test",
1364
+ "variables": {
1365
+ "APP_PATH": "api",
1366
+ "KUBERNETES_CPU_LIMIT": "2",
1367
+ "KUBERNETES_CPU_REQUEST": "0.5",
1368
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1369
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1370
+ },
1371
+ },
1372
+ "www 👮 lint": {
1373
+ "cache": [
1374
+ {
1375
+ "key": "www-yarn",
1376
+ "paths": [
1377
+ "www/.yarn",
1378
+ ],
1379
+ "policy": "pull-push",
1380
+ },
1381
+ {
1382
+ "key": "www-node-modules",
1383
+ "paths": [
1384
+ "www/node_modules",
1385
+ ],
1386
+ "policy": "pull-push",
1387
+ },
1388
+ ],
1389
+ "environment": undefined,
1390
+ "interruptible": true,
1391
+ "needs": [],
1392
+ "retry": {
1393
+ "max": 2,
1394
+ "when": [
1395
+ "runner_system_failure",
1396
+ "stuck_or_timeout_failure",
1397
+ ],
1398
+ },
1399
+ "script": [
1400
+ "cd www",
1401
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1402
+ "yarn install --immutable",
1403
+ "yarn lint",
1404
+ ],
1405
+ "stage": "test",
1406
+ "variables": {
1407
+ "APP_PATH": "www",
1408
+ "KUBERNETES_CPU_LIMIT": "2",
1409
+ "KUBERNETES_CPU_REQUEST": "0.5",
1410
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1411
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1412
+ },
1413
+ },
1414
+ "www 🔨 app | review ": {
1415
+ "artifacts": {
1416
+ "paths": [
1417
+ "www/__build_info.json",
1418
+ "www/dist",
1419
+ "www/.next",
1420
+ ],
1421
+ "reports": {
1422
+ "junit": undefined,
1423
+ },
1424
+ },
1425
+ "cache": [
1426
+ {
1427
+ "key": "www-yarn",
1428
+ "paths": [
1429
+ "www/.yarn",
1430
+ ],
1431
+ "policy": "pull-push",
1432
+ },
1433
+ {
1434
+ "key": "www-node-modules",
1435
+ "paths": [
1436
+ "www/node_modules",
1437
+ ],
1438
+ "policy": "pull-push",
1439
+ },
1440
+ {
1441
+ "key": "www-next-cache",
1442
+ "paths": [
1443
+ "www/.next/cache/",
1444
+ ],
1445
+ "policy": "pull-push",
1446
+ },
1447
+ ],
1448
+ "environment": undefined,
1449
+ "image": "path/to/docker/jobs-default:the-version",
1450
+ "interruptible": true,
1451
+ "needs": [],
1452
+ "retry": {
1453
+ "max": 2,
1454
+ "when": [
1455
+ "runner_system_failure",
1456
+ "stuck_or_timeout_failure",
1457
+ ],
1458
+ },
1459
+ "script": [
1460
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > www/__build_info.json",
1461
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1462
+ "cd www",
1463
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1464
+ "yarn install --immutable",
1465
+ "yarn build",
1466
+ ],
1467
+ "stage": "build",
1468
+ "variables": {
1469
+ "API_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com/graphql",
1470
+ "APP_DIR": "www",
1471
+ "ENV_SHORT": "review",
1472
+ "ENV_TYPE": "review",
1473
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_www_GCLOUD_DEPLOY_credentialsKey",
1474
+ "HOST": "pan-test-app-review-mr1234-www-unknown-host.example.com",
1475
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-www-unknown-host.example.com",
1476
+ "KUBERNETES_CPU_LIMIT": "2",
1477
+ "KUBERNETES_CPU_REQUEST": "0.5",
1478
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1479
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1480
+ "ROOT_URL": "https://pan-test-app-review-mr1234-www-unknown-host.example.com",
1481
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
1482
+ },
1483
+ },
1484
+ "www 🔨 docker | review ": {
1485
+ "cache": [
1486
+ {
1487
+ "key": "www-yarn",
1488
+ "paths": [
1489
+ "www/.yarn",
1490
+ ],
1491
+ "policy": "pull",
1492
+ },
1493
+ ],
1494
+ "environment": undefined,
1495
+ "image": "path/to/docker/docker-build:the-version",
1496
+ "interruptible": true,
1497
+ "needs": [
1498
+ "www 🔨 app | review ",
1499
+ ],
1500
+ "retry": {
1501
+ "max": 2,
1502
+ "when": [
1503
+ "runner_system_failure",
1504
+ "stuck_or_timeout_failure",
1505
+ ],
1506
+ },
1507
+ "script": [
1508
+ "ensureNodeDockerfile",
1509
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1510
+ "docker version",
1511
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1512
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1513
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1514
+ "docker push $DOCKER_CACHE_IMAGE",
1515
+ ],
1516
+ "services": [
1517
+ {
1518
+ "command": [
1519
+ "--tls=false",
1520
+ ],
1521
+ "name": "docker:20-dind",
1522
+ },
1523
+ ],
1524
+ "stage": "build",
1525
+ "variables": {
1526
+ "APP_DIR": "www",
1527
+ "DOCKERFILE_ADDITIONS": undefined,
1528
+ "DOCKERFILE_ADDITIONS_END": undefined,
1529
+ "DOCKER_BUILDKIT": "1",
1530
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
1531
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node www/package.json /app/www/package.json
1532
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock",
1533
+ "DOCKER_DIR": ".",
1534
+ "DOCKER_DRIVER": "overlay2",
1535
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1536
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1537
+ "DOCKER_IMAGE_NAME": "review/www",
1538
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1539
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1540
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1541
+ "DOCKER_TLS_CERTDIR": "",
1542
+ "KUBERNETES_CPU_LIMIT": "1",
1543
+ "KUBERNETES_CPU_REQUEST": "0.5",
1544
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1545
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1546
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1547
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
1548
+ },
1549
+ },
1550
+ "www 🚀 Deploy | review ": {
1551
+ "allow_failure": false,
1552
+ "artifacts": {
1553
+ "paths": [
1554
+ "____envvars.yaml",
1555
+ ],
1556
+ },
1557
+ "environment": {
1558
+ "auto_stop_in": "2 week",
1559
+ "name": "review/some-commit/www",
1560
+ "on_stop": "www 🛑 Stop ⚠️ | review ",
1561
+ "url": "https://pan-test-app-review-mr1234-www-unknown-host.example.com",
1562
+ },
1563
+ "image": "path/to/docker/gcloud:the-version",
1564
+ "interruptible": true,
1565
+ "needs": [
1566
+ {
1567
+ "artifacts": false,
1568
+ "job": "www 👮 lint",
1569
+ },
1570
+ {
1571
+ "artifacts": false,
1572
+ "job": "www 🔨 app | review ",
1573
+ },
1574
+ {
1575
+ "artifacts": false,
1576
+ "job": "www 🔨 docker | review ",
1577
+ },
1578
+ {
1579
+ "artifacts": false,
1580
+ "job": "www 🧪 test",
1581
+ },
1582
+ {
1583
+ "artifacts": false,
1584
+ "job": "www 🛡 audit",
1585
+ },
1586
+ ],
1587
+ "retry": {
1588
+ "max": 2,
1589
+ "when": [
1590
+ "runner_system_failure",
1591
+ "stuck_or_timeout_failure",
1592
+ ],
1593
+ },
1594
+ "rules": [
1595
+ {
1596
+ "when": "on_success",
1597
+ },
1598
+ ],
1599
+ "script": [
1600
+ "echo $CL_review_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1601
+ ",
1602
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1603
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
1604
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1605
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
1606
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
1607
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1608
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1609
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1610
+ "echo "$ENV_VARS" > ____envvars.yaml",
1611
+ "gcloud run deploy pan-test-app-review-mr1234-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,app-name=test-app,env-type=review,env-name=review,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
1612
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
1613
+ ],
1614
+ "services": [
1615
+ {
1616
+ "command": [
1617
+ "--tls=false",
1618
+ ],
1619
+ "name": "docker:20-dind",
1620
+ },
1621
+ ],
1622
+ "stage": "deploy review",
1623
+ "variables": {
1624
+ "API_URL": "https://pan-test-app-review-mr1234-api-unknown-host.example.com/graphql",
1625
+ "APP_DIR": "www",
1626
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1627
+ "DOCKER_BUILDKIT": "1",
1628
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
1629
+ "DOCKER_DRIVER": "overlay2",
1630
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1631
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
1632
+ "DOCKER_IMAGE_NAME": "review/www",
1633
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1634
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
1635
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
1636
+ "DOCKER_TLS_CERTDIR": "",
1637
+ "ENV_SHORT": "review",
1638
+ "ENV_TYPE": "review",
1639
+ "ENV_VARS": "ENV_SHORT: 'review'
1640
+ APP_DIR: 'www'
1641
+ ENV_TYPE: 'review'
1642
+ HOST: 'pan-test-app-review-mr1234-www-unknown-host.example.com'
1643
+ ROOT_URL: 'https://pan-test-app-review-mr1234-www-unknown-host.example.com'
1644
+ HOST_CANONICAL: 'pan-test-app-review-mr1234-www-unknown-host.example.com'
1645
+ API_URL: 'https://pan-test-app-review-mr1234-api-unknown-host.example.com/graphql'
1646
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]'
1647
+ ",
1648
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_review_www_GCLOUD_DEPLOY_credentialsKey",
1649
+ "HOST": "pan-test-app-review-mr1234-www-unknown-host.example.com",
1650
+ "HOST_CANONICAL": "pan-test-app-review-mr1234-www-unknown-host.example.com",
1651
+ "KUBERNETES_CPU_LIMIT": "1",
1652
+ "KUBERNETES_CPU_REQUEST": "0.5",
1653
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1654
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1655
+ "ROOT_URL": "https://pan-test-app-review-mr1234-www-unknown-host.example.com",
1656
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
1657
+ },
1658
+ },
1659
+ "www 🛑 Stop ⚠️ | review ": {
1660
+ "environment": {
1661
+ "action": "stop",
1662
+ "name": "review/some-commit/www",
1663
+ "url": "https://pan-test-app-review-mr1234-www-unknown-host.example.com",
1664
+ },
1665
+ "image": "path/to/docker/gcloud:the-version",
1666
+ "interruptible": true,
1667
+ "needs": [],
1668
+ "retry": {
1669
+ "max": 2,
1670
+ "when": [
1671
+ "runner_system_failure",
1672
+ "stuck_or_timeout_failure",
1673
+ ],
1674
+ },
1675
+ "rules": [
1676
+ {
1677
+ "allow_failure": true,
1678
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1679
+ "when": "on_success",
1680
+ },
1681
+ {
1682
+ "allow_failure": true,
1683
+ "when": "manual",
1684
+ },
1685
+ ],
1686
+ "script": [
1687
+ "echo $CL_review_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
1688
+ ",
1689
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1690
+ "gcloud run services delete pan-test-app-review-mr1234-www --project=google-project-id --region=europe-west6",
1691
+ ],
1692
+ "stage": "stop review",
1693
+ "variables": {
1694
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
1695
+ "GIT_STRATEGY": "none",
1696
+ "KUBERNETES_CPU_LIMIT": "1",
1697
+ "KUBERNETES_CPU_REQUEST": "0.5",
1698
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
1699
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1700
+ },
1701
+ },
1702
+ "www 🛡 audit": {
1703
+ "allow_failure": true,
1704
+ "cache": undefined,
1705
+ "environment": undefined,
1706
+ "interruptible": true,
1707
+ "needs": [],
1708
+ "retry": {
1709
+ "max": 2,
1710
+ "when": [
1711
+ "runner_system_failure",
1712
+ "stuck_or_timeout_failure",
1713
+ ],
1714
+ },
1715
+ "script": [
1716
+ "cd www",
1717
+ "yarn npm audit --environment production",
1718
+ ],
1719
+ "stage": "test",
1720
+ "variables": {
1721
+ "APP_PATH": "www",
1722
+ "KUBERNETES_CPU_LIMIT": "2",
1723
+ "KUBERNETES_CPU_REQUEST": "0.5",
1724
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1725
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1726
+ },
1727
+ },
1728
+ "www 🧪 test": {
1729
+ "cache": [
1730
+ {
1731
+ "key": "www-yarn",
1732
+ "paths": [
1733
+ "www/.yarn",
1734
+ ],
1735
+ "policy": "pull-push",
1736
+ },
1737
+ {
1738
+ "key": "www-node-modules",
1739
+ "paths": [
1740
+ "www/node_modules",
1741
+ ],
1742
+ "policy": "pull-push",
1743
+ },
1744
+ ],
1745
+ "environment": undefined,
1746
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
1747
+ "interruptible": true,
1748
+ "needs": [],
1749
+ "retry": {
1750
+ "max": 2,
1751
+ "when": [
1752
+ "runner_system_failure",
1753
+ "stuck_or_timeout_failure",
1754
+ ],
1755
+ },
1756
+ "script": [
1757
+ "cd www",
1758
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1759
+ "yarn install --immutable",
1760
+ "yarn test",
1761
+ ],
1762
+ "stage": "test",
1763
+ "variables": {
1764
+ "APP_PATH": "www",
1765
+ "KUBERNETES_CPU_LIMIT": "2",
1766
+ "KUBERNETES_CPU_REQUEST": "0.5",
1767
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1768
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1769
+ },
1770
+ },
1771
+ },
1772
+ "stages": [
1773
+ "setup",
1774
+ "setup dev",
1775
+ "setup review",
1776
+ "setup stage",
1777
+ "setup prod",
1778
+ "setup local",
1779
+ "test",
1780
+ "test dev",
1781
+ "test review",
1782
+ "test stage",
1783
+ "test prod",
1784
+ "test local",
1785
+ "build",
1786
+ "build dev",
1787
+ "build review",
1788
+ "build stage",
1789
+ "build prod",
1790
+ "build local",
1791
+ "deploy",
1792
+ "deploy dev",
1793
+ "deploy review",
1794
+ "deploy stage",
1795
+ "deploy prod",
1796
+ "deploy local",
1797
+ "verify",
1798
+ "verify dev",
1799
+ "verify review",
1800
+ "verify stage",
1801
+ "verify prod",
1802
+ "verify local",
1803
+ "rollback",
1804
+ "rollback dev",
1805
+ "rollback review",
1806
+ "rollback stage",
1807
+ "rollback prod",
1808
+ "rollback local",
1809
+ "stop",
1810
+ "stop dev",
1811
+ "stop review",
1812
+ "stop stage",
1813
+ "stop prod",
1814
+ "stop local",
1815
+ ],
1816
+ "variables": {
1817
+ "FF_USE_FASTZIP": "true",
1818
+ },
1819
+ "workflow": {
1820
+ "rules": [
1821
+ {
1822
+ "if": "$CI_COMMIT_TAG",
1823
+ },
1824
+ {
1825
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1826
+ "when": "never",
1827
+ },
1828
+ {
1829
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1830
+ },
1831
+ {
1832
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1833
+ },
1834
+ {
1835
+ "if": "$CI_MERGE_REQUEST_ID",
1836
+ },
1837
+ ],
1838
+ },
1839
+ },
1840
+ "taggedRelease": {
1841
+ "image": "path/to/docker/jobs-default:the-version",
1842
+ "jobs": {
1843
+ "api 🔨 app | prod ": {
1844
+ "artifacts": {
1845
+ "paths": [
1846
+ "api/__build_info.json",
1847
+ "api/dist",
1848
+ "api/.next",
1849
+ ],
1850
+ "reports": {
1851
+ "junit": undefined,
1852
+ },
1853
+ },
1854
+ "cache": [
1855
+ {
1856
+ "key": "api-yarn",
1857
+ "paths": [
1858
+ "api/.yarn",
1859
+ ],
1860
+ "policy": "pull-push",
1861
+ },
1862
+ {
1863
+ "key": "api-node-modules",
1864
+ "paths": [
1865
+ "api/node_modules",
1866
+ ],
1867
+ "policy": "pull-push",
1868
+ },
1869
+ {
1870
+ "key": "api-next-cache",
1871
+ "paths": [
1872
+ "api/.next/cache/",
1873
+ ],
1874
+ "policy": "pull-push",
1875
+ },
1876
+ ],
1877
+ "environment": undefined,
1878
+ "image": "path/to/docker/jobs-default:the-version",
1879
+ "interruptible": true,
1880
+ "needs": [],
1881
+ "retry": {
1882
+ "max": 2,
1883
+ "when": [
1884
+ "runner_system_failure",
1885
+ "stuck_or_timeout_failure",
1886
+ ],
1887
+ },
1888
+ "script": [
1889
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1890
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1891
+ "cd api",
1892
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1893
+ "yarn install --immutable",
1894
+ "yarn build",
1895
+ ],
1896
+ "stage": "build",
1897
+ "variables": {
1898
+ "APP_DIR": "api",
1899
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run",
1900
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run",
1901
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1902
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1903
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1904
+ "DB_NAME": "pan-test-app-prod-api",
1905
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
1906
+ "DB_USER": "my-user",
1907
+ "ENV_SHORT": "prod",
1908
+ "ENV_TYPE": "prod",
1909
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
1910
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
1911
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
1912
+ "KUBERNETES_CPU_LIMIT": "2",
1913
+ "KUBERNETES_CPU_REQUEST": "0.5",
1914
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1915
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1916
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
1917
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
1918
+ },
1919
+ },
1920
+ "api 🔨 app | stage ": {
1921
+ "artifacts": {
1922
+ "paths": [
1923
+ "api/__build_info.json",
1924
+ "api/dist",
1925
+ "api/.next",
1926
+ ],
1927
+ "reports": {
1928
+ "junit": undefined,
1929
+ },
1930
+ },
1931
+ "cache": [
1932
+ {
1933
+ "key": "api-yarn",
1934
+ "paths": [
1935
+ "api/.yarn",
1936
+ ],
1937
+ "policy": "pull-push",
1938
+ },
1939
+ {
1940
+ "key": "api-node-modules",
1941
+ "paths": [
1942
+ "api/node_modules",
1943
+ ],
1944
+ "policy": "pull-push",
1945
+ },
1946
+ {
1947
+ "key": "api-next-cache",
1948
+ "paths": [
1949
+ "api/.next/cache/",
1950
+ ],
1951
+ "policy": "pull-push",
1952
+ },
1953
+ ],
1954
+ "environment": undefined,
1955
+ "image": "path/to/docker/jobs-default:the-version",
1956
+ "interruptible": true,
1957
+ "needs": [],
1958
+ "retry": {
1959
+ "max": 2,
1960
+ "when": [
1961
+ "runner_system_failure",
1962
+ "stuck_or_timeout_failure",
1963
+ ],
1964
+ },
1965
+ "script": [
1966
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1967
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1968
+ "cd api",
1969
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
1970
+ "yarn install --immutable",
1971
+ "yarn build",
1972
+ ],
1973
+ "stage": "build",
1974
+ "variables": {
1975
+ "APP_DIR": "api",
1976
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run",
1977
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run",
1978
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
1979
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
1980
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
1981
+ "DB_NAME": "pan-test-app-stage-api",
1982
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
1983
+ "DB_USER": "my-user",
1984
+ "ENV_SHORT": "stage",
1985
+ "ENV_TYPE": "stage",
1986
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
1987
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
1988
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
1989
+ "KUBERNETES_CPU_LIMIT": "2",
1990
+ "KUBERNETES_CPU_REQUEST": "0.5",
1991
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1992
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1993
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
1994
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
1995
+ },
1996
+ },
1997
+ "api 🔨 docker | prod ": {
1998
+ "cache": [
1999
+ {
2000
+ "key": "api-yarn",
2001
+ "paths": [
2002
+ "api/.yarn",
2003
+ ],
2004
+ "policy": "pull",
2005
+ },
2006
+ ],
2007
+ "environment": undefined,
2008
+ "image": "path/to/docker/docker-build:the-version",
2009
+ "interruptible": true,
2010
+ "needs": [
2011
+ "api 🔨 app | prod ",
2012
+ ],
2013
+ "retry": {
2014
+ "max": 2,
2015
+ "when": [
2016
+ "runner_system_failure",
2017
+ "stuck_or_timeout_failure",
2018
+ ],
2019
+ },
2020
+ "script": [
2021
+ "ensureNodeDockerfile",
2022
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2023
+ "docker version",
2024
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
2025
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2026
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2027
+ "docker push $DOCKER_CACHE_IMAGE",
2028
+ ],
2029
+ "services": [
2030
+ {
2031
+ "command": [
2032
+ "--tls=false",
2033
+ ],
2034
+ "name": "docker:20-dind",
2035
+ },
2036
+ ],
2037
+ "stage": "build",
2038
+ "variables": {
2039
+ "APP_DIR": "api",
2040
+ "DOCKERFILE_ADDITIONS": undefined,
2041
+ "DOCKERFILE_ADDITIONS_END": undefined,
2042
+ "DOCKER_BUILDKIT": "1",
2043
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2044
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2045
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2046
+ "DOCKER_DIR": ".",
2047
+ "DOCKER_DRIVER": "overlay2",
2048
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2049
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2050
+ "DOCKER_IMAGE_NAME": "prod/api",
2051
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2052
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2053
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2054
+ "DOCKER_TLS_CERTDIR": "",
2055
+ "KUBERNETES_CPU_LIMIT": "1",
2056
+ "KUBERNETES_CPU_REQUEST": "0.5",
2057
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2058
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2059
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2060
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2061
+ },
2062
+ },
2063
+ "api 🔨 docker | stage ": {
2064
+ "cache": [
2065
+ {
2066
+ "key": "api-yarn",
2067
+ "paths": [
2068
+ "api/.yarn",
2069
+ ],
2070
+ "policy": "pull",
2071
+ },
2072
+ ],
2073
+ "environment": undefined,
2074
+ "image": "path/to/docker/docker-build:the-version",
2075
+ "interruptible": true,
2076
+ "needs": [
2077
+ "api 🔨 app | stage ",
2078
+ ],
2079
+ "retry": {
2080
+ "max": 2,
2081
+ "when": [
2082
+ "runner_system_failure",
2083
+ "stuck_or_timeout_failure",
2084
+ ],
2085
+ },
2086
+ "script": [
2087
+ "ensureNodeDockerfile",
2088
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2089
+ "docker version",
2090
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
2091
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2092
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2093
+ "docker push $DOCKER_CACHE_IMAGE",
2094
+ ],
2095
+ "services": [
2096
+ {
2097
+ "command": [
2098
+ "--tls=false",
2099
+ ],
2100
+ "name": "docker:20-dind",
2101
+ },
2102
+ ],
2103
+ "stage": "build",
2104
+ "variables": {
2105
+ "APP_DIR": "api",
2106
+ "DOCKERFILE_ADDITIONS": undefined,
2107
+ "DOCKERFILE_ADDITIONS_END": undefined,
2108
+ "DOCKER_BUILDKIT": "1",
2109
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2110
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
2111
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock",
2112
+ "DOCKER_DIR": ".",
2113
+ "DOCKER_DRIVER": "overlay2",
2114
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2115
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2116
+ "DOCKER_IMAGE_NAME": "stage/api",
2117
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2118
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2119
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2120
+ "DOCKER_TLS_CERTDIR": "",
2121
+ "KUBERNETES_CPU_LIMIT": "1",
2122
+ "KUBERNETES_CPU_REQUEST": "0.5",
2123
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2124
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2125
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2126
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2127
+ },
2128
+ },
2129
+ "api 🚀 Deploy | prod ": {
2130
+ "allow_failure": true,
2131
+ "artifacts": {
2132
+ "paths": [
2133
+ "____envvars.yaml",
2134
+ ],
2135
+ },
2136
+ "environment": {
2137
+ "auto_stop_in": undefined,
2138
+ "name": "prod/api",
2139
+ "on_stop": "api 🛑 Stop ⚠️ | prod ",
2140
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
2141
+ },
2142
+ "image": "path/to/docker/gcloud:the-version",
2143
+ "interruptible": true,
2144
+ "needs": [
2145
+ {
2146
+ "artifacts": false,
2147
+ "job": "api 🔨 app | prod ",
2148
+ },
2149
+ {
2150
+ "artifacts": false,
2151
+ "job": "api 🔨 docker | prod ",
2152
+ },
2153
+ ],
2154
+ "retry": {
2155
+ "max": 2,
2156
+ "when": [
2157
+ "runner_system_failure",
2158
+ "stuck_or_timeout_failure",
2159
+ ],
2160
+ },
2161
+ "rules": [
2162
+ {
2163
+ "when": "manual",
2164
+ },
2165
+ ],
2166
+ "script": [
2167
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2168
+ ",
2169
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2170
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2171
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2172
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2173
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2174
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2175
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2176
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2177
+ "echo "$ENV_VARS" > ____envvars.yaml",
2178
+ "set +e",
2179
+ "echo "ensuring Database..."",
2180
+ "gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId",
2181
+ "set -e",
2182
+ "set +e",
2183
+ "gcloud scheduler jobs create http pan-test-app-prod-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
2184
+ "set -e",
2185
+ "gcloud scheduler jobs update http pan-test-app-prod-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
2186
+ "set +e",
2187
+ "gcloud beta run jobs create pan-test-app-prod-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --memory=512Mi",
2188
+ "set -e",
2189
+ "gcloud beta run jobs update pan-test-app-prod-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
2190
+ "set +e",
2191
+ "gcloud beta run jobs create pan-test-app-prod-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --memory=512Mi",
2192
+ "set -e",
2193
+ "gcloud beta run jobs update pan-test-app-prod-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
2194
+ "gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated",
2195
+ "gcloud beta run jobs execute pan-test-app-prod-api-migration --project=google-project-id --region=europe-west6",
2196
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2197
+ ],
2198
+ "services": [
2199
+ {
2200
+ "command": [
2201
+ "--tls=false",
2202
+ ],
2203
+ "name": "docker:20-dind",
2204
+ },
2205
+ ],
2206
+ "stage": "deploy prod",
2207
+ "variables": {
2208
+ "APP_DIR": "api",
2209
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2210
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run",
2211
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run",
2212
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2213
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2214
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2215
+ "DB_NAME": "pan-test-app-prod-api",
2216
+ "DB_PASSWORD": "$CL_prod_api_DB_PASSWORD",
2217
+ "DB_USER": "my-user",
2218
+ "DOCKER_BUILDKIT": "1",
2219
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2220
+ "DOCKER_DRIVER": "overlay2",
2221
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2222
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2223
+ "DOCKER_IMAGE_NAME": "prod/api",
2224
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2225
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2226
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2227
+ "DOCKER_TLS_CERTDIR": "",
2228
+ "ENV_SHORT": "prod",
2229
+ "ENV_TYPE": "prod",
2230
+ "ENV_VARS": "ENV_SHORT: 'prod'
2231
+ APP_DIR: 'api'
2232
+ ENV_TYPE: 'prod'
2233
+ HOST: 'pan-test-app-prod-api-unknown-host.example.com'
2234
+ ROOT_URL: 'https://pan-test-app-prod-api-unknown-host.example.com'
2235
+ HOST_CANONICAL: 'pan-test-app-prod-api-unknown-host.example.com'
2236
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2237
+ DB_NAME: 'pan-test-app-prod-api'
2238
+ DB_USER: 'my-user'
2239
+ DB_PASSWORD: '$CL_prod_api_DB_PASSWORD'
2240
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2241
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
2242
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run'
2243
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run'
2244
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]'
2245
+ ",
2246
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey",
2247
+ "HOST": "pan-test-app-prod-api-unknown-host.example.com",
2248
+ "HOST_CANONICAL": "pan-test-app-prod-api-unknown-host.example.com",
2249
+ "KUBERNETES_CPU_LIMIT": "1",
2250
+ "KUBERNETES_CPU_REQUEST": "0.5",
2251
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2252
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2253
+ "ROOT_URL": "https://pan-test-app-prod-api-unknown-host.example.com",
2254
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
2255
+ },
2256
+ },
2257
+ "api 🚀 Deploy | stage ": {
2258
+ "allow_failure": false,
2259
+ "artifacts": {
2260
+ "paths": [
2261
+ "____envvars.yaml",
2262
+ ],
2263
+ },
2264
+ "environment": {
2265
+ "auto_stop_in": undefined,
2266
+ "name": "stage/api",
2267
+ "on_stop": "api 🛑 Stop ⚠️ | stage ",
2268
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
2269
+ },
2270
+ "image": "path/to/docker/gcloud:the-version",
2271
+ "interruptible": true,
2272
+ "needs": [
2273
+ {
2274
+ "artifacts": false,
2275
+ "job": "api 🔨 app | stage ",
2276
+ },
2277
+ {
2278
+ "artifacts": false,
2279
+ "job": "api 🔨 docker | stage ",
2280
+ },
2281
+ ],
2282
+ "retry": {
2283
+ "max": 2,
2284
+ "when": [
2285
+ "runner_system_failure",
2286
+ "stuck_or_timeout_failure",
2287
+ ],
2288
+ },
2289
+ "rules": [
2290
+ {
2291
+ "when": "on_success",
2292
+ },
2293
+ ],
2294
+ "script": [
2295
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2296
+ ",
2297
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2298
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2299
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2300
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2301
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2302
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2303
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2304
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2305
+ "echo "$ENV_VARS" > ____envvars.yaml",
2306
+ "set +e",
2307
+ "echo "ensuring Database..."",
2308
+ "gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId",
2309
+ "set -e",
2310
+ "set +e",
2311
+ "gcloud scheduler jobs create http pan-test-app-stage-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
2312
+ "set -e",
2313
+ "gcloud scheduler jobs update http pan-test-app-stage-api-send-reminders-scheduler --project=google-project-id --location=europe-west6 --schedule="0 * * * *" --uri="https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run" --http-method=POST --oauth-service-account-email=$GCLOUD_PROJECT_NUMBER-compute@developer.gserviceaccount.com",
2314
+ "set +e",
2315
+ "gcloud beta run jobs create pan-test-app-stage-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --memory=512Mi",
2316
+ "set -e",
2317
+ "gcloud beta run jobs update pan-test-app-stage-api-migration --command="yarn,migrate" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
2318
+ "set +e",
2319
+ "gcloud beta run jobs create pan-test-app-stage-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --memory=512Mi",
2320
+ "set -e",
2321
+ "gcloud beta run jobs update pan-test-app-stage-api-send-reminders --command="yarn,job:send-reminders" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --memory=512Mi --env-vars-file=____envvars.yaml",
2322
+ "gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=5 --cpu-throttling --allow-unauthenticated",
2323
+ "gcloud beta run jobs execute pan-test-app-stage-api-migration --project=google-project-id --region=europe-west6",
2324
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2325
+ ],
2326
+ "services": [
2327
+ {
2328
+ "command": [
2329
+ "--tls=false",
2330
+ ],
2331
+ "name": "docker:20-dind",
2332
+ },
2333
+ ],
2334
+ "stage": "deploy stage",
2335
+ "variables": {
2336
+ "APP_DIR": "api",
2337
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2338
+ "CLOUD_RUN_JOB_TRIGGER_URL_migration": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run",
2339
+ "CLOUD_RUN_JOB_TRIGGER_URL_send_reminders": "https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run",
2340
+ "CLOUD_SQL_INSTANCE_CONNECTION_NAME": "projectId:region:instancename",
2341
+ "DATABASE_JDBC_URL": "jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD",
2342
+ "DATABASE_URL": "postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME",
2343
+ "DB_NAME": "pan-test-app-stage-api",
2344
+ "DB_PASSWORD": "$CL_stage_api_DB_PASSWORD",
2345
+ "DB_USER": "my-user",
2346
+ "DOCKER_BUILDKIT": "1",
2347
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/api",
2348
+ "DOCKER_DRIVER": "overlay2",
2349
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2350
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2351
+ "DOCKER_IMAGE_NAME": "stage/api",
2352
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2353
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2354
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2355
+ "DOCKER_TLS_CERTDIR": "",
2356
+ "ENV_SHORT": "stage",
2357
+ "ENV_TYPE": "stage",
2358
+ "ENV_VARS": "ENV_SHORT: 'stage'
2359
+ APP_DIR: 'api'
2360
+ ENV_TYPE: 'stage'
2361
+ HOST: 'pan-test-app-stage-api-unknown-host.example.com'
2362
+ ROOT_URL: 'https://pan-test-app-stage-api-unknown-host.example.com'
2363
+ HOST_CANONICAL: 'pan-test-app-stage-api-unknown-host.example.com'
2364
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: 'projectId:region:instancename'
2365
+ DB_NAME: 'pan-test-app-stage-api'
2366
+ DB_USER: 'my-user'
2367
+ DB_PASSWORD: '$CL_stage_api_DB_PASSWORD'
2368
+ DATABASE_URL: 'postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME'
2369
+ DATABASE_JDBC_URL: 'jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD'
2370
+ CLOUD_RUN_JOB_TRIGGER_URL_migration: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run'
2371
+ CLOUD_RUN_JOB_TRIGGER_URL_send_reminders: 'https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run'
2372
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]'
2373
+ ",
2374
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey",
2375
+ "HOST": "pan-test-app-stage-api-unknown-host.example.com",
2376
+ "HOST_CANONICAL": "pan-test-app-stage-api-unknown-host.example.com",
2377
+ "KUBERNETES_CPU_LIMIT": "1",
2378
+ "KUBERNETES_CPU_REQUEST": "0.5",
2379
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2380
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2381
+ "ROOT_URL": "https://pan-test-app-stage-api-unknown-host.example.com",
2382
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","GCLOUD_DEPLOY_credentialsKey"]",
2383
+ },
2384
+ },
2385
+ "api 🛑 Stop ⚠️ | prod ": {
2386
+ "environment": {
2387
+ "action": "stop",
2388
+ "name": "prod/api",
2389
+ "url": "https://pan-test-app-prod-api-unknown-host.example.com",
2390
+ },
2391
+ "image": "path/to/docker/gcloud:the-version",
2392
+ "interruptible": true,
2393
+ "needs": [],
2394
+ "retry": {
2395
+ "max": 2,
2396
+ "when": [
2397
+ "runner_system_failure",
2398
+ "stuck_or_timeout_failure",
2399
+ ],
2400
+ },
2401
+ "rules": [
2402
+ {
2403
+ "allow_failure": true,
2404
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2405
+ "when": "on_success",
2406
+ },
2407
+ {
2408
+ "allow_failure": true,
2409
+ "when": "manual",
2410
+ },
2411
+ ],
2412
+ "script": [
2413
+ "echo $CL_prod_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2414
+ ",
2415
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2416
+ "gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6",
2417
+ "set +e",
2418
+ "gcloud scheduler jobs delete pan-test-app-prod-api-send-reminders-scheduler --project=google-project-id --location=europe-west6",
2419
+ "set -e",
2420
+ "gcloud beta run jobs delete pan-test-app-prod-api-migration --project=google-project-id --region=europe-west6",
2421
+ "gcloud beta run jobs delete pan-test-app-prod-api-send-reminders --project=google-project-id --region=europe-west6",
2422
+ ],
2423
+ "stage": "stop prod",
2424
+ "variables": {
2425
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2426
+ "GIT_STRATEGY": "none",
2427
+ "KUBERNETES_CPU_LIMIT": "1",
2428
+ "KUBERNETES_CPU_REQUEST": "0.5",
2429
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2430
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2431
+ },
2432
+ },
2433
+ "api 🛑 Stop ⚠️ | stage ": {
2434
+ "environment": {
2435
+ "action": "stop",
2436
+ "name": "stage/api",
2437
+ "url": "https://pan-test-app-stage-api-unknown-host.example.com",
2438
+ },
2439
+ "image": "path/to/docker/gcloud:the-version",
2440
+ "interruptible": true,
2441
+ "needs": [],
2442
+ "retry": {
2443
+ "max": 2,
2444
+ "when": [
2445
+ "runner_system_failure",
2446
+ "stuck_or_timeout_failure",
2447
+ ],
2448
+ },
2449
+ "rules": [
2450
+ {
2451
+ "allow_failure": true,
2452
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2453
+ "when": "on_success",
2454
+ },
2455
+ {
2456
+ "allow_failure": true,
2457
+ "when": "manual",
2458
+ },
2459
+ ],
2460
+ "script": [
2461
+ "echo $CL_stage_api_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2462
+ ",
2463
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2464
+ "gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6",
2465
+ "set +e",
2466
+ "gcloud scheduler jobs delete pan-test-app-stage-api-send-reminders-scheduler --project=google-project-id --location=europe-west6",
2467
+ "set -e",
2468
+ "gcloud beta run jobs delete pan-test-app-stage-api-migration --project=google-project-id --region=europe-west6",
2469
+ "gcloud beta run jobs delete pan-test-app-stage-api-send-reminders --project=google-project-id --region=europe-west6",
2470
+ ],
2471
+ "stage": "stop stage",
2472
+ "variables": {
2473
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2474
+ "GIT_STRATEGY": "none",
2475
+ "KUBERNETES_CPU_LIMIT": "1",
2476
+ "KUBERNETES_CPU_REQUEST": "0.5",
2477
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2478
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2479
+ },
2480
+ },
2481
+ "www 🔨 app | prod ": {
2482
+ "artifacts": {
2483
+ "paths": [
2484
+ "www/__build_info.json",
2485
+ "www/dist",
2486
+ "www/.next",
2487
+ ],
2488
+ "reports": {
2489
+ "junit": undefined,
2490
+ },
2491
+ },
2492
+ "cache": [
2493
+ {
2494
+ "key": "www-yarn",
2495
+ "paths": [
2496
+ "www/.yarn",
2497
+ ],
2498
+ "policy": "pull-push",
2499
+ },
2500
+ {
2501
+ "key": "www-node-modules",
2502
+ "paths": [
2503
+ "www/node_modules",
2504
+ ],
2505
+ "policy": "pull-push",
2506
+ },
2507
+ {
2508
+ "key": "www-next-cache",
2509
+ "paths": [
2510
+ "www/.next/cache/",
2511
+ ],
2512
+ "policy": "pull-push",
2513
+ },
2514
+ ],
2515
+ "environment": undefined,
2516
+ "image": "path/to/docker/jobs-default:the-version",
2517
+ "interruptible": true,
2518
+ "needs": [],
2519
+ "retry": {
2520
+ "max": 2,
2521
+ "when": [
2522
+ "runner_system_failure",
2523
+ "stuck_or_timeout_failure",
2524
+ ],
2525
+ },
2526
+ "script": [
2527
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > www/__build_info.json",
2528
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2529
+ "cd www",
2530
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2531
+ "yarn install --immutable",
2532
+ "yarn build",
2533
+ ],
2534
+ "stage": "build",
2535
+ "variables": {
2536
+ "API_URL": "https://pan-test-app-prod-api-unknown-host.example.com/graphql",
2537
+ "APP_DIR": "www",
2538
+ "ENV_SHORT": "prod",
2539
+ "ENV_TYPE": "prod",
2540
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey",
2541
+ "HOST": "pan-test-app-prod-www-unknown-host.example.com",
2542
+ "HOST_CANONICAL": "pan-test-app-prod-www-unknown-host.example.com",
2543
+ "KUBERNETES_CPU_LIMIT": "2",
2544
+ "KUBERNETES_CPU_REQUEST": "0.5",
2545
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2546
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2547
+ "ROOT_URL": "https://pan-test-app-prod-www-unknown-host.example.com",
2548
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
2549
+ },
2550
+ },
2551
+ "www 🔨 app | stage ": {
2552
+ "artifacts": {
2553
+ "paths": [
2554
+ "www/__build_info.json",
2555
+ "www/dist",
2556
+ "www/.next",
2557
+ ],
2558
+ "reports": {
2559
+ "junit": undefined,
2560
+ },
2561
+ },
2562
+ "cache": [
2563
+ {
2564
+ "key": "www-yarn",
2565
+ "paths": [
2566
+ "www/.yarn",
2567
+ ],
2568
+ "policy": "pull-push",
2569
+ },
2570
+ {
2571
+ "key": "www-node-modules",
2572
+ "paths": [
2573
+ "www/node_modules",
2574
+ ],
2575
+ "policy": "pull-push",
2576
+ },
2577
+ {
2578
+ "key": "www-next-cache",
2579
+ "paths": [
2580
+ "www/.next/cache/",
2581
+ ],
2582
+ "policy": "pull-push",
2583
+ },
2584
+ ],
2585
+ "environment": undefined,
2586
+ "image": "path/to/docker/jobs-default:the-version",
2587
+ "interruptible": true,
2588
+ "needs": [],
2589
+ "retry": {
2590
+ "max": 2,
2591
+ "when": [
2592
+ "runner_system_failure",
2593
+ "stuck_or_timeout_failure",
2594
+ ],
2595
+ },
2596
+ "script": [
2597
+ "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > www/__build_info.json",
2598
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2599
+ "cd www",
2600
+ "if [ -f ./.nvmrc ]; then source /root/.nvm/nvm.sh && nvm install <<< .nvmrc; fi",
2601
+ "yarn install --immutable",
2602
+ "yarn build",
2603
+ ],
2604
+ "stage": "build",
2605
+ "variables": {
2606
+ "API_URL": "https://pan-test-app-stage-api-unknown-host.example.com/graphql",
2607
+ "APP_DIR": "www",
2608
+ "ENV_SHORT": "stage",
2609
+ "ENV_TYPE": "stage",
2610
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey",
2611
+ "HOST": "pan-test-app-stage-www-unknown-host.example.com",
2612
+ "HOST_CANONICAL": "pan-test-app-stage-www-unknown-host.example.com",
2613
+ "KUBERNETES_CPU_LIMIT": "2",
2614
+ "KUBERNETES_CPU_REQUEST": "0.5",
2615
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2616
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
2617
+ "ROOT_URL": "https://pan-test-app-stage-www-unknown-host.example.com",
2618
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
2619
+ },
2620
+ },
2621
+ "www 🔨 docker | prod ": {
2622
+ "cache": [
2623
+ {
2624
+ "key": "www-yarn",
2625
+ "paths": [
2626
+ "www/.yarn",
2627
+ ],
2628
+ "policy": "pull",
2629
+ },
2630
+ ],
2631
+ "environment": undefined,
2632
+ "image": "path/to/docker/docker-build:the-version",
2633
+ "interruptible": true,
2634
+ "needs": [
2635
+ "www 🔨 app | prod ",
2636
+ ],
2637
+ "retry": {
2638
+ "max": 2,
2639
+ "when": [
2640
+ "runner_system_failure",
2641
+ "stuck_or_timeout_failure",
2642
+ ],
2643
+ },
2644
+ "script": [
2645
+ "ensureNodeDockerfile",
2646
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2647
+ "docker version",
2648
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
2649
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2650
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2651
+ "docker push $DOCKER_CACHE_IMAGE",
2652
+ ],
2653
+ "services": [
2654
+ {
2655
+ "command": [
2656
+ "--tls=false",
2657
+ ],
2658
+ "name": "docker:20-dind",
2659
+ },
2660
+ ],
2661
+ "stage": "build",
2662
+ "variables": {
2663
+ "APP_DIR": "www",
2664
+ "DOCKERFILE_ADDITIONS": undefined,
2665
+ "DOCKERFILE_ADDITIONS_END": undefined,
2666
+ "DOCKER_BUILDKIT": "1",
2667
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
2668
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node www/package.json /app/www/package.json
2669
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock",
2670
+ "DOCKER_DIR": ".",
2671
+ "DOCKER_DRIVER": "overlay2",
2672
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2673
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2674
+ "DOCKER_IMAGE_NAME": "prod/www",
2675
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2676
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2677
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2678
+ "DOCKER_TLS_CERTDIR": "",
2679
+ "KUBERNETES_CPU_LIMIT": "1",
2680
+ "KUBERNETES_CPU_REQUEST": "0.5",
2681
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2682
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2683
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2684
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2685
+ },
2686
+ },
2687
+ "www 🔨 docker | stage ": {
2688
+ "cache": [
2689
+ {
2690
+ "key": "www-yarn",
2691
+ "paths": [
2692
+ "www/.yarn",
2693
+ ],
2694
+ "policy": "pull",
2695
+ },
2696
+ ],
2697
+ "environment": undefined,
2698
+ "image": "path/to/docker/docker-build:the-version",
2699
+ "interruptible": true,
2700
+ "needs": [
2701
+ "www 🔨 app | stage ",
2702
+ ],
2703
+ "retry": {
2704
+ "max": 2,
2705
+ "when": [
2706
+ "runner_system_failure",
2707
+ "stuck_or_timeout_failure",
2708
+ ],
2709
+ },
2710
+ "script": [
2711
+ "ensureNodeDockerfile",
2712
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2713
+ "docker version",
2714
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
2715
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2716
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2717
+ "docker push $DOCKER_CACHE_IMAGE",
2718
+ ],
2719
+ "services": [
2720
+ {
2721
+ "command": [
2722
+ "--tls=false",
2723
+ ],
2724
+ "name": "docker:20-dind",
2725
+ },
2726
+ ],
2727
+ "stage": "build",
2728
+ "variables": {
2729
+ "APP_DIR": "www",
2730
+ "DOCKERFILE_ADDITIONS": undefined,
2731
+ "DOCKERFILE_ADDITIONS_END": undefined,
2732
+ "DOCKER_BUILDKIT": "1",
2733
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
2734
+ "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node www/package.json /app/www/package.json
2735
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock",
2736
+ "DOCKER_DIR": ".",
2737
+ "DOCKER_DRIVER": "overlay2",
2738
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2739
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2740
+ "DOCKER_IMAGE_NAME": "stage/www",
2741
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2742
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2743
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2744
+ "DOCKER_TLS_CERTDIR": "",
2745
+ "KUBERNETES_CPU_LIMIT": "1",
2746
+ "KUBERNETES_CPU_REQUEST": "0.5",
2747
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2748
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2749
+ "YARN_INSTALL": "yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2750
+ "YARN_INSTALL_WITHOUT_SCRIPTS": "YARN_ENABLE_SCRIPTS=false yarn plugin import workspace-tools && yarn workspaces focus --production && yarn rebuild",
2751
+ },
2752
+ },
2753
+ "www 🚀 Deploy | prod ": {
2754
+ "allow_failure": true,
2755
+ "artifacts": {
2756
+ "paths": [
2757
+ "____envvars.yaml",
2758
+ ],
2759
+ },
2760
+ "environment": {
2761
+ "auto_stop_in": undefined,
2762
+ "name": "prod/www",
2763
+ "on_stop": "www 🛑 Stop ⚠️ | prod ",
2764
+ "url": "https://pan-test-app-prod-www-unknown-host.example.com",
2765
+ },
2766
+ "image": "path/to/docker/gcloud:the-version",
2767
+ "interruptible": true,
2768
+ "needs": [
2769
+ {
2770
+ "artifacts": false,
2771
+ "job": "www 🔨 app | prod ",
2772
+ },
2773
+ {
2774
+ "artifacts": false,
2775
+ "job": "www 🔨 docker | prod ",
2776
+ },
2777
+ ],
2778
+ "retry": {
2779
+ "max": 2,
2780
+ "when": [
2781
+ "runner_system_failure",
2782
+ "stuck_or_timeout_failure",
2783
+ ],
2784
+ },
2785
+ "rules": [
2786
+ {
2787
+ "when": "manual",
2788
+ },
2789
+ ],
2790
+ "script": [
2791
+ "echo $CL_prod_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2792
+ ",
2793
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2794
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2795
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2796
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2797
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2798
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2799
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2800
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2801
+ "echo "$ENV_VARS" > ____envvars.yaml",
2802
+ "gcloud run deploy pan-test-app-prod-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,app-name=test-app,env-type=prod,env-name=prod,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
2803
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2804
+ ],
2805
+ "services": [
2806
+ {
2807
+ "command": [
2808
+ "--tls=false",
2809
+ ],
2810
+ "name": "docker:20-dind",
2811
+ },
2812
+ ],
2813
+ "stage": "deploy prod",
2814
+ "variables": {
2815
+ "API_URL": "https://pan-test-app-prod-api-unknown-host.example.com/graphql",
2816
+ "APP_DIR": "www",
2817
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2818
+ "DOCKER_BUILDKIT": "1",
2819
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
2820
+ "DOCKER_DRIVER": "overlay2",
2821
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2822
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2823
+ "DOCKER_IMAGE_NAME": "prod/www",
2824
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2825
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2826
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2827
+ "DOCKER_TLS_CERTDIR": "",
2828
+ "ENV_SHORT": "prod",
2829
+ "ENV_TYPE": "prod",
2830
+ "ENV_VARS": "ENV_SHORT: 'prod'
2831
+ APP_DIR: 'www'
2832
+ ENV_TYPE: 'prod'
2833
+ HOST: 'pan-test-app-prod-www-unknown-host.example.com'
2834
+ ROOT_URL: 'https://pan-test-app-prod-www-unknown-host.example.com'
2835
+ HOST_CANONICAL: 'pan-test-app-prod-www-unknown-host.example.com'
2836
+ API_URL: 'https://pan-test-app-prod-api-unknown-host.example.com/graphql'
2837
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]'
2838
+ ",
2839
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey",
2840
+ "HOST": "pan-test-app-prod-www-unknown-host.example.com",
2841
+ "HOST_CANONICAL": "pan-test-app-prod-www-unknown-host.example.com",
2842
+ "KUBERNETES_CPU_LIMIT": "1",
2843
+ "KUBERNETES_CPU_REQUEST": "0.5",
2844
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2845
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2846
+ "ROOT_URL": "https://pan-test-app-prod-www-unknown-host.example.com",
2847
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
2848
+ },
2849
+ },
2850
+ "www 🚀 Deploy | stage ": {
2851
+ "allow_failure": false,
2852
+ "artifacts": {
2853
+ "paths": [
2854
+ "____envvars.yaml",
2855
+ ],
2856
+ },
2857
+ "environment": {
2858
+ "auto_stop_in": undefined,
2859
+ "name": "stage/www",
2860
+ "on_stop": "www 🛑 Stop ⚠️ | stage ",
2861
+ "url": "https://pan-test-app-stage-www-unknown-host.example.com",
2862
+ },
2863
+ "image": "path/to/docker/gcloud:the-version",
2864
+ "interruptible": true,
2865
+ "needs": [
2866
+ {
2867
+ "artifacts": false,
2868
+ "job": "www 🔨 app | stage ",
2869
+ },
2870
+ {
2871
+ "artifacts": false,
2872
+ "job": "www 🔨 docker | stage ",
2873
+ },
2874
+ ],
2875
+ "retry": {
2876
+ "max": 2,
2877
+ "when": [
2878
+ "runner_system_failure",
2879
+ "stuck_or_timeout_failure",
2880
+ ],
2881
+ },
2882
+ "rules": [
2883
+ {
2884
+ "when": "on_success",
2885
+ },
2886
+ ],
2887
+ "script": [
2888
+ "echo $CL_stage_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2889
+ ",
2890
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2891
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")",
2892
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2893
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2894
+ "gcloud auth configure-docker europe-west6-docker.pkg.dev",
2895
+ "docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2896
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2897
+ "docker push europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2898
+ "echo "$ENV_VARS" > ____envvars.yaml",
2899
+ "gcloud run deploy pan-test-app-stage-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,app-name=test-app,env-type=stage,env-name=stage,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated",
2900
+ "docker image rm europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/$DOCKER_IMAGE_NAME:$DOCKER_IMAGE_TAG",
2901
+ ],
2902
+ "services": [
2903
+ {
2904
+ "command": [
2905
+ "--tls=false",
2906
+ ],
2907
+ "name": "docker:20-dind",
2908
+ },
2909
+ ],
2910
+ "stage": "deploy stage",
2911
+ "variables": {
2912
+ "API_URL": "https://pan-test-app-stage-api-unknown-host.example.com/graphql",
2913
+ "APP_DIR": "www",
2914
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2915
+ "DOCKER_BUILDKIT": "1",
2916
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/www",
2917
+ "DOCKER_DRIVER": "overlay2",
2918
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2919
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2920
+ "DOCKER_IMAGE_NAME": "stage/www",
2921
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2922
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2923
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2924
+ "DOCKER_TLS_CERTDIR": "",
2925
+ "ENV_SHORT": "stage",
2926
+ "ENV_TYPE": "stage",
2927
+ "ENV_VARS": "ENV_SHORT: 'stage'
2928
+ APP_DIR: 'www'
2929
+ ENV_TYPE: 'stage'
2930
+ HOST: 'pan-test-app-stage-www-unknown-host.example.com'
2931
+ ROOT_URL: 'https://pan-test-app-stage-www-unknown-host.example.com'
2932
+ HOST_CANONICAL: 'pan-test-app-stage-www-unknown-host.example.com'
2933
+ API_URL: 'https://pan-test-app-stage-api-unknown-host.example.com/graphql'
2934
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]'
2935
+ ",
2936
+ "GCLOUD_DEPLOY_credentialsKey": "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey",
2937
+ "HOST": "pan-test-app-stage-www-unknown-host.example.com",
2938
+ "HOST_CANONICAL": "pan-test-app-stage-www-unknown-host.example.com",
2939
+ "KUBERNETES_CPU_LIMIT": "1",
2940
+ "KUBERNETES_CPU_REQUEST": "0.5",
2941
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2942
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2943
+ "ROOT_URL": "https://pan-test-app-stage-www-unknown-host.example.com",
2944
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","HOST","ROOT_URL","HOST_CANONICAL","GCLOUD_DEPLOY_credentialsKey","API_URL"]",
2945
+ },
2946
+ },
2947
+ "www 🛑 Stop ⚠️ | prod ": {
2948
+ "environment": {
2949
+ "action": "stop",
2950
+ "name": "prod/www",
2951
+ "url": "https://pan-test-app-prod-www-unknown-host.example.com",
2952
+ },
2953
+ "image": "path/to/docker/gcloud:the-version",
2954
+ "interruptible": true,
2955
+ "needs": [],
2956
+ "retry": {
2957
+ "max": 2,
2958
+ "when": [
2959
+ "runner_system_failure",
2960
+ "stuck_or_timeout_failure",
2961
+ ],
2962
+ },
2963
+ "rules": [
2964
+ {
2965
+ "allow_failure": true,
2966
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2967
+ "when": "on_success",
2968
+ },
2969
+ {
2970
+ "allow_failure": true,
2971
+ "when": "manual",
2972
+ },
2973
+ ],
2974
+ "script": [
2975
+ "echo $CL_prod_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
2976
+ ",
2977
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2978
+ "gcloud run services delete pan-test-app-prod-www --project=google-project-id --region=europe-west6",
2979
+ ],
2980
+ "stage": "stop prod",
2981
+ "variables": {
2982
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
2983
+ "GIT_STRATEGY": "none",
2984
+ "KUBERNETES_CPU_LIMIT": "1",
2985
+ "KUBERNETES_CPU_REQUEST": "0.5",
2986
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
2987
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2988
+ },
2989
+ },
2990
+ "www 🛑 Stop ⚠️ | stage ": {
2991
+ "environment": {
2992
+ "action": "stop",
2993
+ "name": "stage/www",
2994
+ "url": "https://pan-test-app-stage-www-unknown-host.example.com",
2995
+ },
2996
+ "image": "path/to/docker/gcloud:the-version",
2997
+ "interruptible": true,
2998
+ "needs": [],
2999
+ "retry": {
3000
+ "max": 2,
3001
+ "when": [
3002
+ "runner_system_failure",
3003
+ "stuck_or_timeout_failure",
3004
+ ],
3005
+ },
3006
+ "rules": [
3007
+ {
3008
+ "allow_failure": true,
3009
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3010
+ "when": "on_success",
3011
+ },
3012
+ {
3013
+ "allow_failure": true,
3014
+ "when": "manual",
3015
+ },
3016
+ ],
3017
+ "script": [
3018
+ "echo $CL_stage_www_GCLOUD_DEPLOY_credentialsKey > ./____keyfile.json
3019
+ ",
3020
+ "gcloud auth activate-service-account --key-file="./____keyfile.json"",
3021
+ "gcloud run services delete pan-test-app-stage-www --project=google-project-id --region=europe-west6",
3022
+ ],
3023
+ "stage": "stop stage",
3024
+ "variables": {
3025
+ "CLOUDSDK_CORE_DISABLE_PROMPTS": "1",
3026
+ "GIT_STRATEGY": "none",
3027
+ "KUBERNETES_CPU_LIMIT": "1",
3028
+ "KUBERNETES_CPU_REQUEST": "0.5",
3029
+ "KUBERNETES_MEMORY_LIMIT": "500Mi",
3030
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3031
+ },
3032
+ },
3033
+ },
3034
+ "stages": [
3035
+ "setup",
3036
+ "setup dev",
3037
+ "setup review",
3038
+ "setup stage",
3039
+ "setup prod",
3040
+ "setup local",
3041
+ "test",
3042
+ "test dev",
3043
+ "test review",
3044
+ "test stage",
3045
+ "test prod",
3046
+ "test local",
3047
+ "build",
3048
+ "build dev",
3049
+ "build review",
3050
+ "build stage",
3051
+ "build prod",
3052
+ "build local",
3053
+ "deploy",
3054
+ "deploy dev",
3055
+ "deploy review",
3056
+ "deploy stage",
3057
+ "deploy prod",
3058
+ "deploy local",
3059
+ "verify",
3060
+ "verify dev",
3061
+ "verify review",
3062
+ "verify stage",
3063
+ "verify prod",
3064
+ "verify local",
3065
+ "rollback",
3066
+ "rollback dev",
3067
+ "rollback review",
3068
+ "rollback stage",
3069
+ "rollback prod",
3070
+ "rollback local",
3071
+ "stop",
3072
+ "stop dev",
3073
+ "stop review",
3074
+ "stop stage",
3075
+ "stop prod",
3076
+ "stop local",
3077
+ ],
3078
+ "variables": {
3079
+ "FF_USE_FASTZIP": "true",
3080
+ },
3081
+ "workflow": {
3082
+ "rules": [
3083
+ {
3084
+ "if": "$CI_COMMIT_TAG",
3085
+ },
3086
+ {
3087
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
3088
+ "when": "never",
3089
+ },
3090
+ {
3091
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
3092
+ },
3093
+ {
3094
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
3095
+ },
3096
+ {
3097
+ "if": "$CI_MERGE_REQUEST_ID",
3098
+ },
3099
+ ],
3100
+ },
3101
+ },
3102
+ }
3103
+ `;