@catladder/pipeline 1.116.0 → 1.117.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 (31) hide show
  1. package/dist/bundles/catladder-gitlab/index.js +1 -1
  2. package/dist/constants.js +1 -1
  3. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +19 -0
  4. package/dist/deploy/cloudRun/artifactsRegistry.js +117 -0
  5. package/dist/deploy/cloudRun/cleanup.d.ts +2 -0
  6. package/dist/deploy/cloudRun/cleanup.js +51 -0
  7. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -0
  8. package/dist/deploy/cloudRun/cloudRunRevisions.js +61 -0
  9. package/dist/deploy/cloudRun/deployJob.js +13 -14
  10. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -0
  11. package/dist/deploy/cloudRun/utils/getServiceName.js +8 -0
  12. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.d.ts +9 -0
  13. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +16 -0
  14. package/dist/tsconfig.tsbuildinfo +1 -1
  15. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +26 -4
  16. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +26 -4
  17. package/examples/__snapshots__/cloud-run-non-public.ts.snap +26 -4
  18. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +52 -8
  19. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +52 -8
  20. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +26 -4
  21. package/examples/__snapshots__/custom-build-job.ts.snap +26 -4
  22. package/examples/__snapshots__/custom-sbom-java.ts.snap +26 -4
  23. package/examples/__snapshots__/native-app.ts.snap +26 -4
  24. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +26 -4
  25. package/package.json +1 -1
  26. package/src/deploy/cloudRun/artifactsRegistry.ts +119 -0
  27. package/src/deploy/cloudRun/cleanup.ts +30 -0
  28. package/src/deploy/cloudRun/cloudRunRevisions.ts +67 -0
  29. package/src/deploy/cloudRun/deployJob.ts +18 -25
  30. package/src/deploy/cloudRun/utils/getServiceName.ts +3 -0
  31. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +12 -0
@@ -166,7 +166,10 @@ exports[`matches snapshot 1`] = `
166
166
  "echo "$ENV_VARS" > ____envvars.yaml",
167
167
  "gcloud run deploy pan-test-app-dev-app --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app,app-name=test-app,env-type=dev,env-name=dev,build-type=custom --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
168
168
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
169
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app:$DOCKER_IMAGE_TAG",
169
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
170
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app --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=asdf --region=asia-east1 --quiet $revisionname ; done",
171
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app@$version --quiet --delete-tags; done",
172
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
170
173
  "echo Uploading SBOM to Dependency Track",
171
174
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://pan-test-app-dev-app-unknown-host.example.com" "__sbom.json" vex.json || true",
172
175
  ],
@@ -254,6 +257,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
254
257
  ",
255
258
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
256
259
  "gcloud run services delete pan-test-app-dev-app --project=asdf --region=asia-east1",
260
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app --quiet --delete-tags",
257
261
  "echo Disabling component in Dependency Track",
258
262
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://pan-test-app-dev-app-unknown-host.example.com" || true",
259
263
  "set -e",
@@ -525,7 +529,13 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
525
529
  "echo "$ENV_VARS" > ____envvars.yaml",
526
530
  "gcloud run deploy pan-test-app-review-mr1234-app --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/mr1234:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app,app-name=test-app,env-type=review,env-name=review,build-type=custom --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
527
531
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
528
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/mr1234:$DOCKER_IMAGE_TAG",
532
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
533
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-review-mr1234-app --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=asdf --region=asia-east1 --quiet $revisionname ; done",
534
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/mr1234 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/mr1234@$version --quiet --delete-tags; done",
535
+ "set +e",
536
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app --quiet --delete-tags",
537
+ "set -e",
538
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
529
539
  "echo Uploading SBOM to Dependency Track",
530
540
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://pan-test-app-review-mr1234-app-unknown-host.example.com" "__sbom.json" vex.json || true",
531
541
  ],
@@ -613,6 +623,10 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
613
623
  ",
614
624
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
615
625
  "gcloud run services delete pan-test-app-review-mr1234-app --project=asdf --region=asia-east1",
626
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/mr1234 --quiet --delete-tags",
627
+ "set +e",
628
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app --quiet --delete-tags",
629
+ "set -e",
616
630
  "echo Disabling component in Dependency Track",
617
631
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://pan-test-app-review-mr1234-app-unknown-host.example.com" || true",
618
632
  "set -e",
@@ -985,7 +999,10 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
985
999
  "echo "$ENV_VARS" > ____envvars.yaml",
986
1000
  "gcloud run deploy pan-test-app-prod-app --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app,app-name=test-app,env-type=prod,env-name=prod,build-type=custom --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
987
1001
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
988
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app:$DOCKER_IMAGE_TAG",
1002
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1003
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app --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=asdf --region=asia-east1 --quiet $revisionname ; done",
1004
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app@$version --quiet --delete-tags; done",
1005
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
989
1006
  "echo Uploading SBOM to Dependency Track",
990
1007
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://pan-test-app-prod-app-unknown-host.example.com" "__sbom.json" vex.json || true",
991
1008
  ],
@@ -1100,7 +1117,10 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
1100
1117
  "echo "$ENV_VARS" > ____envvars.yaml",
1101
1118
  "gcloud run deploy pan-test-app-stage-app --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app,app-name=test-app,env-type=stage,env-name=stage,build-type=custom --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
1102
1119
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1103
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app:$DOCKER_IMAGE_TAG",
1120
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1121
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app --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=asdf --region=asia-east1 --quiet $revisionname ; done",
1122
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app@$version --quiet --delete-tags; done",
1123
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1104
1124
  "echo Uploading SBOM to Dependency Track",
1105
1125
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://pan-test-app-stage-app-unknown-host.example.com" "__sbom.json" vex.json || true",
1106
1126
  ],
@@ -1188,6 +1208,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
1188
1208
  ",
1189
1209
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1190
1210
  "gcloud run services delete pan-test-app-prod-app --project=asdf --region=asia-east1",
1211
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app --quiet --delete-tags",
1191
1212
  "echo Disabling component in Dependency Track",
1192
1213
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://pan-test-app-prod-app-unknown-host.example.com" || true",
1193
1214
  "set -e",
@@ -1235,6 +1256,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
1235
1256
  ",
1236
1257
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1237
1258
  "gcloud run services delete pan-test-app-stage-app --project=asdf --region=asia-east1",
1259
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app --quiet --delete-tags",
1238
1260
  "echo Disabling component in Dependency Track",
1239
1261
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://pan-test-app-stage-app-unknown-host.example.com" || true",
1240
1262
  "set -e",
@@ -263,7 +263,10 @@ COPY --chown=node:node .yarn /app/.yarn",
263
263
  "echo "$ENV_VARS" > ____envvars.yaml",
264
264
  "gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
265
265
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
266
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG",
266
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
267
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-api --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=asdf --region=asia-east1 --quiet $revisionname ; done",
268
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done",
269
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
267
270
  "echo Uploading SBOM to Dependency Track",
268
271
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-dev-api-unknown-host.example.com" "__sbom.json" vex.json || true",
269
272
  ],
@@ -351,6 +354,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
351
354
  ",
352
355
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
353
356
  "gcloud run services delete pan-test-app-dev-api --project=asdf --region=asia-east1",
357
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags",
354
358
  "echo Disabling component in Dependency Track",
355
359
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-dev-api-unknown-host.example.com" || true",
356
360
  "set -e",
@@ -1125,7 +1129,13 @@ COPY --chown=node:node .yarn /app/.yarn",
1125
1129
  "echo "$ENV_VARS" > ____envvars.yaml",
1126
1130
  "gcloud run deploy pan-test-app-review-mr1234-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/mr1234:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
1127
1131
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1128
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/mr1234:$DOCKER_IMAGE_TAG",
1132
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1133
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-review-mr1234-api --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=asdf --region=asia-east1 --quiet $revisionname ; done",
1134
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/mr1234 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/mr1234@$version --quiet --delete-tags; done",
1135
+ "set +e",
1136
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
1137
+ "set -e",
1138
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1129
1139
  "echo Uploading SBOM to Dependency Track",
1130
1140
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-review-mr1234-api-unknown-host.example.com" "__sbom.json" vex.json || true",
1131
1141
  ],
@@ -1213,6 +1223,10 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
1213
1223
  ",
1214
1224
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1215
1225
  "gcloud run services delete pan-test-app-review-mr1234-api --project=asdf --region=asia-east1",
1226
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/mr1234 --quiet --delete-tags",
1227
+ "set +e",
1228
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
1229
+ "set -e",
1216
1230
  "echo Disabling component in Dependency Track",
1217
1231
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-review-mr1234-api-unknown-host.example.com" || true",
1218
1232
  "set -e",
@@ -2075,7 +2089,10 @@ COPY --chown=node:node .yarn /app/.yarn",
2075
2089
  "echo "$ENV_VARS" > ____envvars.yaml",
2076
2090
  "gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
2077
2091
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
2078
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG",
2092
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
2093
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-api --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=asdf --region=asia-east1 --quiet $revisionname ; done",
2094
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done",
2095
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
2079
2096
  "echo Uploading SBOM to Dependency Track",
2080
2097
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-prod-api-unknown-host.example.com" "__sbom.json" vex.json || true",
2081
2098
  ],
@@ -2190,7 +2207,10 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
2190
2207
  "echo "$ENV_VARS" > ____envvars.yaml",
2191
2208
  "gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
2192
2209
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
2193
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG",
2210
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
2211
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-api --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=asdf --region=asia-east1 --quiet $revisionname ; done",
2212
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done",
2213
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
2194
2214
  "echo Uploading SBOM to Dependency Track",
2195
2215
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://pan-test-app-stage-api-unknown-host.example.com" "__sbom.json" vex.json || true",
2196
2216
  ],
@@ -2278,6 +2298,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
2278
2298
  ",
2279
2299
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2280
2300
  "gcloud run services delete pan-test-app-prod-api --project=asdf --region=asia-east1",
2301
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags",
2281
2302
  "echo Disabling component in Dependency Track",
2282
2303
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-prod-api-unknown-host.example.com" || true",
2283
2304
  "set -e",
@@ -2325,6 +2346,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
2325
2346
  ",
2326
2347
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
2327
2348
  "gcloud run services delete pan-test-app-stage-api --project=asdf --region=asia-east1",
2349
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags",
2328
2350
  "echo Disabling component in Dependency Track",
2329
2351
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://pan-test-app-stage-api-unknown-host.example.com" || true",
2330
2352
  "set -e",
@@ -263,7 +263,10 @@ COPY --chown=node:node .yarn /app/.yarn",
263
263
  "echo "$ENV_VARS" > ____envvars.yaml",
264
264
  "gcloud run deploy pan-test-app-dev-www --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=dev,env-name=dev,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
265
265
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
266
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www:$DOCKER_IMAGE_TAG",
266
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
267
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-www --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=asdf --region=asia-east1 --quiet $revisionname ; done",
268
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www@$version --quiet --delete-tags; done",
269
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
267
270
  "echo Uploading SBOM to Dependency Track",
268
271
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://pan-test-app-dev-www-unknown-host.example.com" "__sbom.json" vex.json || true",
269
272
  ],
@@ -351,6 +354,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
351
354
  ",
352
355
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
353
356
  "gcloud run services delete pan-test-app-dev-www --project=asdf --region=asia-east1",
357
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags",
354
358
  "echo Disabling component in Dependency Track",
355
359
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://pan-test-app-dev-www-unknown-host.example.com" || true",
356
360
  "set -e",
@@ -786,7 +790,13 @@ COPY --chown=node:node .yarn /app/.yarn",
786
790
  "echo "$ENV_VARS" > ____envvars.yaml",
787
791
  "gcloud run deploy pan-test-app-review-mr1234-www --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/mr1234:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=review,env-name=review,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
788
792
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
789
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/mr1234:$DOCKER_IMAGE_TAG",
793
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
794
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-review-mr1234-www --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=asdf --region=asia-east1 --quiet $revisionname ; done",
795
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/mr1234 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/mr1234@$version --quiet --delete-tags; done",
796
+ "set +e",
797
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags",
798
+ "set -e",
799
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
790
800
  "echo Uploading SBOM to Dependency Track",
791
801
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://pan-test-app-review-mr1234-www-unknown-host.example.com" "__sbom.json" vex.json || true",
792
802
  ],
@@ -874,6 +884,10 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
874
884
  ",
875
885
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
876
886
  "gcloud run services delete pan-test-app-review-mr1234-www --project=asdf --region=asia-east1",
887
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/mr1234 --quiet --delete-tags",
888
+ "set +e",
889
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags",
890
+ "set -e",
877
891
  "echo Disabling component in Dependency Track",
878
892
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://pan-test-app-review-mr1234-www-unknown-host.example.com" || true",
879
893
  "set -e",
@@ -1397,7 +1411,10 @@ COPY --chown=node:node .yarn /app/.yarn",
1397
1411
  "echo "$ENV_VARS" > ____envvars.yaml",
1398
1412
  "gcloud run deploy pan-test-app-prod-www --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=prod,env-name=prod,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
1399
1413
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1400
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www:$DOCKER_IMAGE_TAG",
1414
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1415
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-www --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=asdf --region=asia-east1 --quiet $revisionname ; done",
1416
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www@$version --quiet --delete-tags; done",
1417
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1401
1418
  "echo Uploading SBOM to Dependency Track",
1402
1419
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://pan-test-app-prod-www-unknown-host.example.com" "__sbom.json" vex.json || true",
1403
1420
  ],
@@ -1512,7 +1529,10 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
1512
1529
  "echo "$ENV_VARS" > ____envvars.yaml",
1513
1530
  "gcloud run deploy pan-test-app-stage-www --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=stage,env-name=stage,build-type=node --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --cpu-boost",
1514
1531
  "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1515
- "docker image rm asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www:$DOCKER_IMAGE_TAG",
1532
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1533
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-www --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=asdf --region=asia-east1 --quiet $revisionname ; done",
1534
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www@$version --quiet --delete-tags; done",
1535
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1516
1536
  "echo Uploading SBOM to Dependency Track",
1517
1537
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://pan-test-app-stage-www-unknown-host.example.com" "__sbom.json" vex.json || true",
1518
1538
  ],
@@ -1600,6 +1620,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
1600
1620
  ",
1601
1621
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1602
1622
  "gcloud run services delete pan-test-app-prod-www --project=asdf --region=asia-east1",
1623
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags",
1603
1624
  "echo Disabling component in Dependency Track",
1604
1625
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://pan-test-app-prod-www-unknown-host.example.com" || true",
1605
1626
  "set -e",
@@ -1647,6 +1668,7 @@ _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INF
1647
1668
  ",
1648
1669
  "gcloud auth activate-service-account --key-file="./____keyfile.json"",
1649
1670
  "gcloud run services delete pan-test-app-stage-www --project=asdf --region=asia-east1",
1671
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags",
1650
1672
  "echo Disabling component in Dependency Track",
1651
1673
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://pan-test-app-stage-www-unknown-host.example.com" || true",
1652
1674
  "set -e",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@catladder/pipeline",
3
- "version": "1.116.0",
3
+ "version": "1.117.0",
4
4
  "scripts": {
5
5
  "build:tsc": "yarn tsc",
6
6
  "build": "yarn build:compile && yarn build:inline-variables && yarn build:bundle",
@@ -0,0 +1,119 @@
1
+ import { gitlabDockerLogin } from "../../build/docker";
2
+ import type { Context } from "../../types/context";
3
+ import { allowFailureInScripts } from "../../utils/gitlab";
4
+ import { isOfDeployType } from "../types";
5
+ import { removeFirstLinesFromCommandOutput } from "./utils/removeFirstLinesFromCommandOutput";
6
+
7
+ /**
8
+ *
9
+ * lecacyReviewImageName is only temporary. In old versions the images had no reviewslug in review apps, which makes cleanup harder. We delete all those images now, but need the path
10
+ */
11
+ export const getArtifactsRegistryImageName = (
12
+ context: Context,
13
+ lecacyReviewImageName = false
14
+ ) => {
15
+ const deployConfig = context.componentConfig.deploy;
16
+
17
+ if (!isOfDeployType(deployConfig, "google-cloudrun")) {
18
+ // should not happen
19
+ throw new Error("deploy config is wrong");
20
+ }
21
+
22
+ if (lecacyReviewImageName && context.environment.envType !== "review") {
23
+ throw new Error("lecacyReviewImageName is only allowed for review app");
24
+ }
25
+ const fullAppName = `${context.fullConfig.customerName}-${context.fullConfig.appName}`;
26
+
27
+ const dockerUrl = `${deployConfig.region}-docker.pkg.dev/${deployConfig.projectId}/catladder-deploy/${fullAppName}`;
28
+ const gcloudImagePath = [
29
+ dockerUrl,
30
+ context.environment.shortName,
31
+ context.componentName,
32
+
33
+ ...(context.environment.envType === "review" && !lecacyReviewImageName
34
+ ? [context.commitInfo?.reviewSlug]
35
+ : []),
36
+ ];
37
+ return gcloudImagePath.join("/");
38
+ };
39
+
40
+ export const getArtifactsRegistryImage = (context: Context) =>
41
+ `${getArtifactsRegistryImageName(context)}:$DOCKER_IMAGE_TAG`;
42
+
43
+ /**
44
+ * commands to pull the image from the default registry and pushes it to google artifact registry. We might build and push directly to google artifact registry in the future
45
+ */
46
+ export const getPushToArtifactsRegistryCommands = (context: Context) => {
47
+ const deployConfig = context.componentConfig.deploy;
48
+
49
+ if (!isOfDeployType(deployConfig, "google-cloudrun")) {
50
+ // should not happen
51
+ throw new Error("deploy config is wrong");
52
+ }
53
+
54
+ const fullImageName = getArtifactsRegistryImageName(context);
55
+
56
+ return [
57
+ gitlabDockerLogin,
58
+ `gcloud auth configure-docker ${deployConfig.region}-docker.pkg.dev`,
59
+ `docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG`,
60
+ `docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG ${fullImageName}:$DOCKER_IMAGE_TAG`,
61
+ `docker push ${fullImageName}:$DOCKER_IMAGE_TAG`,
62
+ ];
63
+ };
64
+
65
+ const getDeleteImageCommands = (fullImageName: string, keepNewest = 0) => {
66
+ if (keepNewest === 0) {
67
+ // no need to list tags, we delete the whole thing
68
+ return [
69
+ `gcloud artifacts docker images delete ${fullImageName} --quiet --delete-tags`,
70
+ ];
71
+ }
72
+ // delete unused tags
73
+ const listAllImagesCommand = `gcloud artifacts docker images list ${fullImageName} --sort-by=~CREATE_TIME --format="value(version)"`;
74
+
75
+ const listImagesToDeletecommand = removeFirstLinesFromCommandOutput(
76
+ listAllImagesCommand,
77
+ keepNewest
78
+ );
79
+ const deleteImageCommand = `gcloud artifacts docker images delete ${fullImageName}@$version --quiet --delete-tags`;
80
+
81
+ const deleteImagesCommand = `${listImagesToDeletecommand} | while read -r version; do ${deleteImageCommand}; done`;
82
+
83
+ return [deleteImagesCommand];
84
+ };
85
+
86
+ /**
87
+ * commands to delete unused images.
88
+ *
89
+ * @param context
90
+ * @param keep how many of the newest images to keep
91
+ * @returns
92
+ */
93
+ export const getDeleteUnusedImagesCommands = (context: Context, keep = 0) => {
94
+ const deployConfig = context.componentConfig.deploy;
95
+ if (deployConfig === false) {
96
+ return [];
97
+ }
98
+ if (!isOfDeployType(deployConfig, "google-cloudrun")) {
99
+ // should not happen
100
+ throw new Error("deploy config is wrong");
101
+ }
102
+
103
+ const fullImageName = getArtifactsRegistryImageName(context);
104
+
105
+ return [
106
+ ...getDeleteImageCommands(fullImageName, keep),
107
+ // because a recent version of catladder had no review-slug in the image name, we have to delete those as well
108
+ // we can later remove this line in some months
109
+
110
+ ...(context.environment.envType === "review"
111
+ ? allowFailureInScripts(
112
+ getDeleteImageCommands(
113
+ getArtifactsRegistryImageName(context, true),
114
+ 0
115
+ )
116
+ )
117
+ : []),
118
+ ];
119
+ };
@@ -0,0 +1,30 @@
1
+ import type { Context } from "../../types/context";
2
+ import { getDeleteUnusedImagesCommands } from "./artifactsRegistry";
3
+ import { getDeleteUnusedRevisionsCommands } from "./cloudRunRevisions";
4
+
5
+ export const getRemoveOldRevisionsAndImagesCommand = (
6
+ context: Context,
7
+ when: "postDeploy" | "onStop"
8
+ ) => {
9
+ if (when === "onStop") {
10
+ // service is already deleted, so we don't need to delete old revisions, just delete all images
11
+ return getDeleteUnusedImagesCommands(context);
12
+ }
13
+
14
+ // this number only targets inactive revisions
15
+ const revisionsToKeep = context.environment.envType === "prod" ? 5 : 0;
16
+
17
+ // this number needs to be higher than inactive after deploy, so we add one
18
+ const imagesToKeep = revisionsToKeep + 1;
19
+
20
+ const deleteOldRevisionsCommands = getDeleteUnusedRevisionsCommands(
21
+ context,
22
+ revisionsToKeep
23
+ );
24
+ const deleteOldImagesCommands = getDeleteUnusedImagesCommands(
25
+ context,
26
+ imagesToKeep
27
+ );
28
+
29
+ return [...deleteOldRevisionsCommands, ...deleteOldImagesCommands];
30
+ };
@@ -0,0 +1,67 @@
1
+ import type { Context } from "../../types/context";
2
+ import { isOfDeployType } from "../types";
3
+ import { createArgsString } from "./utils/createArgsString";
4
+ import { getServiceName } from "./utils/getServiceName";
5
+ import { removeFirstLinesFromCommandOutput } from "./utils/removeFirstLinesFromCommandOutput";
6
+
7
+ const getListRevisionsCommand = (
8
+ context: Context,
9
+ args: {
10
+ filter?: string;
11
+ format: string;
12
+ }
13
+ ) => {
14
+ const serviceName = getServiceName(context);
15
+ const deployConfig = context.componentConfig.deploy;
16
+
17
+ if (!deployConfig || !isOfDeployType(deployConfig, "google-cloudrun")) {
18
+ // should not happen
19
+ throw new Error("deploy config is wrong");
20
+ }
21
+ const filterRevisionArgs = {
22
+ project: deployConfig.projectId,
23
+ region: deployConfig.region,
24
+ // only show inactive revisions
25
+ service: serviceName,
26
+
27
+ limit: "unlimited", // is actualy the default
28
+ "sort-by": "metadata.creationTimestamp",
29
+ ...args,
30
+ };
31
+
32
+ // this prints out all inactive images of the given app
33
+ return `gcloud run revisions list ${createArgsString(filterRevisionArgs)}`;
34
+ };
35
+
36
+ export const getDeleteUnusedRevisionsCommands = (
37
+ context: Context,
38
+ keep: number
39
+ ) => {
40
+ const deployConfig = context.componentConfig.deploy;
41
+ if (deployConfig === false) {
42
+ return [];
43
+ }
44
+ if (!isOfDeployType(deployConfig, "google-cloudrun")) {
45
+ // should not happen
46
+ throw new Error("deploy config is wrong");
47
+ }
48
+
49
+ // this prints out all inactive images of the given app
50
+ const listAllInactiveRevisionsCmd = getListRevisionsCommand(context, {
51
+ format: `"value(name)"`,
52
+ filter: `'(status.conditions.status=False OR status.conditions.status=Unknown)'`,
53
+ });
54
+ // this removes the newest `revisionsToKeep` images
55
+ const listRevisionsToDeleteCmd = removeFirstLinesFromCommandOutput(
56
+ listAllInactiveRevisionsCmd,
57
+ keep
58
+ );
59
+ const deleteRevisionCmd = `gcloud run revisions delete ${createArgsString({
60
+ project: deployConfig.projectId,
61
+ region: deployConfig.region,
62
+ quiet: true,
63
+ })} $revisionname `;
64
+
65
+ const deleteRevisionsCmd = `${listRevisionsToDeleteCmd} | while read -r revisionname; do ${deleteRevisionCmd}; done`;
66
+ return [deleteRevisionsCmd];
67
+ };
@@ -1,7 +1,7 @@
1
1
  import { dump } from "js-yaml";
2
2
  import { merge, omit } from "lodash";
3
3
  import { GCLOUD_DEPLOY_CREDENTIALS_KEY } from ".";
4
- import { getDockerJobBaseProps, gitlabDockerLogin } from "../../build/docker";
4
+ import { getDockerJobBaseProps } from "../../build/docker";
5
5
  import { getLabels } from "../../context/getLabels";
6
6
  import { getRunnerImage } from "../../runner";
7
7
  import type { Context } from "../../types/context";
@@ -26,6 +26,12 @@ import {
26
26
  } from "./utils/database";
27
27
  import { gcloudServiceAccountLoginCommands } from "./utils/gcloudServiceAccountLoginCommands";
28
28
  import { getCloudRunJobName } from "./utils/jobName";
29
+ import {
30
+ getArtifactsRegistryImage,
31
+ getPushToArtifactsRegistryCommands,
32
+ } from "./artifactsRegistry";
33
+ import { getServiceName } from "./utils/getServiceName";
34
+ import { getRemoveOldRevisionsAndImagesCommand } from "./cleanup";
29
35
 
30
36
  const setExtraVarsScripts = (deployConfig: DeployConfigCloudRun) => [
31
37
  `export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe ${deployConfig.projectId} --format="value(projectNumber)")`,
@@ -44,26 +50,6 @@ export const createGoogleCloudRunDeployJobs = (
44
50
  throw new Error("deploy config is wrong");
45
51
  }
46
52
 
47
- const fullAppName = `${context.fullConfig.customerName}-${context.fullConfig.appName}`;
48
- const dockerUrl = `${deployConfig.region}-docker.pkg.dev/${deployConfig.projectId}/catladder-deploy/${fullAppName}`;
49
- const gcloudImagePath = [
50
- dockerUrl,
51
- context.environment.shortName,
52
- context.componentName,
53
-
54
- ...(context.environment.envType === "review"
55
- ? [context.commitInfo?.reviewSlug]
56
- : []),
57
- ];
58
- const gcloudImageName = `${gcloudImagePath.join("/")}:$DOCKER_IMAGE_TAG`;
59
-
60
- const pushImageToArtifactsRegistry = [
61
- gitlabDockerLogin,
62
- `gcloud auth configure-docker ${deployConfig.region}-docker.pkg.dev`,
63
- `docker pull $DOCKER_IMAGE:$DOCKER_IMAGE_TAG`,
64
- `docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG ${gcloudImageName}`,
65
- `docker push ${gcloudImageName}`,
66
- ];
67
53
  const allEnvVars = omit(
68
54
  context.environment.envVars,
69
55
  GCLOUD_DEPLOY_CREDENTIALS_KEY
@@ -79,7 +65,7 @@ export const createGoogleCloudRunDeployJobs = (
79
65
  };
80
66
 
81
67
  const commonDeployArgs = {
82
- image: gcloudImageName,
68
+ image: getArtifactsRegistryImage(context),
83
69
  ...commonArgs,
84
70
  "set-cloudsql-instances": deployConfig.cloudSql
85
71
  ? deployConfig.cloudSql.instanceConnectionName
@@ -87,7 +73,7 @@ export const createGoogleCloudRunDeployJobs = (
87
73
  labels: labelsString,
88
74
  };
89
75
 
90
- const serviceName = context.environment.fullName.toLowerCase();
76
+ const serviceName = getServiceName(context);
91
77
 
92
78
  const getFullJobName = (name: string) =>
93
79
  getCloudRunJobName(context.environment.fullName, name);
@@ -235,7 +221,7 @@ export const createGoogleCloudRunDeployJobs = (
235
221
  ...collapseableSection(
236
222
  "pushToArtifactRegistry",
237
223
  "Pushing image to artifacts registry"
238
- )(pushImageToArtifactsRegistry),
224
+ )(getPushToArtifactsRegistryCommands(context)),
239
225
  ...collapseableSection(
240
226
  "deploy",
241
227
  "Deploy to cloud run"
@@ -256,7 +242,12 @@ export const createGoogleCloudRunDeployJobs = (
256
242
  ),
257
243
  ...getJobRunScripts("postDeploy"),
258
244
  ]),
259
- `docker image rm ${gcloudImageName}`,
245
+ ...collapseableSection(
246
+ "cleanup",
247
+ "Cleanup"
248
+ )(
249
+ getRemoveOldRevisionsAndImagesCommand(context, "postDeploy") // we cleanup inactive images both on deploy and stop
250
+ ),
260
251
  ...getDependencyTrackUploadScript(context),
261
252
  ];
262
253
 
@@ -274,6 +265,8 @@ export const createGoogleCloudRunDeployJobs = (
274
265
  ...(deployConfig.cloudSql && deployConfig.cloudSql.deleteDatabaseOnStop
275
266
  ? getDatabaseDeleteScript(context, deployConfig)
276
267
  : []),
268
+
269
+ ...getRemoveOldRevisionsAndImagesCommand(context, "onStop"), // we cleanup inactive images both on deploy and stop
277
270
  ...getDependencyTrackDeleteScript(context),
278
271
  ];
279
272
  return createDeployementJobs(context, {
@@ -0,0 +1,3 @@
1
+ import type { Context } from "../../../types/context";
2
+ export const getServiceName = (context: Context) =>
3
+ context.environment.fullName.toLowerCase();
@@ -0,0 +1,12 @@
1
+ /**
2
+ *
3
+ * takes a command and removes the first keep lines from the output
4
+ *
5
+ * @param cmd the command, its stdout is then limited
6
+ * @param removeFirstN how many lines to remove at the start of the command
7
+ * @returns
8
+ */
9
+ export const removeFirstLinesFromCommandOutput = (
10
+ cmd: string,
11
+ removeFirstN: number
12
+ ) => (removeFirstN === 0 ? cmd : `${cmd} | tail -n +${removeFirstN + 1}`);