@catladder/pipeline 1.113.1 → 1.114.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.
@@ -2093,3 +2093,2097 @@ jobs:
2093
2093
  },
2094
2094
  }
2095
2095
  `;
2096
+
2097
+ exports[`matches snapshot with a Dockerfile 1`] = `
2098
+ {
2099
+ "mainBranch": {
2100
+ "image": "path/to/docker/jobs-default:the-version",
2101
+ "jobs": {
2102
+ "app ↩️ Rollback ⚠️ | dev ": {
2103
+ "environment": {
2104
+ "action": "access",
2105
+ "name": "dev/app",
2106
+ "url": "https://app.dev.test-app.pan.panter.cloud",
2107
+ },
2108
+ "image": "path/to/docker/kubernetes:the-version",
2109
+ "interruptible": true,
2110
+ "needs": [],
2111
+ "retry": {
2112
+ "max": 2,
2113
+ "when": [
2114
+ "runner_system_failure",
2115
+ "stuck_or_timeout_failure",
2116
+ ],
2117
+ },
2118
+ "rules": [
2119
+ {
2120
+ "allow_failure": true,
2121
+ "when": "manual",
2122
+ },
2123
+ ],
2124
+ "script": [
2125
+ "kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2126
+ "kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"",
2127
+ "kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"",
2128
+ "kubectl config use-context "kube-pan-test-app-dev-app"",
2129
+ "kubernetesRollback",
2130
+ ],
2131
+ "stage": "rollback dev",
2132
+ "variables": {
2133
+ "APP_DIR": ".",
2134
+ "BUILD_ID": "some-id",
2135
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2136
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2137
+ "BUILD_INFO_ID": "some-id",
2138
+ "COMPONENT_NAME": "app",
2139
+ "ENV_SHORT": "dev",
2140
+ "ENV_TYPE": "dev",
2141
+ "GIT_STRATEGY": "none",
2142
+ "HELM_ARGS": "",
2143
+ "HELM_EXPERIMENTAL_OCI": "1",
2144
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2145
+ "HOST_CANONICAL": "app.dev.test-app.pan.panter.cloud",
2146
+ "KUBERNETES_CPU_LIMIT": "1",
2147
+ "KUBERNETES_CPU_REQUEST": "0.5",
2148
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2149
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2150
+ "KUBE_APP_NAME": "app",
2151
+ "KUBE_APP_NAME_PREFIX": "",
2152
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
2153
+ "KUBE_NAMESPACE": "pan-test-app-dev",
2154
+ "KUBE_VALUES": "env:
2155
+ secret:
2156
+ SECRET_KEY_BASE: '$CL_dev_app_SECRET_KEY_BASE'
2157
+ POSTGRESQL_PASSWORD: '$CL_dev_app_POSTGRESQL_PASSWORD'
2158
+ cloudsqlProxyCredentials: '$CL_dev_app_cloudsqlProxyCredentials'
2159
+ public:
2160
+ ENV_SHORT: 'dev'
2161
+ APP_DIR: '.'
2162
+ ENV_TYPE: 'dev'
2163
+ BUILD_INFO_ID: 'some-id'
2164
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2165
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
2166
+ ROOT_URL: 'https://app.dev.test-app.pan.panter.cloud'
2167
+ KUBE_NAMESPACE: 'pan-test-app-dev'
2168
+ KUBE_APP_NAME: 'app'
2169
+ KUBE_APP_NAME_PREFIX: ''
2170
+ HOST_CANONICAL: 'app.dev.test-app.pan.panter.cloud'
2171
+ RAILS_ENV: 'production'
2172
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
2173
+ application:
2174
+ host: 'app.dev.test-app.pan.panter.cloud'
2175
+ command: '/cnb/process/web'
2176
+ livenessProbe:
2177
+ httpGet:
2178
+ path: '__health'
2179
+ readinessProbe:
2180
+ httpGet:
2181
+ path: '__health'
2182
+ startupProbe:
2183
+ httpGet:
2184
+ path: '__health'
2185
+ worker:
2186
+ enabled: true
2187
+ command: 'launcher bundle exec rake jobs:work'
2188
+ cloudsql:
2189
+ enabled: true
2190
+ dbUser: 'postgres'
2191
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-dev'
2192
+ proxyCredentials: '$CL_dev_app_cloudsqlProxyCredentials'
2193
+ fullDbName: 'app'
2194
+ projectId: 'some-project-id'
2195
+ jobs:
2196
+ db-migrate:
2197
+ hook: 'post-install,post-upgrade'
2198
+ command: 'launcher bundle exec rake db:migrate'
2199
+ ",
2200
+ "POSTGRESQL_PASSWORD": "$CL_dev_app_POSTGRESQL_PASSWORD",
2201
+ "RAILS_ENV": "production",
2202
+ "RELEASE_NAME": "pan-test-app-dev-app",
2203
+ "ROOT_URL": "https://app.dev.test-app.pan.panter.cloud",
2204
+ "SECRET_KEY_BASE": "$CL_dev_app_SECRET_KEY_BASE",
2205
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
2206
+ "cloudsqlProxyCredentials": "$CL_dev_app_cloudsqlProxyCredentials",
2207
+ },
2208
+ },
2209
+ "app 👮 lint": {
2210
+ "cache": {
2211
+ "key": {
2212
+ "files": [
2213
+ "Gemfile.lock",
2214
+ ],
2215
+ "prefix": "$CI_JOB_IMAGE",
2216
+ },
2217
+ "paths": [
2218
+ "tmp/cache",
2219
+ ],
2220
+ },
2221
+ "image": "ruby:3.2.1",
2222
+ "interruptible": true,
2223
+ "needs": [],
2224
+ "retry": {
2225
+ "max": 2,
2226
+ "when": [
2227
+ "runner_system_failure",
2228
+ "stuck_or_timeout_failure",
2229
+ ],
2230
+ },
2231
+ "script": [
2232
+ "cd .",
2233
+ "bundle config set path 'tmp/cache'",
2234
+ "bundle install -j $(nproc)",
2235
+ "bundle exec rubocop",
2236
+ ],
2237
+ "stage": "test",
2238
+ "variables": {},
2239
+ },
2240
+ "app 🔨 docker | dev ": {
2241
+ "image": "path/to/docker/docker-build:the-version",
2242
+ "interruptible": true,
2243
+ "needs": [],
2244
+ "retry": {
2245
+ "max": 2,
2246
+ "when": [
2247
+ "runner_system_failure",
2248
+ "stuck_or_timeout_failure",
2249
+ ],
2250
+ },
2251
+ "script": [
2252
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2253
+ "docker version",
2254
+ "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",
2255
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2256
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2257
+ "docker push $DOCKER_CACHE_IMAGE",
2258
+ ],
2259
+ "services": [
2260
+ {
2261
+ "command": [
2262
+ "--tls=false",
2263
+ ],
2264
+ "name": "docker:20-dind",
2265
+ },
2266
+ ],
2267
+ "stage": "build",
2268
+ "variables": {
2269
+ "APP_DIR": ".",
2270
+ "DOCKERFILE_ADDITIONS": undefined,
2271
+ "DOCKERFILE_ADDITIONS_END": undefined,
2272
+ "DOCKER_BUILDKIT": "1",
2273
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
2274
+ "DOCKER_DIR": ".",
2275
+ "DOCKER_DRIVER": "overlay2",
2276
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2277
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2278
+ "DOCKER_IMAGE_NAME": "dev/app",
2279
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2280
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2281
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2282
+ "DOCKER_TLS_CERTDIR": "",
2283
+ "KUBERNETES_CPU_LIMIT": "1",
2284
+ "KUBERNETES_CPU_REQUEST": "0.5",
2285
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2286
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2287
+ },
2288
+ },
2289
+ "app 🚀 Deploy | dev ": {
2290
+ "allow_failure": false,
2291
+ "environment": {
2292
+ "auto_stop_in": "4 weeks",
2293
+ "name": "dev/app",
2294
+ "on_stop": "app 🛑 Stop ⚠️ | dev ",
2295
+ "url": "https://app.dev.test-app.pan.panter.cloud",
2296
+ },
2297
+ "image": "path/to/docker/kubernetes:the-version",
2298
+ "interruptible": true,
2299
+ "needs": [
2300
+ {
2301
+ "artifacts": false,
2302
+ "job": "app 👮 lint",
2303
+ },
2304
+ {
2305
+ "artifacts": false,
2306
+ "job": "app 🔨 docker | dev ",
2307
+ },
2308
+ {
2309
+ "artifacts": false,
2310
+ "job": "app 🧪 test",
2311
+ },
2312
+ {
2313
+ "artifacts": true,
2314
+ "job": "app 🧾 sbom | dev ",
2315
+ },
2316
+ {
2317
+ "artifacts": false,
2318
+ "job": "app 🛡 audit",
2319
+ },
2320
+ ],
2321
+ "retry": {
2322
+ "max": 2,
2323
+ "when": [
2324
+ "runner_system_failure",
2325
+ "stuck_or_timeout_failure",
2326
+ ],
2327
+ },
2328
+ "rules": [
2329
+ {
2330
+ "when": "on_success",
2331
+ },
2332
+ ],
2333
+ "script": [
2334
+ "kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2335
+ "kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"",
2336
+ "kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"",
2337
+ "kubectl config use-context "kube-pan-test-app-dev-app"",
2338
+ "kubernetesCreateSecret",
2339
+ "kubernetesDeploy",
2340
+ "echo Uploading SBOM to Dependency Track",
2341
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://app.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2342
+ "echo deployment successful 😻",
2343
+ ],
2344
+ "stage": "deploy dev",
2345
+ "variables": {
2346
+ "APP_DIR": ".",
2347
+ "BUILD_ID": "some-id",
2348
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2349
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2350
+ "BUILD_INFO_ID": "some-id",
2351
+ "COMPONENT_NAME": "app",
2352
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
2353
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2354
+ "DOCKER_IMAGE_NAME": "dev/app",
2355
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2356
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2357
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2358
+ "ENV_SHORT": "dev",
2359
+ "ENV_TYPE": "dev",
2360
+ "HELM_ARGS": "",
2361
+ "HELM_EXPERIMENTAL_OCI": "1",
2362
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2363
+ "HOST_CANONICAL": "app.dev.test-app.pan.panter.cloud",
2364
+ "KUBERNETES_CPU_LIMIT": "1",
2365
+ "KUBERNETES_CPU_REQUEST": "0.5",
2366
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2367
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2368
+ "KUBE_APP_NAME": "app",
2369
+ "KUBE_APP_NAME_PREFIX": "",
2370
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
2371
+ "KUBE_NAMESPACE": "pan-test-app-dev",
2372
+ "KUBE_VALUES": "env:
2373
+ secret:
2374
+ SECRET_KEY_BASE: '$CL_dev_app_SECRET_KEY_BASE'
2375
+ POSTGRESQL_PASSWORD: '$CL_dev_app_POSTGRESQL_PASSWORD'
2376
+ cloudsqlProxyCredentials: '$CL_dev_app_cloudsqlProxyCredentials'
2377
+ public:
2378
+ ENV_SHORT: 'dev'
2379
+ APP_DIR: '.'
2380
+ ENV_TYPE: 'dev'
2381
+ BUILD_INFO_ID: 'some-id'
2382
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2383
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
2384
+ ROOT_URL: 'https://app.dev.test-app.pan.panter.cloud'
2385
+ KUBE_NAMESPACE: 'pan-test-app-dev'
2386
+ KUBE_APP_NAME: 'app'
2387
+ KUBE_APP_NAME_PREFIX: ''
2388
+ HOST_CANONICAL: 'app.dev.test-app.pan.panter.cloud'
2389
+ RAILS_ENV: 'production'
2390
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
2391
+ application:
2392
+ host: 'app.dev.test-app.pan.panter.cloud'
2393
+ command: '/cnb/process/web'
2394
+ livenessProbe:
2395
+ httpGet:
2396
+ path: '__health'
2397
+ readinessProbe:
2398
+ httpGet:
2399
+ path: '__health'
2400
+ startupProbe:
2401
+ httpGet:
2402
+ path: '__health'
2403
+ worker:
2404
+ enabled: true
2405
+ command: 'launcher bundle exec rake jobs:work'
2406
+ cloudsql:
2407
+ enabled: true
2408
+ dbUser: 'postgres'
2409
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-dev'
2410
+ proxyCredentials: '$CL_dev_app_cloudsqlProxyCredentials'
2411
+ fullDbName: 'app'
2412
+ projectId: 'some-project-id'
2413
+ jobs:
2414
+ db-migrate:
2415
+ hook: 'post-install,post-upgrade'
2416
+ command: 'launcher bundle exec rake db:migrate'
2417
+ ",
2418
+ "POSTGRESQL_PASSWORD": "$CL_dev_app_POSTGRESQL_PASSWORD",
2419
+ "RAILS_ENV": "production",
2420
+ "RELEASE_NAME": "pan-test-app-dev-app",
2421
+ "ROOT_URL": "https://app.dev.test-app.pan.panter.cloud",
2422
+ "SECRET_KEY_BASE": "$CL_dev_app_SECRET_KEY_BASE",
2423
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
2424
+ "cloudsqlProxyCredentials": "$CL_dev_app_cloudsqlProxyCredentials",
2425
+ },
2426
+ },
2427
+ "app 🛑 Stop ⚠️ | dev ": {
2428
+ "environment": {
2429
+ "action": "stop",
2430
+ "name": "dev/app",
2431
+ "url": "https://app.dev.test-app.pan.panter.cloud",
2432
+ },
2433
+ "image": "path/to/docker/kubernetes:the-version",
2434
+ "interruptible": true,
2435
+ "needs": [],
2436
+ "retry": {
2437
+ "max": 2,
2438
+ "when": [
2439
+ "runner_system_failure",
2440
+ "stuck_or_timeout_failure",
2441
+ ],
2442
+ },
2443
+ "rules": [
2444
+ {
2445
+ "allow_failure": true,
2446
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2447
+ "when": "on_success",
2448
+ },
2449
+ {
2450
+ "allow_failure": true,
2451
+ "when": "manual",
2452
+ },
2453
+ ],
2454
+ "script": [
2455
+ "kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2456
+ "kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"",
2457
+ "kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"",
2458
+ "kubectl config use-context "kube-pan-test-app-dev-app"",
2459
+ "kubernetesDelete",
2460
+ "echo Disabling component in Dependency Track",
2461
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://app.dev.test-app.pan.panter.cloud" || true",
2462
+ ],
2463
+ "stage": "stop dev",
2464
+ "variables": {
2465
+ "APP_DIR": ".",
2466
+ "BUILD_ID": "some-id",
2467
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2468
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2469
+ "BUILD_INFO_ID": "some-id",
2470
+ "COMPONENT_NAME": "app",
2471
+ "ENV_SHORT": "dev",
2472
+ "ENV_TYPE": "dev",
2473
+ "GIT_STRATEGY": "none",
2474
+ "HELM_ARGS": "",
2475
+ "HELM_EXPERIMENTAL_OCI": "1",
2476
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2477
+ "HOST_CANONICAL": "app.dev.test-app.pan.panter.cloud",
2478
+ "KUBERNETES_CPU_LIMIT": "1",
2479
+ "KUBERNETES_CPU_REQUEST": "0.5",
2480
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2481
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2482
+ "KUBE_APP_NAME": "app",
2483
+ "KUBE_APP_NAME_PREFIX": "",
2484
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
2485
+ "KUBE_NAMESPACE": "pan-test-app-dev",
2486
+ "KUBE_VALUES": "env:
2487
+ secret:
2488
+ SECRET_KEY_BASE: '$CL_dev_app_SECRET_KEY_BASE'
2489
+ POSTGRESQL_PASSWORD: '$CL_dev_app_POSTGRESQL_PASSWORD'
2490
+ cloudsqlProxyCredentials: '$CL_dev_app_cloudsqlProxyCredentials'
2491
+ public:
2492
+ ENV_SHORT: 'dev'
2493
+ APP_DIR: '.'
2494
+ ENV_TYPE: 'dev'
2495
+ BUILD_INFO_ID: 'some-id'
2496
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2497
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
2498
+ ROOT_URL: 'https://app.dev.test-app.pan.panter.cloud'
2499
+ KUBE_NAMESPACE: 'pan-test-app-dev'
2500
+ KUBE_APP_NAME: 'app'
2501
+ KUBE_APP_NAME_PREFIX: ''
2502
+ HOST_CANONICAL: 'app.dev.test-app.pan.panter.cloud'
2503
+ RAILS_ENV: 'production'
2504
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
2505
+ application:
2506
+ host: 'app.dev.test-app.pan.panter.cloud'
2507
+ command: '/cnb/process/web'
2508
+ livenessProbe:
2509
+ httpGet:
2510
+ path: '__health'
2511
+ readinessProbe:
2512
+ httpGet:
2513
+ path: '__health'
2514
+ startupProbe:
2515
+ httpGet:
2516
+ path: '__health'
2517
+ worker:
2518
+ enabled: true
2519
+ command: 'launcher bundle exec rake jobs:work'
2520
+ cloudsql:
2521
+ enabled: true
2522
+ dbUser: 'postgres'
2523
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-dev'
2524
+ proxyCredentials: '$CL_dev_app_cloudsqlProxyCredentials'
2525
+ fullDbName: 'app'
2526
+ projectId: 'some-project-id'
2527
+ jobs:
2528
+ db-migrate:
2529
+ hook: 'post-install,post-upgrade'
2530
+ command: 'launcher bundle exec rake db:migrate'
2531
+ ",
2532
+ "POSTGRESQL_PASSWORD": "$CL_dev_app_POSTGRESQL_PASSWORD",
2533
+ "RAILS_ENV": "production",
2534
+ "RELEASE_NAME": "pan-test-app-dev-app",
2535
+ "ROOT_URL": "https://app.dev.test-app.pan.panter.cloud",
2536
+ "SECRET_KEY_BASE": "$CL_dev_app_SECRET_KEY_BASE",
2537
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
2538
+ "cloudsqlProxyCredentials": "$CL_dev_app_cloudsqlProxyCredentials",
2539
+ },
2540
+ },
2541
+ "app 🛡 audit": {
2542
+ "allow_failure": true,
2543
+ "image": "ruby:3.2.1",
2544
+ "interruptible": true,
2545
+ "needs": [],
2546
+ "retry": {
2547
+ "max": 2,
2548
+ "when": [
2549
+ "runner_system_failure",
2550
+ "stuck_or_timeout_failure",
2551
+ ],
2552
+ },
2553
+ "script": [
2554
+ "cd .",
2555
+ "gem install bundler-audit",
2556
+ "bundle audit check",
2557
+ ],
2558
+ "stage": "test",
2559
+ "variables": {},
2560
+ },
2561
+ "app 🧪 test": {
2562
+ "cache": {
2563
+ "key": {
2564
+ "files": [
2565
+ "Gemfile.lock",
2566
+ ],
2567
+ "prefix": "$CI_JOB_IMAGE",
2568
+ },
2569
+ "paths": [
2570
+ "tmp/cache",
2571
+ ],
2572
+ },
2573
+ "image": "ruby:3.2.1",
2574
+ "interruptible": true,
2575
+ "needs": [],
2576
+ "retry": {
2577
+ "max": 2,
2578
+ "when": [
2579
+ "runner_system_failure",
2580
+ "stuck_or_timeout_failure",
2581
+ ],
2582
+ },
2583
+ "script": [
2584
+ "cd .",
2585
+ "bundle config set path 'tmp/cache'",
2586
+ "bundle install -j $(nproc)",
2587
+ "bundle exec rspec",
2588
+ ],
2589
+ "stage": "test",
2590
+ "variables": {},
2591
+ },
2592
+ "app 🧾 sbom | dev ": {
2593
+ "allow_failure": true,
2594
+ "artifacts": {
2595
+ "paths": [
2596
+ "__sbom.json",
2597
+ ],
2598
+ },
2599
+ "image": "aquasec/trivy:0.38.3",
2600
+ "interruptible": true,
2601
+ "needs": [],
2602
+ "retry": {
2603
+ "max": 2,
2604
+ "when": [
2605
+ "runner_system_failure",
2606
+ "stuck_or_timeout_failure",
2607
+ ],
2608
+ },
2609
+ "script": [
2610
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" .",
2611
+ ],
2612
+ "stage": "build",
2613
+ "variables": {},
2614
+ },
2615
+ },
2616
+ "stages": [
2617
+ "setup",
2618
+ "setup dev",
2619
+ "setup review",
2620
+ "setup stage",
2621
+ "setup prod",
2622
+ "setup local",
2623
+ "test",
2624
+ "test dev",
2625
+ "test review",
2626
+ "test stage",
2627
+ "test prod",
2628
+ "test local",
2629
+ "build",
2630
+ "build dev",
2631
+ "build review",
2632
+ "build stage",
2633
+ "build prod",
2634
+ "build local",
2635
+ "deploy",
2636
+ "deploy dev",
2637
+ "deploy review",
2638
+ "deploy stage",
2639
+ "deploy prod",
2640
+ "deploy local",
2641
+ "verify",
2642
+ "verify dev",
2643
+ "verify review",
2644
+ "verify stage",
2645
+ "verify prod",
2646
+ "verify local",
2647
+ "rollback",
2648
+ "rollback dev",
2649
+ "rollback review",
2650
+ "rollback stage",
2651
+ "rollback prod",
2652
+ "rollback local",
2653
+ "stop",
2654
+ "stop dev",
2655
+ "stop review",
2656
+ "stop stage",
2657
+ "stop prod",
2658
+ "stop local",
2659
+ ],
2660
+ "variables": {
2661
+ "FF_USE_FASTZIP": "true",
2662
+ },
2663
+ "workflow": {
2664
+ "rules": [
2665
+ {
2666
+ "if": "$CI_COMMIT_TAG",
2667
+ },
2668
+ {
2669
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
2670
+ "when": "never",
2671
+ },
2672
+ {
2673
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
2674
+ },
2675
+ {
2676
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
2677
+ },
2678
+ {
2679
+ "if": "$CI_MERGE_REQUEST_ID",
2680
+ },
2681
+ ],
2682
+ },
2683
+ },
2684
+ "mr": {
2685
+ "image": "path/to/docker/jobs-default:the-version",
2686
+ "jobs": {
2687
+ "app ↩️ Rollback ⚠️ | review ": {
2688
+ "environment": {
2689
+ "action": "access",
2690
+ "name": "review/some-commit/app",
2691
+ "url": "https://app.mr1234.review.test-app.pan.panter.cloud",
2692
+ },
2693
+ "image": "path/to/docker/kubernetes:the-version",
2694
+ "interruptible": true,
2695
+ "needs": [],
2696
+ "retry": {
2697
+ "max": 2,
2698
+ "when": [
2699
+ "runner_system_failure",
2700
+ "stuck_or_timeout_failure",
2701
+ ],
2702
+ },
2703
+ "rules": [
2704
+ {
2705
+ "allow_failure": true,
2706
+ "when": "manual",
2707
+ },
2708
+ ],
2709
+ "script": [
2710
+ "kubectl config set-cluster "kube-pan-test-app-review-mr1234-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2711
+ "kubectl config set-credentials "kube-pan-test-app-review-mr1234-app" --token="$CL_review_app_KUBE_TOKEN"",
2712
+ "kubectl config set-context "kube-pan-test-app-review-mr1234-app" --cluster="kube-pan-test-app-review-mr1234-app" --user="kube-pan-test-app-review-mr1234-app" --namespace="pan-test-app-review"",
2713
+ "kubectl config use-context "kube-pan-test-app-review-mr1234-app"",
2714
+ "kubernetesRollback",
2715
+ ],
2716
+ "stage": "rollback review",
2717
+ "variables": {
2718
+ "APP_DIR": ".",
2719
+ "BUILD_ID": "some-id",
2720
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2721
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2722
+ "BUILD_INFO_ID": "some-id",
2723
+ "COMPONENT_NAME": "app",
2724
+ "ENV_SHORT": "review",
2725
+ "ENV_TYPE": "review",
2726
+ "GIT_STRATEGY": "none",
2727
+ "HELM_ARGS": "",
2728
+ "HELM_EXPERIMENTAL_OCI": "1",
2729
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2730
+ "HOST_CANONICAL": "app.mr1234.review.test-app.pan.panter.cloud",
2731
+ "KUBERNETES_CPU_LIMIT": "1",
2732
+ "KUBERNETES_CPU_REQUEST": "0.5",
2733
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2734
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2735
+ "KUBE_APP_NAME": "mr1234-app",
2736
+ "KUBE_APP_NAME_PREFIX": "mr1234-",
2737
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
2738
+ "KUBE_NAMESPACE": "pan-test-app-review",
2739
+ "KUBE_VALUES": "env:
2740
+ secret:
2741
+ SECRET_KEY_BASE: '$CL_review_app_SECRET_KEY_BASE'
2742
+ POSTGRESQL_PASSWORD: '$CL_review_app_POSTGRESQL_PASSWORD'
2743
+ cloudsqlProxyCredentials: '$CL_review_app_cloudsqlProxyCredentials'
2744
+ public:
2745
+ ENV_SHORT: 'review'
2746
+ APP_DIR: '.'
2747
+ ENV_TYPE: 'review'
2748
+ BUILD_INFO_ID: 'some-id'
2749
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2750
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
2751
+ ROOT_URL: 'https://app.mr1234.review.test-app.pan.panter.cloud'
2752
+ KUBE_NAMESPACE: 'pan-test-app-review'
2753
+ KUBE_APP_NAME: 'mr1234-app'
2754
+ KUBE_APP_NAME_PREFIX: 'mr1234-'
2755
+ HOST_CANONICAL: 'app.mr1234.review.test-app.pan.panter.cloud'
2756
+ RAILS_ENV: 'production'
2757
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
2758
+ application:
2759
+ host: 'app.mr1234.review.test-app.pan.panter.cloud'
2760
+ command: '/cnb/process/web'
2761
+ livenessProbe:
2762
+ httpGet:
2763
+ path: '__health'
2764
+ readinessProbe:
2765
+ httpGet:
2766
+ path: '__health'
2767
+ startupProbe:
2768
+ httpGet:
2769
+ path: '__health'
2770
+ worker:
2771
+ enabled: true
2772
+ command: 'launcher bundle exec rake jobs:work'
2773
+ cloudsql:
2774
+ enabled: true
2775
+ dbUser: 'postgres'
2776
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-review'
2777
+ proxyCredentials: '$CL_review_app_cloudsqlProxyCredentials'
2778
+ fullDbName: 'mr1234-app'
2779
+ projectId: 'some-project-id'
2780
+ jobs:
2781
+ db-migrate:
2782
+ hook: 'post-upgrade'
2783
+ command: 'launcher bundle exec rake db:migrate'
2784
+ db-prepare-seed:
2785
+ hook: 'post-install'
2786
+ command: 'launcher bundle exec rake db:prepare db:seed'
2787
+ ",
2788
+ "POSTGRESQL_PASSWORD": "$CL_review_app_POSTGRESQL_PASSWORD",
2789
+ "RAILS_ENV": "production",
2790
+ "RELEASE_NAME": "pan-test-app-review-mr1234-app",
2791
+ "ROOT_URL": "https://app.mr1234.review.test-app.pan.panter.cloud",
2792
+ "SECRET_KEY_BASE": "$CL_review_app_SECRET_KEY_BASE",
2793
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
2794
+ "cloudsqlProxyCredentials": "$CL_review_app_cloudsqlProxyCredentials",
2795
+ },
2796
+ },
2797
+ "app 👮 lint": {
2798
+ "cache": {
2799
+ "key": {
2800
+ "files": [
2801
+ "Gemfile.lock",
2802
+ ],
2803
+ "prefix": "$CI_JOB_IMAGE",
2804
+ },
2805
+ "paths": [
2806
+ "tmp/cache",
2807
+ ],
2808
+ },
2809
+ "image": "ruby:3.2.1",
2810
+ "interruptible": true,
2811
+ "needs": [],
2812
+ "retry": {
2813
+ "max": 2,
2814
+ "when": [
2815
+ "runner_system_failure",
2816
+ "stuck_or_timeout_failure",
2817
+ ],
2818
+ },
2819
+ "script": [
2820
+ "cd .",
2821
+ "bundle config set path 'tmp/cache'",
2822
+ "bundle install -j $(nproc)",
2823
+ "bundle exec rubocop",
2824
+ ],
2825
+ "stage": "test",
2826
+ "variables": {},
2827
+ },
2828
+ "app 🔨 docker | review ": {
2829
+ "image": "path/to/docker/docker-build:the-version",
2830
+ "interruptible": true,
2831
+ "needs": [],
2832
+ "retry": {
2833
+ "max": 2,
2834
+ "when": [
2835
+ "runner_system_failure",
2836
+ "stuck_or_timeout_failure",
2837
+ ],
2838
+ },
2839
+ "script": [
2840
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2841
+ "docker version",
2842
+ "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",
2843
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2844
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2845
+ "docker push $DOCKER_CACHE_IMAGE",
2846
+ ],
2847
+ "services": [
2848
+ {
2849
+ "command": [
2850
+ "--tls=false",
2851
+ ],
2852
+ "name": "docker:20-dind",
2853
+ },
2854
+ ],
2855
+ "stage": "build",
2856
+ "variables": {
2857
+ "APP_DIR": ".",
2858
+ "DOCKERFILE_ADDITIONS": undefined,
2859
+ "DOCKERFILE_ADDITIONS_END": undefined,
2860
+ "DOCKER_BUILDKIT": "1",
2861
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
2862
+ "DOCKER_DIR": ".",
2863
+ "DOCKER_DRIVER": "overlay2",
2864
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2865
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2866
+ "DOCKER_IMAGE_NAME": "review/app",
2867
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2868
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2869
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2870
+ "DOCKER_TLS_CERTDIR": "",
2871
+ "KUBERNETES_CPU_LIMIT": "1",
2872
+ "KUBERNETES_CPU_REQUEST": "0.5",
2873
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2874
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2875
+ },
2876
+ },
2877
+ "app 🚀 Deploy | review ": {
2878
+ "allow_failure": false,
2879
+ "environment": {
2880
+ "auto_stop_in": "2 week",
2881
+ "name": "review/some-commit/app",
2882
+ "on_stop": "app 🛑 Stop ⚠️ | review ",
2883
+ "url": "https://app.mr1234.review.test-app.pan.panter.cloud",
2884
+ },
2885
+ "image": "path/to/docker/kubernetes:the-version",
2886
+ "interruptible": true,
2887
+ "needs": [
2888
+ {
2889
+ "artifacts": false,
2890
+ "job": "app 👮 lint",
2891
+ },
2892
+ {
2893
+ "artifacts": false,
2894
+ "job": "app 🔨 docker | review ",
2895
+ },
2896
+ {
2897
+ "artifacts": false,
2898
+ "job": "app 🧪 test",
2899
+ },
2900
+ {
2901
+ "artifacts": true,
2902
+ "job": "app 🧾 sbom | review ",
2903
+ },
2904
+ {
2905
+ "artifacts": false,
2906
+ "job": "app 🛡 audit",
2907
+ },
2908
+ ],
2909
+ "retry": {
2910
+ "max": 2,
2911
+ "when": [
2912
+ "runner_system_failure",
2913
+ "stuck_or_timeout_failure",
2914
+ ],
2915
+ },
2916
+ "rules": [
2917
+ {
2918
+ "when": "on_success",
2919
+ },
2920
+ ],
2921
+ "script": [
2922
+ "kubectl config set-cluster "kube-pan-test-app-review-mr1234-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2923
+ "kubectl config set-credentials "kube-pan-test-app-review-mr1234-app" --token="$CL_review_app_KUBE_TOKEN"",
2924
+ "kubectl config set-context "kube-pan-test-app-review-mr1234-app" --cluster="kube-pan-test-app-review-mr1234-app" --user="kube-pan-test-app-review-mr1234-app" --namespace="pan-test-app-review"",
2925
+ "kubectl config use-context "kube-pan-test-app-review-mr1234-app"",
2926
+ "kubernetesCreateSecret",
2927
+ "kubernetesDeploy",
2928
+ "echo Uploading SBOM to Dependency Track",
2929
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://app.mr1234.review.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2930
+ "echo deployment successful 😻",
2931
+ ],
2932
+ "stage": "deploy review",
2933
+ "variables": {
2934
+ "APP_DIR": ".",
2935
+ "BUILD_ID": "some-id",
2936
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2937
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2938
+ "BUILD_INFO_ID": "some-id",
2939
+ "COMPONENT_NAME": "app",
2940
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
2941
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
2942
+ "DOCKER_IMAGE_NAME": "review/app",
2943
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2944
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
2945
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
2946
+ "ENV_SHORT": "review",
2947
+ "ENV_TYPE": "review",
2948
+ "HELM_ARGS": "",
2949
+ "HELM_EXPERIMENTAL_OCI": "1",
2950
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2951
+ "HOST_CANONICAL": "app.mr1234.review.test-app.pan.panter.cloud",
2952
+ "KUBERNETES_CPU_LIMIT": "1",
2953
+ "KUBERNETES_CPU_REQUEST": "0.5",
2954
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2955
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2956
+ "KUBE_APP_NAME": "mr1234-app",
2957
+ "KUBE_APP_NAME_PREFIX": "mr1234-",
2958
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
2959
+ "KUBE_NAMESPACE": "pan-test-app-review",
2960
+ "KUBE_VALUES": "env:
2961
+ secret:
2962
+ SECRET_KEY_BASE: '$CL_review_app_SECRET_KEY_BASE'
2963
+ POSTGRESQL_PASSWORD: '$CL_review_app_POSTGRESQL_PASSWORD'
2964
+ cloudsqlProxyCredentials: '$CL_review_app_cloudsqlProxyCredentials'
2965
+ public:
2966
+ ENV_SHORT: 'review'
2967
+ APP_DIR: '.'
2968
+ ENV_TYPE: 'review'
2969
+ BUILD_INFO_ID: 'some-id'
2970
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2971
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
2972
+ ROOT_URL: 'https://app.mr1234.review.test-app.pan.panter.cloud'
2973
+ KUBE_NAMESPACE: 'pan-test-app-review'
2974
+ KUBE_APP_NAME: 'mr1234-app'
2975
+ KUBE_APP_NAME_PREFIX: 'mr1234-'
2976
+ HOST_CANONICAL: 'app.mr1234.review.test-app.pan.panter.cloud'
2977
+ RAILS_ENV: 'production'
2978
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
2979
+ application:
2980
+ host: 'app.mr1234.review.test-app.pan.panter.cloud'
2981
+ command: '/cnb/process/web'
2982
+ livenessProbe:
2983
+ httpGet:
2984
+ path: '__health'
2985
+ readinessProbe:
2986
+ httpGet:
2987
+ path: '__health'
2988
+ startupProbe:
2989
+ httpGet:
2990
+ path: '__health'
2991
+ worker:
2992
+ enabled: true
2993
+ command: 'launcher bundle exec rake jobs:work'
2994
+ cloudsql:
2995
+ enabled: true
2996
+ dbUser: 'postgres'
2997
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-review'
2998
+ proxyCredentials: '$CL_review_app_cloudsqlProxyCredentials'
2999
+ fullDbName: 'mr1234-app'
3000
+ projectId: 'some-project-id'
3001
+ jobs:
3002
+ db-migrate:
3003
+ hook: 'post-upgrade'
3004
+ command: 'launcher bundle exec rake db:migrate'
3005
+ db-prepare-seed:
3006
+ hook: 'post-install'
3007
+ command: 'launcher bundle exec rake db:prepare db:seed'
3008
+ ",
3009
+ "POSTGRESQL_PASSWORD": "$CL_review_app_POSTGRESQL_PASSWORD",
3010
+ "RAILS_ENV": "production",
3011
+ "RELEASE_NAME": "pan-test-app-review-mr1234-app",
3012
+ "ROOT_URL": "https://app.mr1234.review.test-app.pan.panter.cloud",
3013
+ "SECRET_KEY_BASE": "$CL_review_app_SECRET_KEY_BASE",
3014
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
3015
+ "cloudsqlProxyCredentials": "$CL_review_app_cloudsqlProxyCredentials",
3016
+ },
3017
+ },
3018
+ "app 🛑 Stop ⚠️ | review ": {
3019
+ "environment": {
3020
+ "action": "stop",
3021
+ "name": "review/some-commit/app",
3022
+ "url": "https://app.mr1234.review.test-app.pan.panter.cloud",
3023
+ },
3024
+ "image": "path/to/docker/kubernetes:the-version",
3025
+ "interruptible": true,
3026
+ "needs": [],
3027
+ "retry": {
3028
+ "max": 2,
3029
+ "when": [
3030
+ "runner_system_failure",
3031
+ "stuck_or_timeout_failure",
3032
+ ],
3033
+ },
3034
+ "rules": [
3035
+ {
3036
+ "allow_failure": true,
3037
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3038
+ "when": "on_success",
3039
+ },
3040
+ {
3041
+ "allow_failure": true,
3042
+ "when": "manual",
3043
+ },
3044
+ ],
3045
+ "script": [
3046
+ "kubectl config set-cluster "kube-pan-test-app-review-mr1234-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3047
+ "kubectl config set-credentials "kube-pan-test-app-review-mr1234-app" --token="$CL_review_app_KUBE_TOKEN"",
3048
+ "kubectl config set-context "kube-pan-test-app-review-mr1234-app" --cluster="kube-pan-test-app-review-mr1234-app" --user="kube-pan-test-app-review-mr1234-app" --namespace="pan-test-app-review"",
3049
+ "kubectl config use-context "kube-pan-test-app-review-mr1234-app"",
3050
+ "kubernetesDelete",
3051
+ "echo Disabling component in Dependency Track",
3052
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://app.mr1234.review.test-app.pan.panter.cloud" || true",
3053
+ ],
3054
+ "stage": "stop review",
3055
+ "variables": {
3056
+ "APP_DIR": ".",
3057
+ "BUILD_ID": "some-id",
3058
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
3059
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
3060
+ "BUILD_INFO_ID": "some-id",
3061
+ "COMPONENT_NAME": "app",
3062
+ "ENV_SHORT": "review",
3063
+ "ENV_TYPE": "review",
3064
+ "GIT_STRATEGY": "none",
3065
+ "HELM_ARGS": "",
3066
+ "HELM_EXPERIMENTAL_OCI": "1",
3067
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
3068
+ "HOST_CANONICAL": "app.mr1234.review.test-app.pan.panter.cloud",
3069
+ "KUBERNETES_CPU_LIMIT": "1",
3070
+ "KUBERNETES_CPU_REQUEST": "0.5",
3071
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3072
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3073
+ "KUBE_APP_NAME": "mr1234-app",
3074
+ "KUBE_APP_NAME_PREFIX": "mr1234-",
3075
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
3076
+ "KUBE_NAMESPACE": "pan-test-app-review",
3077
+ "KUBE_VALUES": "env:
3078
+ secret:
3079
+ SECRET_KEY_BASE: '$CL_review_app_SECRET_KEY_BASE'
3080
+ POSTGRESQL_PASSWORD: '$CL_review_app_POSTGRESQL_PASSWORD'
3081
+ cloudsqlProxyCredentials: '$CL_review_app_cloudsqlProxyCredentials'
3082
+ public:
3083
+ ENV_SHORT: 'review'
3084
+ APP_DIR: '.'
3085
+ ENV_TYPE: 'review'
3086
+ BUILD_INFO_ID: 'some-id'
3087
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
3088
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
3089
+ ROOT_URL: 'https://app.mr1234.review.test-app.pan.panter.cloud'
3090
+ KUBE_NAMESPACE: 'pan-test-app-review'
3091
+ KUBE_APP_NAME: 'mr1234-app'
3092
+ KUBE_APP_NAME_PREFIX: 'mr1234-'
3093
+ HOST_CANONICAL: 'app.mr1234.review.test-app.pan.panter.cloud'
3094
+ RAILS_ENV: 'production'
3095
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
3096
+ application:
3097
+ host: 'app.mr1234.review.test-app.pan.panter.cloud'
3098
+ command: '/cnb/process/web'
3099
+ livenessProbe:
3100
+ httpGet:
3101
+ path: '__health'
3102
+ readinessProbe:
3103
+ httpGet:
3104
+ path: '__health'
3105
+ startupProbe:
3106
+ httpGet:
3107
+ path: '__health'
3108
+ worker:
3109
+ enabled: true
3110
+ command: 'launcher bundle exec rake jobs:work'
3111
+ cloudsql:
3112
+ enabled: true
3113
+ dbUser: 'postgres'
3114
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-review'
3115
+ proxyCredentials: '$CL_review_app_cloudsqlProxyCredentials'
3116
+ fullDbName: 'mr1234-app'
3117
+ projectId: 'some-project-id'
3118
+ jobs:
3119
+ db-migrate:
3120
+ hook: 'post-upgrade'
3121
+ command: 'launcher bundle exec rake db:migrate'
3122
+ db-prepare-seed:
3123
+ hook: 'post-install'
3124
+ command: 'launcher bundle exec rake db:prepare db:seed'
3125
+ ",
3126
+ "POSTGRESQL_PASSWORD": "$CL_review_app_POSTGRESQL_PASSWORD",
3127
+ "RAILS_ENV": "production",
3128
+ "RELEASE_NAME": "pan-test-app-review-mr1234-app",
3129
+ "ROOT_URL": "https://app.mr1234.review.test-app.pan.panter.cloud",
3130
+ "SECRET_KEY_BASE": "$CL_review_app_SECRET_KEY_BASE",
3131
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
3132
+ "cloudsqlProxyCredentials": "$CL_review_app_cloudsqlProxyCredentials",
3133
+ },
3134
+ },
3135
+ "app 🛡 audit": {
3136
+ "allow_failure": true,
3137
+ "image": "ruby:3.2.1",
3138
+ "interruptible": true,
3139
+ "needs": [],
3140
+ "retry": {
3141
+ "max": 2,
3142
+ "when": [
3143
+ "runner_system_failure",
3144
+ "stuck_or_timeout_failure",
3145
+ ],
3146
+ },
3147
+ "script": [
3148
+ "cd .",
3149
+ "gem install bundler-audit",
3150
+ "bundle audit check",
3151
+ ],
3152
+ "stage": "test",
3153
+ "variables": {},
3154
+ },
3155
+ "app 🧪 test": {
3156
+ "cache": {
3157
+ "key": {
3158
+ "files": [
3159
+ "Gemfile.lock",
3160
+ ],
3161
+ "prefix": "$CI_JOB_IMAGE",
3162
+ },
3163
+ "paths": [
3164
+ "tmp/cache",
3165
+ ],
3166
+ },
3167
+ "image": "ruby:3.2.1",
3168
+ "interruptible": true,
3169
+ "needs": [],
3170
+ "retry": {
3171
+ "max": 2,
3172
+ "when": [
3173
+ "runner_system_failure",
3174
+ "stuck_or_timeout_failure",
3175
+ ],
3176
+ },
3177
+ "script": [
3178
+ "cd .",
3179
+ "bundle config set path 'tmp/cache'",
3180
+ "bundle install -j $(nproc)",
3181
+ "bundle exec rspec",
3182
+ ],
3183
+ "stage": "test",
3184
+ "variables": {},
3185
+ },
3186
+ "app 🧾 sbom | review ": {
3187
+ "allow_failure": true,
3188
+ "artifacts": {
3189
+ "paths": [
3190
+ "__sbom.json",
3191
+ ],
3192
+ },
3193
+ "image": "aquasec/trivy:0.38.3",
3194
+ "interruptible": true,
3195
+ "needs": [],
3196
+ "retry": {
3197
+ "max": 2,
3198
+ "when": [
3199
+ "runner_system_failure",
3200
+ "stuck_or_timeout_failure",
3201
+ ],
3202
+ },
3203
+ "script": [
3204
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" .",
3205
+ ],
3206
+ "stage": "build",
3207
+ "variables": {},
3208
+ },
3209
+ },
3210
+ "stages": [
3211
+ "setup",
3212
+ "setup dev",
3213
+ "setup review",
3214
+ "setup stage",
3215
+ "setup prod",
3216
+ "setup local",
3217
+ "test",
3218
+ "test dev",
3219
+ "test review",
3220
+ "test stage",
3221
+ "test prod",
3222
+ "test local",
3223
+ "build",
3224
+ "build dev",
3225
+ "build review",
3226
+ "build stage",
3227
+ "build prod",
3228
+ "build local",
3229
+ "deploy",
3230
+ "deploy dev",
3231
+ "deploy review",
3232
+ "deploy stage",
3233
+ "deploy prod",
3234
+ "deploy local",
3235
+ "verify",
3236
+ "verify dev",
3237
+ "verify review",
3238
+ "verify stage",
3239
+ "verify prod",
3240
+ "verify local",
3241
+ "rollback",
3242
+ "rollback dev",
3243
+ "rollback review",
3244
+ "rollback stage",
3245
+ "rollback prod",
3246
+ "rollback local",
3247
+ "stop",
3248
+ "stop dev",
3249
+ "stop review",
3250
+ "stop stage",
3251
+ "stop prod",
3252
+ "stop local",
3253
+ ],
3254
+ "variables": {
3255
+ "FF_USE_FASTZIP": "true",
3256
+ },
3257
+ "workflow": {
3258
+ "rules": [
3259
+ {
3260
+ "if": "$CI_COMMIT_TAG",
3261
+ },
3262
+ {
3263
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
3264
+ "when": "never",
3265
+ },
3266
+ {
3267
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
3268
+ },
3269
+ {
3270
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
3271
+ },
3272
+ {
3273
+ "if": "$CI_MERGE_REQUEST_ID",
3274
+ },
3275
+ ],
3276
+ },
3277
+ },
3278
+ "taggedRelease": {
3279
+ "image": "path/to/docker/jobs-default:the-version",
3280
+ "jobs": {
3281
+ "app ↩️ Rollback ⚠️ | prod ": {
3282
+ "environment": {
3283
+ "action": "access",
3284
+ "name": "prod/app",
3285
+ "url": "https://my-fancy-website.com",
3286
+ },
3287
+ "image": "path/to/docker/kubernetes:the-version",
3288
+ "interruptible": true,
3289
+ "needs": [],
3290
+ "retry": {
3291
+ "max": 2,
3292
+ "when": [
3293
+ "runner_system_failure",
3294
+ "stuck_or_timeout_failure",
3295
+ ],
3296
+ },
3297
+ "rules": [
3298
+ {
3299
+ "allow_failure": true,
3300
+ "when": "manual",
3301
+ },
3302
+ ],
3303
+ "script": [
3304
+ "kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3305
+ "kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"",
3306
+ "kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"",
3307
+ "kubectl config use-context "kube-pan-test-app-prod-app"",
3308
+ "kubernetesRollback",
3309
+ ],
3310
+ "stage": "rollback prod",
3311
+ "variables": {
3312
+ "APP_DIR": ".",
3313
+ "BUILD_ID": "some-id",
3314
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
3315
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
3316
+ "BUILD_INFO_ID": "some-id",
3317
+ "COMPONENT_NAME": "app",
3318
+ "ENV_SHORT": "prod",
3319
+ "ENV_TYPE": "prod",
3320
+ "GIT_STRATEGY": "none",
3321
+ "HELM_ARGS": "",
3322
+ "HELM_EXPERIMENTAL_OCI": "1",
3323
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
3324
+ "HOST_CANONICAL": "app.prod.test-app.pan.panter.cloud",
3325
+ "KUBERNETES_CPU_LIMIT": "1",
3326
+ "KUBERNETES_CPU_REQUEST": "0.5",
3327
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3328
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3329
+ "KUBE_APP_NAME": "app",
3330
+ "KUBE_APP_NAME_PREFIX": "",
3331
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
3332
+ "KUBE_NAMESPACE": "pan-test-app-prod",
3333
+ "KUBE_VALUES": "env:
3334
+ secret:
3335
+ SECRET_KEY_BASE: '$CL_prod_app_SECRET_KEY_BASE'
3336
+ POSTGRESQL_PASSWORD: '$CL_prod_app_POSTGRESQL_PASSWORD'
3337
+ cloudsqlProxyCredentials: '$CL_prod_app_cloudsqlProxyCredentials'
3338
+ public:
3339
+ ENV_SHORT: 'prod'
3340
+ APP_DIR: '.'
3341
+ ENV_TYPE: 'prod'
3342
+ BUILD_INFO_ID: 'some-id'
3343
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
3344
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
3345
+ ROOT_URL: 'https://my-fancy-website.com'
3346
+ KUBE_NAMESPACE: 'pan-test-app-prod'
3347
+ KUBE_APP_NAME: 'app'
3348
+ KUBE_APP_NAME_PREFIX: ''
3349
+ HOST_CANONICAL: 'app.prod.test-app.pan.panter.cloud'
3350
+ RAILS_ENV: 'production'
3351
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
3352
+ application:
3353
+ host: 'my-fancy-website.com'
3354
+ command: '/cnb/process/web'
3355
+ livenessProbe:
3356
+ httpGet:
3357
+ path: '__health'
3358
+ readinessProbe:
3359
+ httpGet:
3360
+ path: '__health'
3361
+ startupProbe:
3362
+ httpGet:
3363
+ path: '__health'
3364
+ worker:
3365
+ enabled: true
3366
+ command: 'launcher bundle exec rake jobs:work'
3367
+ cloudsql:
3368
+ enabled: true
3369
+ dbUser: 'postgres'
3370
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-prod'
3371
+ proxyCredentials: '$CL_prod_app_cloudsqlProxyCredentials'
3372
+ fullDbName: 'app'
3373
+ projectId: 'some-project-id'
3374
+ jobs:
3375
+ db-migrate:
3376
+ hook: 'post-install,post-upgrade'
3377
+ command: 'launcher bundle exec rake db:migrate'
3378
+ ",
3379
+ "POSTGRESQL_PASSWORD": "$CL_prod_app_POSTGRESQL_PASSWORD",
3380
+ "RAILS_ENV": "production",
3381
+ "RELEASE_NAME": "pan-test-app-prod-app",
3382
+ "ROOT_URL": "https://my-fancy-website.com",
3383
+ "SECRET_KEY_BASE": "$CL_prod_app_SECRET_KEY_BASE",
3384
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
3385
+ "cloudsqlProxyCredentials": "$CL_prod_app_cloudsqlProxyCredentials",
3386
+ },
3387
+ },
3388
+ "app ↩️ Rollback ⚠️ | stage ": {
3389
+ "environment": {
3390
+ "action": "access",
3391
+ "name": "stage/app",
3392
+ "url": "https://app.stage.test-app.pan.panter.cloud",
3393
+ },
3394
+ "image": "path/to/docker/kubernetes:the-version",
3395
+ "interruptible": true,
3396
+ "needs": [],
3397
+ "retry": {
3398
+ "max": 2,
3399
+ "when": [
3400
+ "runner_system_failure",
3401
+ "stuck_or_timeout_failure",
3402
+ ],
3403
+ },
3404
+ "rules": [
3405
+ {
3406
+ "allow_failure": true,
3407
+ "when": "manual",
3408
+ },
3409
+ ],
3410
+ "script": [
3411
+ "kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3412
+ "kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"",
3413
+ "kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"",
3414
+ "kubectl config use-context "kube-pan-test-app-stage-app"",
3415
+ "kubernetesRollback",
3416
+ ],
3417
+ "stage": "rollback stage",
3418
+ "variables": {
3419
+ "APP_DIR": ".",
3420
+ "BUILD_ID": "some-id",
3421
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
3422
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
3423
+ "BUILD_INFO_ID": "some-id",
3424
+ "COMPONENT_NAME": "app",
3425
+ "ENV_SHORT": "stage",
3426
+ "ENV_TYPE": "stage",
3427
+ "GIT_STRATEGY": "none",
3428
+ "HELM_ARGS": "",
3429
+ "HELM_EXPERIMENTAL_OCI": "1",
3430
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
3431
+ "HOST_CANONICAL": "app.stage.test-app.pan.panter.cloud",
3432
+ "KUBERNETES_CPU_LIMIT": "1",
3433
+ "KUBERNETES_CPU_REQUEST": "0.5",
3434
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3435
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3436
+ "KUBE_APP_NAME": "app",
3437
+ "KUBE_APP_NAME_PREFIX": "",
3438
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
3439
+ "KUBE_NAMESPACE": "pan-test-app-stage",
3440
+ "KUBE_VALUES": "env:
3441
+ secret:
3442
+ SECRET_KEY_BASE: '$CL_stage_app_SECRET_KEY_BASE'
3443
+ POSTGRESQL_PASSWORD: '$CL_stage_app_POSTGRESQL_PASSWORD'
3444
+ cloudsqlProxyCredentials: '$CL_stage_app_cloudsqlProxyCredentials'
3445
+ public:
3446
+ ENV_SHORT: 'stage'
3447
+ APP_DIR: '.'
3448
+ ENV_TYPE: 'stage'
3449
+ BUILD_INFO_ID: 'some-id'
3450
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
3451
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
3452
+ ROOT_URL: 'https://app.stage.test-app.pan.panter.cloud'
3453
+ KUBE_NAMESPACE: 'pan-test-app-stage'
3454
+ KUBE_APP_NAME: 'app'
3455
+ KUBE_APP_NAME_PREFIX: ''
3456
+ HOST_CANONICAL: 'app.stage.test-app.pan.panter.cloud'
3457
+ RAILS_ENV: 'production'
3458
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
3459
+ application:
3460
+ host: 'app.stage.test-app.pan.panter.cloud'
3461
+ command: '/cnb/process/web'
3462
+ livenessProbe:
3463
+ httpGet:
3464
+ path: '__health'
3465
+ readinessProbe:
3466
+ httpGet:
3467
+ path: '__health'
3468
+ startupProbe:
3469
+ httpGet:
3470
+ path: '__health'
3471
+ worker:
3472
+ enabled: true
3473
+ command: 'launcher bundle exec rake jobs:work'
3474
+ cloudsql:
3475
+ enabled: true
3476
+ dbUser: 'postgres'
3477
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-stage'
3478
+ proxyCredentials: '$CL_stage_app_cloudsqlProxyCredentials'
3479
+ fullDbName: 'app'
3480
+ projectId: 'some-project-id'
3481
+ jobs:
3482
+ db-migrate:
3483
+ hook: 'post-install,post-upgrade'
3484
+ command: 'launcher bundle exec rake db:migrate'
3485
+ ",
3486
+ "POSTGRESQL_PASSWORD": "$CL_stage_app_POSTGRESQL_PASSWORD",
3487
+ "RAILS_ENV": "production",
3488
+ "RELEASE_NAME": "pan-test-app-stage-app",
3489
+ "ROOT_URL": "https://app.stage.test-app.pan.panter.cloud",
3490
+ "SECRET_KEY_BASE": "$CL_stage_app_SECRET_KEY_BASE",
3491
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
3492
+ "cloudsqlProxyCredentials": "$CL_stage_app_cloudsqlProxyCredentials",
3493
+ },
3494
+ },
3495
+ "app 🔨 docker | prod ": {
3496
+ "image": "path/to/docker/docker-build:the-version",
3497
+ "interruptible": true,
3498
+ "needs": [],
3499
+ "retry": {
3500
+ "max": 2,
3501
+ "when": [
3502
+ "runner_system_failure",
3503
+ "stuck_or_timeout_failure",
3504
+ ],
3505
+ },
3506
+ "script": [
3507
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
3508
+ "docker version",
3509
+ "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",
3510
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
3511
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
3512
+ "docker push $DOCKER_CACHE_IMAGE",
3513
+ ],
3514
+ "services": [
3515
+ {
3516
+ "command": [
3517
+ "--tls=false",
3518
+ ],
3519
+ "name": "docker:20-dind",
3520
+ },
3521
+ ],
3522
+ "stage": "build",
3523
+ "variables": {
3524
+ "APP_DIR": ".",
3525
+ "DOCKERFILE_ADDITIONS": undefined,
3526
+ "DOCKERFILE_ADDITIONS_END": undefined,
3527
+ "DOCKER_BUILDKIT": "1",
3528
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
3529
+ "DOCKER_DIR": ".",
3530
+ "DOCKER_DRIVER": "overlay2",
3531
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
3532
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
3533
+ "DOCKER_IMAGE_NAME": "prod/app",
3534
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
3535
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
3536
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
3537
+ "DOCKER_TLS_CERTDIR": "",
3538
+ "KUBERNETES_CPU_LIMIT": "1",
3539
+ "KUBERNETES_CPU_REQUEST": "0.5",
3540
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
3541
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3542
+ },
3543
+ },
3544
+ "app 🔨 docker | stage ": {
3545
+ "image": "path/to/docker/docker-build:the-version",
3546
+ "interruptible": true,
3547
+ "needs": [],
3548
+ "retry": {
3549
+ "max": 2,
3550
+ "when": [
3551
+ "runner_system_failure",
3552
+ "stuck_or_timeout_failure",
3553
+ ],
3554
+ },
3555
+ "script": [
3556
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
3557
+ "docker version",
3558
+ "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",
3559
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
3560
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
3561
+ "docker push $DOCKER_CACHE_IMAGE",
3562
+ ],
3563
+ "services": [
3564
+ {
3565
+ "command": [
3566
+ "--tls=false",
3567
+ ],
3568
+ "name": "docker:20-dind",
3569
+ },
3570
+ ],
3571
+ "stage": "build",
3572
+ "variables": {
3573
+ "APP_DIR": ".",
3574
+ "DOCKERFILE_ADDITIONS": undefined,
3575
+ "DOCKERFILE_ADDITIONS_END": undefined,
3576
+ "DOCKER_BUILDKIT": "1",
3577
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
3578
+ "DOCKER_DIR": ".",
3579
+ "DOCKER_DRIVER": "overlay2",
3580
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
3581
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
3582
+ "DOCKER_IMAGE_NAME": "stage/app",
3583
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
3584
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
3585
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
3586
+ "DOCKER_TLS_CERTDIR": "",
3587
+ "KUBERNETES_CPU_LIMIT": "1",
3588
+ "KUBERNETES_CPU_REQUEST": "0.5",
3589
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
3590
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3591
+ },
3592
+ },
3593
+ "app 🚀 Deploy | prod ": {
3594
+ "allow_failure": true,
3595
+ "environment": {
3596
+ "auto_stop_in": undefined,
3597
+ "name": "prod/app",
3598
+ "on_stop": "app 🛑 Stop ⚠️ | prod ",
3599
+ "url": "https://my-fancy-website.com",
3600
+ },
3601
+ "image": "path/to/docker/kubernetes:the-version",
3602
+ "interruptible": true,
3603
+ "needs": [
3604
+ {
3605
+ "artifacts": false,
3606
+ "job": "app 🔨 docker | prod ",
3607
+ },
3608
+ {
3609
+ "artifacts": true,
3610
+ "job": "app 🧾 sbom | prod ",
3611
+ },
3612
+ ],
3613
+ "retry": {
3614
+ "max": 2,
3615
+ "when": [
3616
+ "runner_system_failure",
3617
+ "stuck_or_timeout_failure",
3618
+ ],
3619
+ },
3620
+ "rules": [
3621
+ {
3622
+ "when": "manual",
3623
+ },
3624
+ ],
3625
+ "script": [
3626
+ "kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3627
+ "kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"",
3628
+ "kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"",
3629
+ "kubectl config use-context "kube-pan-test-app-prod-app"",
3630
+ "kubernetesCreateSecret",
3631
+ "kubernetesDeploy",
3632
+ "echo Uploading SBOM to Dependency Track",
3633
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://my-fancy-website.com" "__sbom.json" vex.json || true",
3634
+ "echo deployment successful 😻",
3635
+ ],
3636
+ "stage": "deploy prod",
3637
+ "variables": {
3638
+ "APP_DIR": ".",
3639
+ "BUILD_ID": "some-id",
3640
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
3641
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
3642
+ "BUILD_INFO_ID": "some-id",
3643
+ "COMPONENT_NAME": "app",
3644
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
3645
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
3646
+ "DOCKER_IMAGE_NAME": "prod/app",
3647
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
3648
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
3649
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
3650
+ "ENV_SHORT": "prod",
3651
+ "ENV_TYPE": "prod",
3652
+ "HELM_ARGS": "",
3653
+ "HELM_EXPERIMENTAL_OCI": "1",
3654
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
3655
+ "HOST_CANONICAL": "app.prod.test-app.pan.panter.cloud",
3656
+ "KUBERNETES_CPU_LIMIT": "1",
3657
+ "KUBERNETES_CPU_REQUEST": "0.5",
3658
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3659
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3660
+ "KUBE_APP_NAME": "app",
3661
+ "KUBE_APP_NAME_PREFIX": "",
3662
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
3663
+ "KUBE_NAMESPACE": "pan-test-app-prod",
3664
+ "KUBE_VALUES": "env:
3665
+ secret:
3666
+ SECRET_KEY_BASE: '$CL_prod_app_SECRET_KEY_BASE'
3667
+ POSTGRESQL_PASSWORD: '$CL_prod_app_POSTGRESQL_PASSWORD'
3668
+ cloudsqlProxyCredentials: '$CL_prod_app_cloudsqlProxyCredentials'
3669
+ public:
3670
+ ENV_SHORT: 'prod'
3671
+ APP_DIR: '.'
3672
+ ENV_TYPE: 'prod'
3673
+ BUILD_INFO_ID: 'some-id'
3674
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
3675
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
3676
+ ROOT_URL: 'https://my-fancy-website.com'
3677
+ KUBE_NAMESPACE: 'pan-test-app-prod'
3678
+ KUBE_APP_NAME: 'app'
3679
+ KUBE_APP_NAME_PREFIX: ''
3680
+ HOST_CANONICAL: 'app.prod.test-app.pan.panter.cloud'
3681
+ RAILS_ENV: 'production'
3682
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
3683
+ application:
3684
+ host: 'my-fancy-website.com'
3685
+ command: '/cnb/process/web'
3686
+ livenessProbe:
3687
+ httpGet:
3688
+ path: '__health'
3689
+ readinessProbe:
3690
+ httpGet:
3691
+ path: '__health'
3692
+ startupProbe:
3693
+ httpGet:
3694
+ path: '__health'
3695
+ worker:
3696
+ enabled: true
3697
+ command: 'launcher bundle exec rake jobs:work'
3698
+ cloudsql:
3699
+ enabled: true
3700
+ dbUser: 'postgres'
3701
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-prod'
3702
+ proxyCredentials: '$CL_prod_app_cloudsqlProxyCredentials'
3703
+ fullDbName: 'app'
3704
+ projectId: 'some-project-id'
3705
+ jobs:
3706
+ db-migrate:
3707
+ hook: 'post-install,post-upgrade'
3708
+ command: 'launcher bundle exec rake db:migrate'
3709
+ ",
3710
+ "POSTGRESQL_PASSWORD": "$CL_prod_app_POSTGRESQL_PASSWORD",
3711
+ "RAILS_ENV": "production",
3712
+ "RELEASE_NAME": "pan-test-app-prod-app",
3713
+ "ROOT_URL": "https://my-fancy-website.com",
3714
+ "SECRET_KEY_BASE": "$CL_prod_app_SECRET_KEY_BASE",
3715
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
3716
+ "cloudsqlProxyCredentials": "$CL_prod_app_cloudsqlProxyCredentials",
3717
+ },
3718
+ },
3719
+ "app 🚀 Deploy | stage ": {
3720
+ "allow_failure": false,
3721
+ "environment": {
3722
+ "auto_stop_in": undefined,
3723
+ "name": "stage/app",
3724
+ "on_stop": "app 🛑 Stop ⚠️ | stage ",
3725
+ "url": "https://app.stage.test-app.pan.panter.cloud",
3726
+ },
3727
+ "image": "path/to/docker/kubernetes:the-version",
3728
+ "interruptible": true,
3729
+ "needs": [
3730
+ {
3731
+ "artifacts": false,
3732
+ "job": "app 🔨 docker | stage ",
3733
+ },
3734
+ {
3735
+ "artifacts": true,
3736
+ "job": "app 🧾 sbom | stage ",
3737
+ },
3738
+ ],
3739
+ "retry": {
3740
+ "max": 2,
3741
+ "when": [
3742
+ "runner_system_failure",
3743
+ "stuck_or_timeout_failure",
3744
+ ],
3745
+ },
3746
+ "rules": [
3747
+ {
3748
+ "when": "on_success",
3749
+ },
3750
+ ],
3751
+ "script": [
3752
+ "kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3753
+ "kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"",
3754
+ "kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"",
3755
+ "kubectl config use-context "kube-pan-test-app-stage-app"",
3756
+ "kubernetesCreateSecret",
3757
+ "kubernetesDeploy",
3758
+ "echo Uploading SBOM to Dependency Track",
3759
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://app.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
3760
+ "echo deployment successful 😻",
3761
+ ],
3762
+ "stage": "deploy stage",
3763
+ "variables": {
3764
+ "APP_DIR": ".",
3765
+ "BUILD_ID": "some-id",
3766
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
3767
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
3768
+ "BUILD_INFO_ID": "some-id",
3769
+ "COMPONENT_NAME": "app",
3770
+ "DOCKER_CACHE_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/caches/app",
3771
+ "DOCKER_IMAGE": "$DOCKER_REGISTRY_IMAGE_PATH/$DOCKER_IMAGE_NAME",
3772
+ "DOCKER_IMAGE_NAME": "stage/app",
3773
+ "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
3774
+ "DOCKER_REGISTRY": "$CI_REGISTRY",
3775
+ "DOCKER_REGISTRY_IMAGE_PATH": "$CI_REGISTRY_IMAGE",
3776
+ "ENV_SHORT": "stage",
3777
+ "ENV_TYPE": "stage",
3778
+ "HELM_ARGS": "",
3779
+ "HELM_EXPERIMENTAL_OCI": "1",
3780
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
3781
+ "HOST_CANONICAL": "app.stage.test-app.pan.panter.cloud",
3782
+ "KUBERNETES_CPU_LIMIT": "1",
3783
+ "KUBERNETES_CPU_REQUEST": "0.5",
3784
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3785
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3786
+ "KUBE_APP_NAME": "app",
3787
+ "KUBE_APP_NAME_PREFIX": "",
3788
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
3789
+ "KUBE_NAMESPACE": "pan-test-app-stage",
3790
+ "KUBE_VALUES": "env:
3791
+ secret:
3792
+ SECRET_KEY_BASE: '$CL_stage_app_SECRET_KEY_BASE'
3793
+ POSTGRESQL_PASSWORD: '$CL_stage_app_POSTGRESQL_PASSWORD'
3794
+ cloudsqlProxyCredentials: '$CL_stage_app_cloudsqlProxyCredentials'
3795
+ public:
3796
+ ENV_SHORT: 'stage'
3797
+ APP_DIR: '.'
3798
+ ENV_TYPE: 'stage'
3799
+ BUILD_INFO_ID: 'some-id'
3800
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
3801
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
3802
+ ROOT_URL: 'https://app.stage.test-app.pan.panter.cloud'
3803
+ KUBE_NAMESPACE: 'pan-test-app-stage'
3804
+ KUBE_APP_NAME: 'app'
3805
+ KUBE_APP_NAME_PREFIX: ''
3806
+ HOST_CANONICAL: 'app.stage.test-app.pan.panter.cloud'
3807
+ RAILS_ENV: 'production'
3808
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
3809
+ application:
3810
+ host: 'app.stage.test-app.pan.panter.cloud'
3811
+ command: '/cnb/process/web'
3812
+ livenessProbe:
3813
+ httpGet:
3814
+ path: '__health'
3815
+ readinessProbe:
3816
+ httpGet:
3817
+ path: '__health'
3818
+ startupProbe:
3819
+ httpGet:
3820
+ path: '__health'
3821
+ worker:
3822
+ enabled: true
3823
+ command: 'launcher bundle exec rake jobs:work'
3824
+ cloudsql:
3825
+ enabled: true
3826
+ dbUser: 'postgres'
3827
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-stage'
3828
+ proxyCredentials: '$CL_stage_app_cloudsqlProxyCredentials'
3829
+ fullDbName: 'app'
3830
+ projectId: 'some-project-id'
3831
+ jobs:
3832
+ db-migrate:
3833
+ hook: 'post-install,post-upgrade'
3834
+ command: 'launcher bundle exec rake db:migrate'
3835
+ ",
3836
+ "POSTGRESQL_PASSWORD": "$CL_stage_app_POSTGRESQL_PASSWORD",
3837
+ "RAILS_ENV": "production",
3838
+ "RELEASE_NAME": "pan-test-app-stage-app",
3839
+ "ROOT_URL": "https://app.stage.test-app.pan.panter.cloud",
3840
+ "SECRET_KEY_BASE": "$CL_stage_app_SECRET_KEY_BASE",
3841
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
3842
+ "cloudsqlProxyCredentials": "$CL_stage_app_cloudsqlProxyCredentials",
3843
+ },
3844
+ },
3845
+ "app 🛑 Stop ⚠️ | prod ": {
3846
+ "environment": {
3847
+ "action": "stop",
3848
+ "name": "prod/app",
3849
+ "url": "https://my-fancy-website.com",
3850
+ },
3851
+ "image": "path/to/docker/kubernetes:the-version",
3852
+ "interruptible": true,
3853
+ "needs": [],
3854
+ "retry": {
3855
+ "max": 2,
3856
+ "when": [
3857
+ "runner_system_failure",
3858
+ "stuck_or_timeout_failure",
3859
+ ],
3860
+ },
3861
+ "rules": [
3862
+ {
3863
+ "allow_failure": true,
3864
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3865
+ "when": "on_success",
3866
+ },
3867
+ {
3868
+ "allow_failure": true,
3869
+ "when": "manual",
3870
+ },
3871
+ ],
3872
+ "script": [
3873
+ "kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3874
+ "kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"",
3875
+ "kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"",
3876
+ "kubectl config use-context "kube-pan-test-app-prod-app"",
3877
+ "kubernetesDelete",
3878
+ "echo Disabling component in Dependency Track",
3879
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://my-fancy-website.com" || true",
3880
+ ],
3881
+ "stage": "stop prod",
3882
+ "variables": {
3883
+ "APP_DIR": ".",
3884
+ "BUILD_ID": "some-id",
3885
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
3886
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
3887
+ "BUILD_INFO_ID": "some-id",
3888
+ "COMPONENT_NAME": "app",
3889
+ "ENV_SHORT": "prod",
3890
+ "ENV_TYPE": "prod",
3891
+ "GIT_STRATEGY": "none",
3892
+ "HELM_ARGS": "",
3893
+ "HELM_EXPERIMENTAL_OCI": "1",
3894
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
3895
+ "HOST_CANONICAL": "app.prod.test-app.pan.panter.cloud",
3896
+ "KUBERNETES_CPU_LIMIT": "1",
3897
+ "KUBERNETES_CPU_REQUEST": "0.5",
3898
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3899
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3900
+ "KUBE_APP_NAME": "app",
3901
+ "KUBE_APP_NAME_PREFIX": "",
3902
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
3903
+ "KUBE_NAMESPACE": "pan-test-app-prod",
3904
+ "KUBE_VALUES": "env:
3905
+ secret:
3906
+ SECRET_KEY_BASE: '$CL_prod_app_SECRET_KEY_BASE'
3907
+ POSTGRESQL_PASSWORD: '$CL_prod_app_POSTGRESQL_PASSWORD'
3908
+ cloudsqlProxyCredentials: '$CL_prod_app_cloudsqlProxyCredentials'
3909
+ public:
3910
+ ENV_SHORT: 'prod'
3911
+ APP_DIR: '.'
3912
+ ENV_TYPE: 'prod'
3913
+ BUILD_INFO_ID: 'some-id'
3914
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
3915
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
3916
+ ROOT_URL: 'https://my-fancy-website.com'
3917
+ KUBE_NAMESPACE: 'pan-test-app-prod'
3918
+ KUBE_APP_NAME: 'app'
3919
+ KUBE_APP_NAME_PREFIX: ''
3920
+ HOST_CANONICAL: 'app.prod.test-app.pan.panter.cloud'
3921
+ RAILS_ENV: 'production'
3922
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
3923
+ application:
3924
+ host: 'my-fancy-website.com'
3925
+ command: '/cnb/process/web'
3926
+ livenessProbe:
3927
+ httpGet:
3928
+ path: '__health'
3929
+ readinessProbe:
3930
+ httpGet:
3931
+ path: '__health'
3932
+ startupProbe:
3933
+ httpGet:
3934
+ path: '__health'
3935
+ worker:
3936
+ enabled: true
3937
+ command: 'launcher bundle exec rake jobs:work'
3938
+ cloudsql:
3939
+ enabled: true
3940
+ dbUser: 'postgres'
3941
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-prod'
3942
+ proxyCredentials: '$CL_prod_app_cloudsqlProxyCredentials'
3943
+ fullDbName: 'app'
3944
+ projectId: 'some-project-id'
3945
+ jobs:
3946
+ db-migrate:
3947
+ hook: 'post-install,post-upgrade'
3948
+ command: 'launcher bundle exec rake db:migrate'
3949
+ ",
3950
+ "POSTGRESQL_PASSWORD": "$CL_prod_app_POSTGRESQL_PASSWORD",
3951
+ "RAILS_ENV": "production",
3952
+ "RELEASE_NAME": "pan-test-app-prod-app",
3953
+ "ROOT_URL": "https://my-fancy-website.com",
3954
+ "SECRET_KEY_BASE": "$CL_prod_app_SECRET_KEY_BASE",
3955
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
3956
+ "cloudsqlProxyCredentials": "$CL_prod_app_cloudsqlProxyCredentials",
3957
+ },
3958
+ },
3959
+ "app 🛑 Stop ⚠️ | stage ": {
3960
+ "environment": {
3961
+ "action": "stop",
3962
+ "name": "stage/app",
3963
+ "url": "https://app.stage.test-app.pan.panter.cloud",
3964
+ },
3965
+ "image": "path/to/docker/kubernetes:the-version",
3966
+ "interruptible": true,
3967
+ "needs": [],
3968
+ "retry": {
3969
+ "max": 2,
3970
+ "when": [
3971
+ "runner_system_failure",
3972
+ "stuck_or_timeout_failure",
3973
+ ],
3974
+ },
3975
+ "rules": [
3976
+ {
3977
+ "allow_failure": true,
3978
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3979
+ "when": "on_success",
3980
+ },
3981
+ {
3982
+ "allow_failure": true,
3983
+ "when": "manual",
3984
+ },
3985
+ ],
3986
+ "script": [
3987
+ "kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3988
+ "kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"",
3989
+ "kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"",
3990
+ "kubectl config use-context "kube-pan-test-app-stage-app"",
3991
+ "kubernetesDelete",
3992
+ "echo Disabling component in Dependency Track",
3993
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://app.stage.test-app.pan.panter.cloud" || true",
3994
+ ],
3995
+ "stage": "stop stage",
3996
+ "variables": {
3997
+ "APP_DIR": ".",
3998
+ "BUILD_ID": "some-id",
3999
+ "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
4000
+ "BUILD_INFO_CURRENT_VERSION": "3.2.1",
4001
+ "BUILD_INFO_ID": "some-id",
4002
+ "COMPONENT_NAME": "app",
4003
+ "ENV_SHORT": "stage",
4004
+ "ENV_TYPE": "stage",
4005
+ "GIT_STRATEGY": "none",
4006
+ "HELM_ARGS": "",
4007
+ "HELM_EXPERIMENTAL_OCI": "1",
4008
+ "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
4009
+ "HOST_CANONICAL": "app.stage.test-app.pan.panter.cloud",
4010
+ "KUBERNETES_CPU_LIMIT": "1",
4011
+ "KUBERNETES_CPU_REQUEST": "0.5",
4012
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
4013
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
4014
+ "KUBE_APP_NAME": "app",
4015
+ "KUBE_APP_NAME_PREFIX": "",
4016
+ "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-app",
4017
+ "KUBE_NAMESPACE": "pan-test-app-stage",
4018
+ "KUBE_VALUES": "env:
4019
+ secret:
4020
+ SECRET_KEY_BASE: '$CL_stage_app_SECRET_KEY_BASE'
4021
+ POSTGRESQL_PASSWORD: '$CL_stage_app_POSTGRESQL_PASSWORD'
4022
+ cloudsqlProxyCredentials: '$CL_stage_app_cloudsqlProxyCredentials'
4023
+ public:
4024
+ ENV_SHORT: 'stage'
4025
+ APP_DIR: '.'
4026
+ ENV_TYPE: 'stage'
4027
+ BUILD_INFO_ID: 'some-id'
4028
+ BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
4029
+ BUILD_INFO_CURRENT_VERSION: '3.2.1'
4030
+ ROOT_URL: 'https://app.stage.test-app.pan.panter.cloud'
4031
+ KUBE_NAMESPACE: 'pan-test-app-stage'
4032
+ KUBE_APP_NAME: 'app'
4033
+ KUBE_APP_NAME_PREFIX: ''
4034
+ HOST_CANONICAL: 'app.stage.test-app.pan.panter.cloud'
4035
+ RAILS_ENV: 'production'
4036
+ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]'
4037
+ application:
4038
+ host: 'app.stage.test-app.pan.panter.cloud'
4039
+ command: '/cnb/process/web'
4040
+ livenessProbe:
4041
+ httpGet:
4042
+ path: '__health'
4043
+ readinessProbe:
4044
+ httpGet:
4045
+ path: '__health'
4046
+ startupProbe:
4047
+ httpGet:
4048
+ path: '__health'
4049
+ worker:
4050
+ enabled: true
4051
+ command: 'launcher bundle exec rake jobs:work'
4052
+ cloudsql:
4053
+ enabled: true
4054
+ dbUser: 'postgres'
4055
+ instanceConnectionName: 'some-project-id:europe-west6:pan-test-app-stage'
4056
+ proxyCredentials: '$CL_stage_app_cloudsqlProxyCredentials'
4057
+ fullDbName: 'app'
4058
+ projectId: 'some-project-id'
4059
+ jobs:
4060
+ db-migrate:
4061
+ hook: 'post-install,post-upgrade'
4062
+ command: 'launcher bundle exec rake db:migrate'
4063
+ ",
4064
+ "POSTGRESQL_PASSWORD": "$CL_stage_app_POSTGRESQL_PASSWORD",
4065
+ "RAILS_ENV": "production",
4066
+ "RELEASE_NAME": "pan-test-app-stage-app",
4067
+ "ROOT_URL": "https://app.stage.test-app.pan.panter.cloud",
4068
+ "SECRET_KEY_BASE": "$CL_stage_app_SECRET_KEY_BASE",
4069
+ "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","ROOT_URL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_CANONICAL","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]",
4070
+ "cloudsqlProxyCredentials": "$CL_stage_app_cloudsqlProxyCredentials",
4071
+ },
4072
+ },
4073
+ "app 🧾 sbom | prod ": {
4074
+ "allow_failure": true,
4075
+ "artifacts": {
4076
+ "paths": [
4077
+ "__sbom.json",
4078
+ ],
4079
+ },
4080
+ "image": "aquasec/trivy:0.38.3",
4081
+ "interruptible": true,
4082
+ "needs": [],
4083
+ "retry": {
4084
+ "max": 2,
4085
+ "when": [
4086
+ "runner_system_failure",
4087
+ "stuck_or_timeout_failure",
4088
+ ],
4089
+ },
4090
+ "script": [
4091
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" .",
4092
+ ],
4093
+ "stage": "build",
4094
+ "variables": {},
4095
+ },
4096
+ "app 🧾 sbom | stage ": {
4097
+ "allow_failure": true,
4098
+ "artifacts": {
4099
+ "paths": [
4100
+ "__sbom.json",
4101
+ ],
4102
+ },
4103
+ "image": "aquasec/trivy:0.38.3",
4104
+ "interruptible": true,
4105
+ "needs": [],
4106
+ "retry": {
4107
+ "max": 2,
4108
+ "when": [
4109
+ "runner_system_failure",
4110
+ "stuck_or_timeout_failure",
4111
+ ],
4112
+ },
4113
+ "script": [
4114
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" .",
4115
+ ],
4116
+ "stage": "build",
4117
+ "variables": {},
4118
+ },
4119
+ },
4120
+ "stages": [
4121
+ "setup",
4122
+ "setup dev",
4123
+ "setup review",
4124
+ "setup stage",
4125
+ "setup prod",
4126
+ "setup local",
4127
+ "test",
4128
+ "test dev",
4129
+ "test review",
4130
+ "test stage",
4131
+ "test prod",
4132
+ "test local",
4133
+ "build",
4134
+ "build dev",
4135
+ "build review",
4136
+ "build stage",
4137
+ "build prod",
4138
+ "build local",
4139
+ "deploy",
4140
+ "deploy dev",
4141
+ "deploy review",
4142
+ "deploy stage",
4143
+ "deploy prod",
4144
+ "deploy local",
4145
+ "verify",
4146
+ "verify dev",
4147
+ "verify review",
4148
+ "verify stage",
4149
+ "verify prod",
4150
+ "verify local",
4151
+ "rollback",
4152
+ "rollback dev",
4153
+ "rollback review",
4154
+ "rollback stage",
4155
+ "rollback prod",
4156
+ "rollback local",
4157
+ "stop",
4158
+ "stop dev",
4159
+ "stop review",
4160
+ "stop stage",
4161
+ "stop prod",
4162
+ "stop local",
4163
+ ],
4164
+ "variables": {
4165
+ "FF_USE_FASTZIP": "true",
4166
+ },
4167
+ "workflow": {
4168
+ "rules": [
4169
+ {
4170
+ "if": "$CI_COMMIT_TAG",
4171
+ },
4172
+ {
4173
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
4174
+ "when": "never",
4175
+ },
4176
+ {
4177
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
4178
+ },
4179
+ {
4180
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
4181
+ },
4182
+ {
4183
+ "if": "$CI_MERGE_REQUEST_ID",
4184
+ },
4185
+ ],
4186
+ },
4187
+ },
4188
+ }
4189
+ `;