@catladder/pipeline 3.40.1 → 3.42.0

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 (81) hide show
  1. package/dist/build/base/index.js +2 -4
  2. package/dist/build/types.d.ts +0 -10
  3. package/dist/constants.js +1 -1
  4. package/dist/deploy/base/deploy.js +1 -6
  5. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +2 -3
  6. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +2 -3
  7. package/dist/deploy/custom/deployJob.js +2 -3
  8. package/dist/deploy/kubernetes/deployJob.js +2 -3
  9. package/dist/tsconfig.tsbuildinfo +1 -1
  10. package/examples/__snapshots__/automatic-releases.test.ts.snap +0 -112
  11. package/examples/__snapshots__/cloud-run-execute-script-on-deploy.test.ts.snap +0 -112
  12. package/examples/__snapshots__/cloud-run-health-check-defaults.test.ts.snap +0 -112
  13. package/examples/__snapshots__/cloud-run-health-check-only-startup.test.ts.snap +0 -112
  14. package/examples/__snapshots__/cloud-run-health-check.test.ts.snap +0 -112
  15. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +0 -112
  16. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +0 -112
  17. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +0 -112
  18. package/examples/__snapshots__/cloud-run-n8n.test.ts.snap +940 -0
  19. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +0 -112
  20. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +0 -112
  21. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +0 -112
  22. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +0 -112
  23. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +0 -112
  24. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +0 -112
  25. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +0 -112
  26. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +0 -112
  27. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +0 -112
  28. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +0 -112
  29. package/examples/__snapshots__/cloud-run-session-affinity.test.ts.snap +0 -112
  30. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +0 -112
  31. package/examples/__snapshots__/cloud-run-with-agents.test.ts.snap +0 -112
  32. package/examples/__snapshots__/cloud-run-with-gpu.test.ts.snap +0 -112
  33. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +0 -112
  34. package/examples/__snapshots__/cloud-run-with-sql-legacy-jobs.test.ts.snap +0 -112
  35. package/examples/__snapshots__/cloud-run-with-sql-multiple-dbs.test.ts.snap +0 -336
  36. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +0 -224
  37. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +0 -112
  38. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +0 -112
  39. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +0 -112
  40. package/examples/__snapshots__/custom-build-job.test.ts.snap +0 -112
  41. package/examples/__snapshots__/custom-deploy.test.ts.snap +0 -106
  42. package/examples/__snapshots__/custom-docker-file.test.ts.snap +0 -112
  43. package/examples/__snapshots__/custom-envs.test.ts.snap +0 -132
  44. package/examples/__snapshots__/custom-verify-job.test.ts.snap +0 -112
  45. package/examples/__snapshots__/git-submodule.test.ts.snap +0 -112
  46. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +0 -112
  47. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +0 -112
  48. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +0 -224
  49. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +0 -112
  50. package/examples/__snapshots__/local-dot-env.test.ts.snap +0 -112
  51. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +0 -112
  52. package/examples/__snapshots__/modify-generated-files.test.ts.snap +0 -88
  53. package/examples/__snapshots__/modify-generated-yaml.test.ts.snap +0 -88
  54. package/examples/__snapshots__/multiline-var.test.ts.snap +0 -336
  55. package/examples/__snapshots__/native-app.test.ts.snap +0 -216
  56. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +0 -112
  57. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +0 -112
  58. package/examples/__snapshots__/override-secrets.test.ts.snap +0 -112
  59. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +0 -112
  60. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +0 -112
  61. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +0 -336
  62. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +0 -208
  63. package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +0 -224
  64. package/examples/__snapshots__/workspace-api-www.test.ts.snap +0 -224
  65. package/examples/{custom-sbom-java.test.ts → cloud-run-n8n.test.ts} +2 -2
  66. package/examples/cloud-run-n8n.ts +62 -0
  67. package/package.json +1 -1
  68. package/src/build/base/index.ts +0 -4
  69. package/src/build/types.ts +0 -13
  70. package/src/deploy/base/deploy.ts +0 -5
  71. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +0 -2
  72. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +0 -2
  73. package/src/deploy/custom/deployJob.ts +2 -9
  74. package/src/deploy/kubernetes/deployJob.ts +3 -10
  75. package/dist/build/sbom.d.ts +0 -5
  76. package/dist/build/sbom.js +0 -35
  77. package/dist/deploy/sbom.d.ts +0 -4
  78. package/dist/deploy/sbom.js +0 -21
  79. package/examples/custom-sbom-java.ts +0 -38
  80. package/src/build/sbom.ts +0 -53
  81. package/src/deploy/sbom.ts +0 -34
@@ -0,0 +1,940 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`matches snapshot for cloud-run-n8n local pipeline YAML 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - agents
32
+ - agents dev
33
+ - agents review
34
+ - agents stage
35
+ - agents prod
36
+ - rollback
37
+ - rollback dev
38
+ - rollback review
39
+ - rollback stage
40
+ - rollback prod
41
+ - stop
42
+ - stop dev
43
+ - stop review
44
+ - stop stage
45
+ - stop prod
46
+ - release
47
+ variables:
48
+ FF_USE_FASTZIP: 'true'
49
+ ARTIFACT_COMPRESSION_LEVEL: fast
50
+ CACHE_COMPRESSION_LEVEL: fast
51
+ TRANSFER_METER_FREQUENCY: 5s
52
+ GIT_DEPTH: '1'
53
+ workflow:
54
+ name: $PIPELINE_ICON $PIPELINE_NAME
55
+ rules:
56
+ - if: $CI_PIPELINE_SOURCE == "trigger"
57
+ variables:
58
+ PIPELINE_ICON: 🤖
59
+ PIPELINE_NAME: Thinking...
60
+ - if: $CI_MERGE_REQUEST_ID
61
+ variables:
62
+ PIPELINE_ICON: 🐱🔨
63
+ PIPELINE_NAME: mr$CI_MERGE_REQUEST_IID - $CI_MERGE_REQUEST_TITLE
64
+ - if: $CI_COMMIT_TAG
65
+ variables:
66
+ PIPELINE_ICON: 🐱📦
67
+ PIPELINE_NAME: Release $CI_COMMIT_TAG
68
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
69
+ variables:
70
+ PIPELINE_ICON: 🐱🔨
71
+ PIPELINE_NAME: Main - $CI_COMMIT_TITLE
72
+ - when: always
73
+ variables:
74
+ PIPELINE_ICON: 🐱❓
75
+ PIPELINE_NAME: Default
76
+ before_script:
77
+ - |-
78
+ function escapeForDotEnv () {
79
+ input="\${1:-$(cat)}"
80
+ input="\${input//$'\\n'/\\\\n}"
81
+ if [[ "$input" == *\\\\n* ]]; then
82
+ if [[ "$input" == *\\"* && "$input" == *\\'* && "$input" == *\\\`* ]]; then
83
+ printf "\\"%s\\"\\n" "$input"
84
+ elif [[ "$input" == *\\"* && "$input" == *\\'* ]]; then
85
+ printf "\`%s\`\\n" "$input"
86
+ elif [[ "$input" == *\\"* ]]; then
87
+ printf "'%s'\\n" "$input"
88
+ else
89
+ printf "\\"%s\\"\\n" "$input"
90
+ fi
91
+ else
92
+ printf "%s\\n" "$input"
93
+ fi
94
+ }
95
+ - |-
96
+ function collapseable_section_start () {
97
+ local section_title="\${1}"
98
+ local section_description="\${2:-$section_title}"
99
+ echo -e "section_start:\`date +%s\`:\${section_title}[collapsed=true]\\r\\e[0K\${section_description}"
100
+ }
101
+ - |-
102
+ function collapseable_section_end () {
103
+ local section_title="\${1}"
104
+ echo -e "section_end:\`date +%s\`:\${section_title}\\r\\e[0K"
105
+ }
106
+ 'n8n 🚀 Deploy | dev ':
107
+ stage: deploy dev
108
+ image: path/to/docker/gcloud:the-version
109
+ variables:
110
+ KUBERNETES_CPU_REQUEST: '0.22'
111
+ KUBERNETES_MEMORY_REQUEST: 200Mi
112
+ KUBERNETES_MEMORY_LIMIT: 400Mi
113
+ script:
114
+ - collapseable_section_start "injectvars" "Injecting variables"
115
+ - export ENV_SHORT="dev"
116
+ - export APP_DIR="n8n"
117
+ - export ENV_TYPE="dev"
118
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
119
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
120
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
121
+ - export HOSTNAME="$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
122
+ - export ROOT_URL="https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
123
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
124
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
125
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
126
+ - export DB_NAME="pan-my-n8n-app-dev-n8n"
127
+ - export DB_USER="postgres"
128
+ - export DB_PASSWORD="$CL_dev_n8n_DB_PASSWORD"
129
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
130
+ - export 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"
131
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
132
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
133
+ - export N8N_ENCRYPTION_KEY="$CL_dev_n8n_N8N_ENCRYPTION_KEY"
134
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_n8n_GCLOUD_DEPLOY_credentialsKey"
135
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix"
136
+ - export N8N_PORT="8080"
137
+ - export N8N_PROTOCOL="https"
138
+ - export DB_TYPE="postgresdb"
139
+ - export DB_POSTGRESDB_DATABASE="pan-my-n8n-app-dev-n8n"
140
+ - export DB_POSTGRESDB_HOST="/cloudsql/projectId:region:instancename"
141
+ - export DB_POSTGRESDB_USER="postgres"
142
+ - export DB_POSTGRESDB_PASSWORD="$CL_dev_n8n_DB_PASSWORD"
143
+ - export DB_POSTGRESDB_PORT="5432"
144
+ - export DB_POSTGRESDB_SCHEMA="public"
145
+ - export GENERIC_TIMEZONE="Europe/Zurich"
146
+ - export N8N_DIAGNOSTICS_ENABLED="false"
147
+ - export N8N_PERSONALIZATION_ENABLED="false"
148
+ - export QUEUE_HEALTH_CHECK_ACTIVE="true"
149
+ - export WEBHOOK_URL="https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
150
+ - export N8N_EDITOR_BASE_URL="https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
151
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"N8N_ENCRYPTION_KEY\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"N8N_PORT\\",\\"N8N_PROTOCOL\\",\\"DB_TYPE\\",\\"DB_POSTGRESDB_DATABASE\\",\\"DB_POSTGRESDB_HOST\\",\\"DB_POSTGRESDB_USER\\",\\"DB_POSTGRESDB_PASSWORD\\",\\"DB_POSTGRESDB_PORT\\",\\"DB_POSTGRESDB_SCHEMA\\",\\"GENERIC_TIMEZONE\\",\\"N8N_DIAGNOSTICS_ENABLED\\",\\"N8N_PERSONALIZATION_ENABLED\\",\\"QUEUE_HEALTH_CHECK_ACTIVE\\",\\"WEBHOOK_URL\\",\\"N8N_EDITOR_BASE_URL\\"]"
152
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
153
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/dev/n8n"
154
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n"
155
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
156
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
157
+ - collapseable_section_end "injectvars"
158
+ - collapseable_section_start "prepare" "Prepare..."
159
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_n8n_GCLOUD_DEPLOY_credentialsKey")
160
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
161
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
162
+ - collapseable_section_end "prepare"
163
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
164
+ - |
165
+ cat > ____envvars.yaml <<EOF
166
+ ENV_SHORT: |-
167
+ dev
168
+ APP_DIR: |-
169
+ n8n
170
+ ENV_TYPE: |-
171
+ dev
172
+ BUILD_INFO_BUILD_ID: |-
173
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
174
+ BUILD_INFO_BUILD_TIME: |-
175
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
176
+ BUILD_INFO_CURRENT_VERSION: |-
177
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
178
+ HOSTNAME: |-
179
+ $(printf %s "$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
180
+ ROOT_URL: |-
181
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
182
+ HOSTNAME_INTERNAL: |-
183
+ $(printf %s "$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
184
+ ROOT_URL_INTERNAL: |-
185
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
186
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
187
+ projectId:region:instancename
188
+ DB_NAME: |-
189
+ pan-my-n8n-app-dev-n8n
190
+ DB_USER: |-
191
+ postgres
192
+ DB_PASSWORD: |-
193
+ $(printf %s "$CL_dev_n8n_DB_PASSWORD" | sed '1!s/^/ /')
194
+ DATABASE_URL: |-
195
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
196
+ DATABASE_JDBC_URL: |-
197
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
198
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
199
+ google-project-id
200
+ DEPLOY_CLOUD_RUN_REGION: |-
201
+ europe-west6
202
+ N8N_ENCRYPTION_KEY: |-
203
+ $(printf %s "$CL_dev_n8n_N8N_ENCRYPTION_KEY" | sed '1!s/^/ /')
204
+ GCLOUD_RUN_canonicalHostSuffix: |-
205
+ $(printf %s "$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
206
+ N8N_PORT: |-
207
+ 8080
208
+ N8N_PROTOCOL: |-
209
+ https
210
+ DB_TYPE: |-
211
+ postgresdb
212
+ DB_POSTGRESDB_DATABASE: |-
213
+ pan-my-n8n-app-dev-n8n
214
+ DB_POSTGRESDB_HOST: |-
215
+ /cloudsql/projectId:region:instancename
216
+ DB_POSTGRESDB_USER: |-
217
+ postgres
218
+ DB_POSTGRESDB_PASSWORD: |-
219
+ $(printf %s "$CL_dev_n8n_DB_PASSWORD" | sed '1!s/^/ /')
220
+ DB_POSTGRESDB_PORT: |-
221
+ 5432
222
+ DB_POSTGRESDB_SCHEMA: |-
223
+ public
224
+ GENERIC_TIMEZONE: |-
225
+ Europe/Zurich
226
+ N8N_DIAGNOSTICS_ENABLED: |-
227
+ false
228
+ N8N_PERSONALIZATION_ENABLED: |-
229
+ false
230
+ QUEUE_HEALTH_CHECK_ACTIVE: |-
231
+ true
232
+ WEBHOOK_URL: |-
233
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
234
+ N8N_EDITOR_BASE_URL: |-
235
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-dev-n8n-$CL_dev_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
236
+ _ALL_ENV_VAR_KEYS: |-
237
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","N8N_ENCRYPTION_KEY","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","N8N_PORT","N8N_PROTOCOL","DB_TYPE","DB_POSTGRESDB_DATABASE","DB_POSTGRESDB_HOST","DB_POSTGRESDB_USER","DB_POSTGRESDB_PASSWORD","DB_POSTGRESDB_PORT","DB_POSTGRESDB_SCHEMA","GENERIC_TIMEZONE","N8N_DIAGNOSTICS_ENABLED","N8N_PERSONALIZATION_ENABLED","QUEUE_HEALTH_CHECK_ACTIVE","WEBHOOK_URL","N8N_EDITOR_BASE_URL"]
238
+
239
+ EOF
240
+ - collapseable_section_end "writeenvvars"
241
+ - collapseable_section_start "deploy" "Deploy to cloud run"
242
+ - set +e
243
+ - echo "ensuring Database..."
244
+ - gcloud sql databases create pan-my-n8n-app-dev-n8n --instance=instancename --project projectId
245
+ - set -e
246
+ - gcloud run deploy pan-my-n8n-app-dev-n8n --command="/bin/sh" --args="-c","sleep 5; n8n start" --image=n8nio/n8n:2.12.0 --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=n8n,app-name=my-n8n-app,env-type=dev,env-name=dev,build-type=disabled,cloud-run-service-name=pan-my-n8n-app-dev-n8n --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --cpu=2 --memory=2Gi --timeout=3600s --allow-unauthenticated --ingress=all --session-affinity --cpu-boost --execution-environment=gen2
247
+ - collapseable_section_end "deploy"
248
+ - collapseable_section_start "cleanup" "Cleanup"
249
+ - set +e
250
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-my-n8n-app-dev-n8n --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
251
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/dev/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/dev/n8n@$version --quiet --delete-tags; done
252
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
253
+ - set -e
254
+ - collapseable_section_end "cleanup"
255
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
256
+ environment:
257
+ name: dev/n8n
258
+ url: $CL_GITLAB_ENVIRONMENT_URL
259
+ on_stop: 'n8n 🛑 Stop ⚠️ | dev '
260
+ auto_stop_in: 4 weeks
261
+ artifacts:
262
+ reports:
263
+ dotenv: gitlab_environment.env
264
+ rules:
265
+ - when: never
266
+ if: $CI_PIPELINE_SOURCE == "trigger"
267
+ - when: on_success
268
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
269
+ needs: []
270
+ retry: &a1
271
+ max: 2
272
+ interruptible: true
273
+ allow_failure: false
274
+ 'n8n 🛑 Stop ⚠️ | dev ':
275
+ stage: stop dev
276
+ image: path/to/docker/gcloud:the-version
277
+ variables:
278
+ KUBERNETES_CPU_REQUEST: '0.22'
279
+ KUBERNETES_MEMORY_REQUEST: 200Mi
280
+ KUBERNETES_MEMORY_LIMIT: 400Mi
281
+ GIT_STRATEGY: none
282
+ script:
283
+ - collapseable_section_start "injectvars" "Injecting variables"
284
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
285
+ - collapseable_section_end "injectvars"
286
+ - set +e
287
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_n8n_GCLOUD_DEPLOY_credentialsKey")
288
+ - gcloud run services delete pan-my-n8n-app-dev-n8n --project=google-project-id --region=europe-west6
289
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/dev/n8n --quiet --delete-tags
290
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
291
+ - set -e
292
+ environment:
293
+ name: dev/n8n
294
+ action: stop
295
+ rules:
296
+ - when: never
297
+ if: $CI_PIPELINE_SOURCE == "trigger"
298
+ - when: manual
299
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
300
+ needs: []
301
+ retry: *a1
302
+ interruptible: true
303
+ allow_failure: true
304
+ 'n8n 🚀 Deploy | review ':
305
+ stage: deploy review
306
+ image: path/to/docker/gcloud:the-version
307
+ variables:
308
+ KUBERNETES_CPU_REQUEST: '0.22'
309
+ KUBERNETES_MEMORY_REQUEST: 200Mi
310
+ KUBERNETES_MEMORY_LIMIT: 400Mi
311
+ script:
312
+ - collapseable_section_start "injectvars" "Injecting variables"
313
+ - export ENV_SHORT="review"
314
+ - export APP_DIR="n8n"
315
+ - export ENV_TYPE="review"
316
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
317
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
318
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
319
+ - export HOSTNAME="$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
320
+ - export ROOT_URL="https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
321
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
322
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
323
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
324
+ - export DB_NAME="pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n"
325
+ - export DB_USER="postgres"
326
+ - export DB_PASSWORD="$CL_review_n8n_DB_PASSWORD"
327
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
328
+ - export 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"
329
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
330
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
331
+ - export N8N_ENCRYPTION_KEY="$CL_review_n8n_N8N_ENCRYPTION_KEY"
332
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_n8n_GCLOUD_DEPLOY_credentialsKey"
333
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix"
334
+ - export N8N_PORT="8080"
335
+ - export N8N_PROTOCOL="https"
336
+ - export DB_TYPE="postgresdb"
337
+ - export DB_POSTGRESDB_DATABASE="pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n"
338
+ - export DB_POSTGRESDB_HOST="/cloudsql/projectId:region:instancename"
339
+ - export DB_POSTGRESDB_USER="postgres"
340
+ - export DB_POSTGRESDB_PASSWORD="$CL_review_n8n_DB_PASSWORD"
341
+ - export DB_POSTGRESDB_PORT="5432"
342
+ - export DB_POSTGRESDB_SCHEMA="public"
343
+ - export GENERIC_TIMEZONE="Europe/Zurich"
344
+ - export N8N_DIAGNOSTICS_ENABLED="false"
345
+ - export N8N_PERSONALIZATION_ENABLED="false"
346
+ - export QUEUE_HEALTH_CHECK_ACTIVE="true"
347
+ - export WEBHOOK_URL="https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
348
+ - export N8N_EDITOR_BASE_URL="https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
349
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"N8N_ENCRYPTION_KEY\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"N8N_PORT\\",\\"N8N_PROTOCOL\\",\\"DB_TYPE\\",\\"DB_POSTGRESDB_DATABASE\\",\\"DB_POSTGRESDB_HOST\\",\\"DB_POSTGRESDB_USER\\",\\"DB_POSTGRESDB_PASSWORD\\",\\"DB_POSTGRESDB_PORT\\",\\"DB_POSTGRESDB_SCHEMA\\",\\"GENERIC_TIMEZONE\\",\\"N8N_DIAGNOSTICS_ENABLED\\",\\"N8N_PERSONALIZATION_ENABLED\\",\\"QUEUE_HEALTH_CHECK_ACTIVE\\",\\"WEBHOOK_URL\\",\\"N8N_EDITOR_BASE_URL\\"]"
350
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
351
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/review/n8n/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
352
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n"
353
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
354
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
355
+ - collapseable_section_end "injectvars"
356
+ - collapseable_section_start "prepare" "Prepare..."
357
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_n8n_GCLOUD_DEPLOY_credentialsKey")
358
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
359
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
360
+ - collapseable_section_end "prepare"
361
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
362
+ - |
363
+ cat > ____envvars.yaml <<EOF
364
+ ENV_SHORT: |-
365
+ review
366
+ APP_DIR: |-
367
+ n8n
368
+ ENV_TYPE: |-
369
+ review
370
+ BUILD_INFO_BUILD_ID: |-
371
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
372
+ BUILD_INFO_BUILD_TIME: |-
373
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
374
+ BUILD_INFO_CURRENT_VERSION: |-
375
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
376
+ HOSTNAME: |-
377
+ $(printf %s "$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
378
+ ROOT_URL: |-
379
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
380
+ HOSTNAME_INTERNAL: |-
381
+ $(printf %s "$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
382
+ ROOT_URL_INTERNAL: |-
383
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
384
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
385
+ projectId:region:instancename
386
+ DB_NAME: |-
387
+ $(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n" | sed '1!s/^/ /')
388
+ DB_USER: |-
389
+ postgres
390
+ DB_PASSWORD: |-
391
+ $(printf %s "$CL_review_n8n_DB_PASSWORD" | sed '1!s/^/ /')
392
+ DATABASE_URL: |-
393
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
394
+ DATABASE_JDBC_URL: |-
395
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
396
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
397
+ google-project-id
398
+ DEPLOY_CLOUD_RUN_REGION: |-
399
+ europe-west6
400
+ N8N_ENCRYPTION_KEY: |-
401
+ $(printf %s "$CL_review_n8n_N8N_ENCRYPTION_KEY" | sed '1!s/^/ /')
402
+ GCLOUD_RUN_canonicalHostSuffix: |-
403
+ $(printf %s "$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
404
+ N8N_PORT: |-
405
+ 8080
406
+ N8N_PROTOCOL: |-
407
+ https
408
+ DB_TYPE: |-
409
+ postgresdb
410
+ DB_POSTGRESDB_DATABASE: |-
411
+ $(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n" | sed '1!s/^/ /')
412
+ DB_POSTGRESDB_HOST: |-
413
+ /cloudsql/projectId:region:instancename
414
+ DB_POSTGRESDB_USER: |-
415
+ postgres
416
+ DB_POSTGRESDB_PASSWORD: |-
417
+ $(printf %s "$CL_review_n8n_DB_PASSWORD" | sed '1!s/^/ /')
418
+ DB_POSTGRESDB_PORT: |-
419
+ 5432
420
+ DB_POSTGRESDB_SCHEMA: |-
421
+ public
422
+ GENERIC_TIMEZONE: |-
423
+ Europe/Zurich
424
+ N8N_DIAGNOSTICS_ENABLED: |-
425
+ false
426
+ N8N_PERSONALIZATION_ENABLED: |-
427
+ false
428
+ QUEUE_HEALTH_CHECK_ACTIVE: |-
429
+ true
430
+ WEBHOOK_URL: |-
431
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
432
+ N8N_EDITOR_BASE_URL: |-
433
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n-$CL_review_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
434
+ _ALL_ENV_VAR_KEYS: |-
435
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","N8N_ENCRYPTION_KEY","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","N8N_PORT","N8N_PROTOCOL","DB_TYPE","DB_POSTGRESDB_DATABASE","DB_POSTGRESDB_HOST","DB_POSTGRESDB_USER","DB_POSTGRESDB_PASSWORD","DB_POSTGRESDB_PORT","DB_POSTGRESDB_SCHEMA","GENERIC_TIMEZONE","N8N_DIAGNOSTICS_ENABLED","N8N_PERSONALIZATION_ENABLED","QUEUE_HEALTH_CHECK_ACTIVE","WEBHOOK_URL","N8N_EDITOR_BASE_URL"]
436
+
437
+ EOF
438
+ - collapseable_section_end "writeenvvars"
439
+ - collapseable_section_start "deploy" "Deploy to cloud run"
440
+ - set +e
441
+ - echo "ensuring Database..."
442
+ - gcloud sql databases create pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n --instance=instancename --project projectId
443
+ - set -e
444
+ - gcloud run deploy $(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n" | awk '{print tolower($0)}') --command="/bin/sh" --args="-c","sleep 5; n8n start" --image=n8nio/n8n:2.12.0 --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=n8n,app-name=my-n8n-app,env-type=review,env-name=review,build-type=disabled,cloud-run-service-name=$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --cpu=2 --memory=2Gi --timeout=3600s --allow-unauthenticated --ingress=all --session-affinity --cpu-boost --execution-environment=gen2
445
+ - collapseable_section_end "deploy"
446
+ - collapseable_section_start "cleanup" "Cleanup"
447
+ - set +e
448
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
449
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/review/n8n/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/review/n8n/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
450
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
451
+ - set +e
452
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/review/n8n --quiet --delete-tags
453
+ - set -e
454
+ - set -e
455
+ - collapseable_section_end "cleanup"
456
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
457
+ environment:
458
+ name: review/$CI_COMMIT_REF_NAME/n8n
459
+ url: $CL_GITLAB_ENVIRONMENT_URL
460
+ on_stop: 'n8n 🛑 Stop ⚠️ | review '
461
+ auto_stop_in: 1 week
462
+ artifacts:
463
+ reports:
464
+ dotenv: gitlab_environment.env
465
+ rules:
466
+ - when: never
467
+ if: $CI_PIPELINE_SOURCE == "trigger"
468
+ - when: on_success
469
+ if: $CI_MERGE_REQUEST_ID
470
+ needs: []
471
+ retry: *a1
472
+ interruptible: true
473
+ allow_failure: false
474
+ 'n8n 🛑 Stop ⚠️ | review ':
475
+ stage: stop review
476
+ image: path/to/docker/gcloud:the-version
477
+ variables:
478
+ KUBERNETES_CPU_REQUEST: '0.22'
479
+ KUBERNETES_MEMORY_REQUEST: 200Mi
480
+ KUBERNETES_MEMORY_LIMIT: 400Mi
481
+ GIT_STRATEGY: none
482
+ script:
483
+ - collapseable_section_start "injectvars" "Injecting variables"
484
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
485
+ - collapseable_section_end "injectvars"
486
+ - set +e
487
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_n8n_GCLOUD_DEPLOY_credentialsKey")
488
+ - gcloud run services delete $(printf %s "pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
489
+ - echo "deleting database pan-my-n8n-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-n8n..."
490
+ - 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"
491
+ - "\\n until gcloud sql databases delete pan-my-n8n-app-review-$([ -n \\"$CI_MERGE_REQUEST_IID\\" ] && echo \\"mr$CI_MERGE_REQUEST_IID\\" || { [ -n \\"$CI_COMMIT_REF_SLUG\\" ] && echo \\"$CI_COMMIT_REF_SLUG\\" || echo \\"unknown\\"; })-n8n --instance=instancename --project projectId\\n do\\n echo \\"Trying again.\\"\\n sleep 10\\n done\\n "
492
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/review/n8n/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
493
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
494
+ - set +e
495
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/review/n8n --quiet --delete-tags
496
+ - set -e
497
+ - set -e
498
+ environment:
499
+ name: review/$CI_COMMIT_REF_NAME/n8n
500
+ action: stop
501
+ rules:
502
+ - when: never
503
+ if: $CI_PIPELINE_SOURCE == "trigger"
504
+ - when: manual
505
+ if: $CI_MERGE_REQUEST_ID
506
+ needs: []
507
+ retry: *a1
508
+ interruptible: true
509
+ allow_failure: true
510
+ 'n8n 🚀 Deploy | stage ':
511
+ stage: deploy stage
512
+ image: path/to/docker/gcloud:the-version
513
+ variables:
514
+ KUBERNETES_CPU_REQUEST: '0.22'
515
+ KUBERNETES_MEMORY_REQUEST: 200Mi
516
+ KUBERNETES_MEMORY_LIMIT: 400Mi
517
+ script:
518
+ - collapseable_section_start "injectvars" "Injecting variables"
519
+ - export ENV_SHORT="stage"
520
+ - export APP_DIR="n8n"
521
+ - export ENV_TYPE="stage"
522
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
523
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
524
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
525
+ - export HOSTNAME="$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
526
+ - export ROOT_URL="https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
527
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
528
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
529
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
530
+ - export DB_NAME="pan-my-n8n-app-stage-n8n"
531
+ - export DB_USER="postgres"
532
+ - export DB_PASSWORD="$CL_stage_n8n_DB_PASSWORD"
533
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
534
+ - export 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"
535
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
536
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
537
+ - export N8N_ENCRYPTION_KEY="$CL_stage_n8n_N8N_ENCRYPTION_KEY"
538
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_n8n_GCLOUD_DEPLOY_credentialsKey"
539
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix"
540
+ - export N8N_PORT="8080"
541
+ - export N8N_PROTOCOL="https"
542
+ - export DB_TYPE="postgresdb"
543
+ - export DB_POSTGRESDB_DATABASE="pan-my-n8n-app-stage-n8n"
544
+ - export DB_POSTGRESDB_HOST="/cloudsql/projectId:region:instancename"
545
+ - export DB_POSTGRESDB_USER="postgres"
546
+ - export DB_POSTGRESDB_PASSWORD="$CL_stage_n8n_DB_PASSWORD"
547
+ - export DB_POSTGRESDB_PORT="5432"
548
+ - export DB_POSTGRESDB_SCHEMA="public"
549
+ - export GENERIC_TIMEZONE="Europe/Zurich"
550
+ - export N8N_DIAGNOSTICS_ENABLED="false"
551
+ - export N8N_PERSONALIZATION_ENABLED="false"
552
+ - export QUEUE_HEALTH_CHECK_ACTIVE="true"
553
+ - export WEBHOOK_URL="https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
554
+ - export N8N_EDITOR_BASE_URL="https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
555
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"N8N_ENCRYPTION_KEY\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"N8N_PORT\\",\\"N8N_PROTOCOL\\",\\"DB_TYPE\\",\\"DB_POSTGRESDB_DATABASE\\",\\"DB_POSTGRESDB_HOST\\",\\"DB_POSTGRESDB_USER\\",\\"DB_POSTGRESDB_PASSWORD\\",\\"DB_POSTGRESDB_PORT\\",\\"DB_POSTGRESDB_SCHEMA\\",\\"GENERIC_TIMEZONE\\",\\"N8N_DIAGNOSTICS_ENABLED\\",\\"N8N_PERSONALIZATION_ENABLED\\",\\"QUEUE_HEALTH_CHECK_ACTIVE\\",\\"WEBHOOK_URL\\",\\"N8N_EDITOR_BASE_URL\\"]"
556
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
557
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/stage/n8n"
558
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n"
559
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
560
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
561
+ - collapseable_section_end "injectvars"
562
+ - collapseable_section_start "prepare" "Prepare..."
563
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_n8n_GCLOUD_DEPLOY_credentialsKey")
564
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
565
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
566
+ - collapseable_section_end "prepare"
567
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
568
+ - |
569
+ cat > ____envvars.yaml <<EOF
570
+ ENV_SHORT: |-
571
+ stage
572
+ APP_DIR: |-
573
+ n8n
574
+ ENV_TYPE: |-
575
+ stage
576
+ BUILD_INFO_BUILD_ID: |-
577
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
578
+ BUILD_INFO_BUILD_TIME: |-
579
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
580
+ BUILD_INFO_CURRENT_VERSION: |-
581
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
582
+ HOSTNAME: |-
583
+ $(printf %s "$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
584
+ ROOT_URL: |-
585
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
586
+ HOSTNAME_INTERNAL: |-
587
+ $(printf %s "$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
588
+ ROOT_URL_INTERNAL: |-
589
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
590
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
591
+ projectId:region:instancename
592
+ DB_NAME: |-
593
+ pan-my-n8n-app-stage-n8n
594
+ DB_USER: |-
595
+ postgres
596
+ DB_PASSWORD: |-
597
+ $(printf %s "$CL_stage_n8n_DB_PASSWORD" | sed '1!s/^/ /')
598
+ DATABASE_URL: |-
599
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
600
+ DATABASE_JDBC_URL: |-
601
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
602
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
603
+ google-project-id
604
+ DEPLOY_CLOUD_RUN_REGION: |-
605
+ europe-west6
606
+ N8N_ENCRYPTION_KEY: |-
607
+ $(printf %s "$CL_stage_n8n_N8N_ENCRYPTION_KEY" | sed '1!s/^/ /')
608
+ GCLOUD_RUN_canonicalHostSuffix: |-
609
+ $(printf %s "$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
610
+ N8N_PORT: |-
611
+ 8080
612
+ N8N_PROTOCOL: |-
613
+ https
614
+ DB_TYPE: |-
615
+ postgresdb
616
+ DB_POSTGRESDB_DATABASE: |-
617
+ pan-my-n8n-app-stage-n8n
618
+ DB_POSTGRESDB_HOST: |-
619
+ /cloudsql/projectId:region:instancename
620
+ DB_POSTGRESDB_USER: |-
621
+ postgres
622
+ DB_POSTGRESDB_PASSWORD: |-
623
+ $(printf %s "$CL_stage_n8n_DB_PASSWORD" | sed '1!s/^/ /')
624
+ DB_POSTGRESDB_PORT: |-
625
+ 5432
626
+ DB_POSTGRESDB_SCHEMA: |-
627
+ public
628
+ GENERIC_TIMEZONE: |-
629
+ Europe/Zurich
630
+ N8N_DIAGNOSTICS_ENABLED: |-
631
+ false
632
+ N8N_PERSONALIZATION_ENABLED: |-
633
+ false
634
+ QUEUE_HEALTH_CHECK_ACTIVE: |-
635
+ true
636
+ WEBHOOK_URL: |-
637
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
638
+ N8N_EDITOR_BASE_URL: |-
639
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-stage-n8n-$CL_stage_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
640
+ _ALL_ENV_VAR_KEYS: |-
641
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","N8N_ENCRYPTION_KEY","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","N8N_PORT","N8N_PROTOCOL","DB_TYPE","DB_POSTGRESDB_DATABASE","DB_POSTGRESDB_HOST","DB_POSTGRESDB_USER","DB_POSTGRESDB_PASSWORD","DB_POSTGRESDB_PORT","DB_POSTGRESDB_SCHEMA","GENERIC_TIMEZONE","N8N_DIAGNOSTICS_ENABLED","N8N_PERSONALIZATION_ENABLED","QUEUE_HEALTH_CHECK_ACTIVE","WEBHOOK_URL","N8N_EDITOR_BASE_URL"]
642
+
643
+ EOF
644
+ - collapseable_section_end "writeenvvars"
645
+ - collapseable_section_start "deploy" "Deploy to cloud run"
646
+ - set +e
647
+ - echo "ensuring Database..."
648
+ - gcloud sql databases create pan-my-n8n-app-stage-n8n --instance=instancename --project projectId
649
+ - set -e
650
+ - gcloud run deploy pan-my-n8n-app-stage-n8n --command="/bin/sh" --args="-c","sleep 5; n8n start" --image=n8nio/n8n:2.12.0 --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=n8n,app-name=my-n8n-app,env-type=stage,env-name=stage,build-type=disabled,cloud-run-service-name=pan-my-n8n-app-stage-n8n --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --cpu=2 --memory=2Gi --timeout=3600s --allow-unauthenticated --ingress=all --session-affinity --cpu-boost --execution-environment=gen2
651
+ - collapseable_section_end "deploy"
652
+ - collapseable_section_start "cleanup" "Cleanup"
653
+ - set +e
654
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-my-n8n-app-stage-n8n --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
655
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/stage/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/stage/n8n@$version --quiet --delete-tags; done
656
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
657
+ - set -e
658
+ - collapseable_section_end "cleanup"
659
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
660
+ environment:
661
+ name: stage/n8n
662
+ url: $CL_GITLAB_ENVIRONMENT_URL
663
+ on_stop: 'n8n 🛑 Stop ⚠️ | stage '
664
+ artifacts:
665
+ reports:
666
+ dotenv: gitlab_environment.env
667
+ rules:
668
+ - when: never
669
+ if: $CI_PIPELINE_SOURCE == "trigger"
670
+ - when: on_success
671
+ if: $CI_COMMIT_TAG
672
+ needs: []
673
+ retry: *a1
674
+ interruptible: true
675
+ allow_failure: false
676
+ 'n8n 🛑 Stop ⚠️ | stage ':
677
+ stage: stop stage
678
+ image: path/to/docker/gcloud:the-version
679
+ variables:
680
+ KUBERNETES_CPU_REQUEST: '0.22'
681
+ KUBERNETES_MEMORY_REQUEST: 200Mi
682
+ KUBERNETES_MEMORY_LIMIT: 400Mi
683
+ GIT_STRATEGY: none
684
+ script:
685
+ - collapseable_section_start "injectvars" "Injecting variables"
686
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
687
+ - collapseable_section_end "injectvars"
688
+ - set +e
689
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_n8n_GCLOUD_DEPLOY_credentialsKey")
690
+ - gcloud run services delete pan-my-n8n-app-stage-n8n --project=google-project-id --region=europe-west6
691
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/stage/n8n --quiet --delete-tags
692
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
693
+ - set -e
694
+ environment:
695
+ name: stage/n8n
696
+ action: stop
697
+ rules:
698
+ - when: never
699
+ if: $CI_PIPELINE_SOURCE == "trigger"
700
+ - when: manual
701
+ if: $CI_COMMIT_TAG
702
+ needs: []
703
+ retry: *a1
704
+ interruptible: true
705
+ allow_failure: true
706
+ 'n8n 🚀 Deploy | prod ':
707
+ stage: deploy prod
708
+ image: path/to/docker/gcloud:the-version
709
+ variables:
710
+ KUBERNETES_CPU_REQUEST: '0.22'
711
+ KUBERNETES_MEMORY_REQUEST: 200Mi
712
+ KUBERNETES_MEMORY_LIMIT: 400Mi
713
+ script:
714
+ - collapseable_section_start "injectvars" "Injecting variables"
715
+ - export ENV_SHORT="prod"
716
+ - export APP_DIR="n8n"
717
+ - export ENV_TYPE="prod"
718
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
719
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
720
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
721
+ - export HOSTNAME="$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
722
+ - export ROOT_URL="https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
723
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
724
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
725
+ - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
726
+ - export DB_NAME="pan-my-n8n-app-prod-n8n"
727
+ - export DB_USER="postgres"
728
+ - export DB_PASSWORD="$CL_prod_n8n_DB_PASSWORD"
729
+ - export DATABASE_URL="postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME"
730
+ - export 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"
731
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
732
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
733
+ - export N8N_ENCRYPTION_KEY="$CL_prod_n8n_N8N_ENCRYPTION_KEY"
734
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_n8n_GCLOUD_DEPLOY_credentialsKey"
735
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix"
736
+ - export N8N_PORT="8080"
737
+ - export N8N_PROTOCOL="https"
738
+ - export DB_TYPE="postgresdb"
739
+ - export DB_POSTGRESDB_DATABASE="pan-my-n8n-app-prod-n8n"
740
+ - export DB_POSTGRESDB_HOST="/cloudsql/projectId:region:instancename"
741
+ - export DB_POSTGRESDB_USER="postgres"
742
+ - export DB_POSTGRESDB_PASSWORD="$CL_prod_n8n_DB_PASSWORD"
743
+ - export DB_POSTGRESDB_PORT="5432"
744
+ - export DB_POSTGRESDB_SCHEMA="public"
745
+ - export GENERIC_TIMEZONE="Europe/Zurich"
746
+ - export N8N_DIAGNOSTICS_ENABLED="false"
747
+ - export N8N_PERSONALIZATION_ENABLED="false"
748
+ - export QUEUE_HEALTH_CHECK_ACTIVE="true"
749
+ - export WEBHOOK_URL="https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
750
+ - export N8N_EDITOR_BASE_URL="https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
751
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"N8N_ENCRYPTION_KEY\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"N8N_PORT\\",\\"N8N_PROTOCOL\\",\\"DB_TYPE\\",\\"DB_POSTGRESDB_DATABASE\\",\\"DB_POSTGRESDB_HOST\\",\\"DB_POSTGRESDB_USER\\",\\"DB_POSTGRESDB_PASSWORD\\",\\"DB_POSTGRESDB_PORT\\",\\"DB_POSTGRESDB_SCHEMA\\",\\"GENERIC_TIMEZONE\\",\\"N8N_DIAGNOSTICS_ENABLED\\",\\"N8N_PERSONALIZATION_ENABLED\\",\\"QUEUE_HEALTH_CHECK_ACTIVE\\",\\"WEBHOOK_URL\\",\\"N8N_EDITOR_BASE_URL\\"]"
752
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
753
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/prod/n8n"
754
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n"
755
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
756
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
757
+ - collapseable_section_end "injectvars"
758
+ - collapseable_section_start "prepare" "Prepare..."
759
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_n8n_GCLOUD_DEPLOY_credentialsKey")
760
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
761
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
762
+ - collapseable_section_end "prepare"
763
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
764
+ - |
765
+ cat > ____envvars.yaml <<EOF
766
+ ENV_SHORT: |-
767
+ prod
768
+ APP_DIR: |-
769
+ n8n
770
+ ENV_TYPE: |-
771
+ prod
772
+ BUILD_INFO_BUILD_ID: |-
773
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
774
+ BUILD_INFO_BUILD_TIME: |-
775
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
776
+ BUILD_INFO_CURRENT_VERSION: |-
777
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
778
+ HOSTNAME: |-
779
+ $(printf %s "$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
780
+ ROOT_URL: |-
781
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
782
+ HOSTNAME_INTERNAL: |-
783
+ $(printf %s "$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
784
+ ROOT_URL_INTERNAL: |-
785
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
786
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
787
+ projectId:region:instancename
788
+ DB_NAME: |-
789
+ pan-my-n8n-app-prod-n8n
790
+ DB_USER: |-
791
+ postgres
792
+ DB_PASSWORD: |-
793
+ $(printf %s "$CL_prod_n8n_DB_PASSWORD" | sed '1!s/^/ /')
794
+ DATABASE_URL: |-
795
+ postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
796
+ DATABASE_JDBC_URL: |-
797
+ jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
798
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
799
+ google-project-id
800
+ DEPLOY_CLOUD_RUN_REGION: |-
801
+ europe-west6
802
+ N8N_ENCRYPTION_KEY: |-
803
+ $(printf %s "$CL_prod_n8n_N8N_ENCRYPTION_KEY" | sed '1!s/^/ /')
804
+ GCLOUD_RUN_canonicalHostSuffix: |-
805
+ $(printf %s "$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
806
+ N8N_PORT: |-
807
+ 8080
808
+ N8N_PROTOCOL: |-
809
+ https
810
+ DB_TYPE: |-
811
+ postgresdb
812
+ DB_POSTGRESDB_DATABASE: |-
813
+ pan-my-n8n-app-prod-n8n
814
+ DB_POSTGRESDB_HOST: |-
815
+ /cloudsql/projectId:region:instancename
816
+ DB_POSTGRESDB_USER: |-
817
+ postgres
818
+ DB_POSTGRESDB_PASSWORD: |-
819
+ $(printf %s "$CL_prod_n8n_DB_PASSWORD" | sed '1!s/^/ /')
820
+ DB_POSTGRESDB_PORT: |-
821
+ 5432
822
+ DB_POSTGRESDB_SCHEMA: |-
823
+ public
824
+ GENERIC_TIMEZONE: |-
825
+ Europe/Zurich
826
+ N8N_DIAGNOSTICS_ENABLED: |-
827
+ false
828
+ N8N_PERSONALIZATION_ENABLED: |-
829
+ false
830
+ QUEUE_HEALTH_CHECK_ACTIVE: |-
831
+ true
832
+ WEBHOOK_URL: |-
833
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
834
+ N8N_EDITOR_BASE_URL: |-
835
+ $(printf %s "https://$(printf %s "pan-my-n8n-app-prod-n8n-$CL_prod_n8n_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
836
+ _ALL_ENV_VAR_KEYS: |-
837
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","N8N_ENCRYPTION_KEY","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","N8N_PORT","N8N_PROTOCOL","DB_TYPE","DB_POSTGRESDB_DATABASE","DB_POSTGRESDB_HOST","DB_POSTGRESDB_USER","DB_POSTGRESDB_PASSWORD","DB_POSTGRESDB_PORT","DB_POSTGRESDB_SCHEMA","GENERIC_TIMEZONE","N8N_DIAGNOSTICS_ENABLED","N8N_PERSONALIZATION_ENABLED","QUEUE_HEALTH_CHECK_ACTIVE","WEBHOOK_URL","N8N_EDITOR_BASE_URL"]
838
+
839
+ EOF
840
+ - collapseable_section_end "writeenvvars"
841
+ - collapseable_section_start "deploy" "Deploy to cloud run"
842
+ - set +e
843
+ - echo "ensuring Database..."
844
+ - gcloud sql databases create pan-my-n8n-app-prod-n8n --instance=instancename --project projectId
845
+ - set -e
846
+ - gcloud run deploy pan-my-n8n-app-prod-n8n --command="/bin/sh" --args="-c","sleep 5; n8n start" --image=n8nio/n8n:2.12.0 --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=n8n,app-name=my-n8n-app,env-type=prod,env-name=prod,build-type=disabled,cloud-run-service-name=pan-my-n8n-app-prod-n8n --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --cpu=2 --memory=2Gi --timeout=3600s --allow-unauthenticated --ingress=all --session-affinity --cpu-boost --execution-environment=gen2
847
+ - collapseable_section_end "deploy"
848
+ - collapseable_section_start "cleanup" "Cleanup"
849
+ - set +e
850
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-my-n8n-app-prod-n8n --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
851
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/prod/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/prod/n8n@$version --quiet --delete-tags; done
852
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
853
+ - set -e
854
+ - collapseable_section_end "cleanup"
855
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
856
+ environment:
857
+ name: prod/n8n
858
+ url: $CL_GITLAB_ENVIRONMENT_URL
859
+ on_stop: 'n8n 🛑 Stop ⚠️ | prod '
860
+ artifacts:
861
+ reports:
862
+ dotenv: gitlab_environment.env
863
+ rules:
864
+ - when: never
865
+ if: $CI_PIPELINE_SOURCE == "trigger"
866
+ - when: manual
867
+ if: $CI_COMMIT_TAG
868
+ needs: []
869
+ retry: *a1
870
+ interruptible: true
871
+ allow_failure: true
872
+ 'n8n 🛑 Stop ⚠️ | prod ':
873
+ stage: stop prod
874
+ image: path/to/docker/gcloud:the-version
875
+ variables:
876
+ KUBERNETES_CPU_REQUEST: '0.22'
877
+ KUBERNETES_MEMORY_REQUEST: 200Mi
878
+ KUBERNETES_MEMORY_LIMIT: 400Mi
879
+ GIT_STRATEGY: none
880
+ script:
881
+ - collapseable_section_start "injectvars" "Injecting variables"
882
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
883
+ - collapseable_section_end "injectvars"
884
+ - set +e
885
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_n8n_GCLOUD_DEPLOY_credentialsKey")
886
+ - gcloud run services delete pan-my-n8n-app-prod-n8n --project=google-project-id --region=europe-west6
887
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/prod/n8n --quiet --delete-tags
888
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-my-n8n-app/caches/n8n@$version --quiet --delete-tags; done
889
+ - set -e
890
+ environment:
891
+ name: prod/n8n
892
+ action: stop
893
+ rules:
894
+ - when: never
895
+ if: $CI_PIPELINE_SOURCE == "trigger"
896
+ - when: manual
897
+ if: $CI_COMMIT_TAG
898
+ needs: []
899
+ retry: *a1
900
+ interruptible: true
901
+ allow_failure: true
902
+ create release:
903
+ stage: release
904
+ image: path/to/docker/semantic-release:the-version
905
+ script:
906
+ - semanticRelease
907
+ after_script:
908
+ - echo '👉 If this job failed with access denied, the project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
909
+ rules:
910
+ - &a2
911
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
912
+ when: never
913
+ - &a3
914
+ if: $CI_PIPELINE_SOURCE == "trigger"
915
+ when: never
916
+ - &a4
917
+ if: $CI_PIPELINE_SOURCE == "schedule"
918
+ when: never
919
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
920
+ when: manual
921
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
922
+ when: manual
923
+ ⚠️ force create release:
924
+ stage: release
925
+ image: path/to/docker/semantic-release:the-version
926
+ script:
927
+ - semanticRelease
928
+ after_script:
929
+ - echo '👉 If this job failed with access denied, the project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
930
+ rules:
931
+ - *a2
932
+ - *a3
933
+ - *a4
934
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
935
+ when: manual
936
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
937
+ when: manual
938
+ needs: []
939
+ "
940
+ `;