@catladder/pipeline 1.162.0 โ†’ 1.163.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +15 -1
  2. package/dist/build/types.d.ts +6 -0
  3. package/dist/bundles/catladder-gitlab/index.js +2 -2
  4. package/dist/constants.js +1 -1
  5. package/dist/pipeline/generatePipelineFiles.d.ts +38 -0
  6. package/dist/pipeline/generatePipelineFiles.js +44 -23
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1341 -0
  9. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1325 -0
  10. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1341 -0
  11. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1393 -0
  12. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1341 -0
  13. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1352 -0
  14. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1341 -0
  15. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1341 -0
  16. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1385 -0
  17. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1233 -4
  18. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1349 -4
  19. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2825 -0
  20. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +2572 -0
  21. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1349 -0
  22. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1196 -0
  23. package/examples/__snapshots__/custom-build-job.test.ts.snap +1085 -0
  24. package/examples/__snapshots__/custom-deploy.test.ts.snap +1103 -0
  25. package/examples/__snapshots__/custom-envs.test.ts.snap +709 -0
  26. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1093 -0
  27. package/examples/__snapshots__/git-submodule.test.ts.snap +1342 -0
  28. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1778 -0
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1790 -0
  30. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1798 -0
  31. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3352 -0
  32. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1902 -0
  33. package/examples/__snapshots__/local-dot-env.test.ts.snap +1341 -0
  34. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1839 -0
  35. package/examples/__snapshots__/multiline-var.test.ts.snap +3376 -0
  36. package/examples/__snapshots__/native-app.test.ts.snap +2149 -0
  37. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1341 -0
  38. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1349 -0
  39. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1470 -0
  40. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1275 -0
  41. package/examples/__utils__/helpers.ts +14 -1
  42. package/examples/cloud-run-memory-limit.test.ts +9 -1
  43. package/examples/cloud-run-meteor-with-worker.test.ts +9 -1
  44. package/examples/cloud-run-no-cpu-throttling.test.ts +9 -1
  45. package/examples/cloud-run-no-service.test.ts +9 -1
  46. package/examples/cloud-run-non-public.test.ts +9 -1
  47. package/examples/cloud-run-post-stop-job.test.ts +9 -1
  48. package/examples/cloud-run-service-gen2.test.ts +9 -1
  49. package/examples/cloud-run-service-increase-timout.test.ts +9 -1
  50. package/examples/cloud-run-service-with-volumes.test.ts +9 -1
  51. package/examples/cloud-run-storybook.test.ts +9 -1
  52. package/examples/cloud-run-storybook.ts +9 -1
  53. package/examples/cloud-run-with-ngnix.test.ts +9 -1
  54. package/examples/cloud-run-with-ngnix.ts +5 -1
  55. package/examples/cloud-run-with-sql-reuse-db.test.ts +9 -1
  56. package/examples/cloud-run-with-sql.test.ts +9 -1
  57. package/examples/cloud-run-with-worker.test.ts +9 -1
  58. package/examples/custom-build-job-with-tests.test.ts +9 -1
  59. package/examples/custom-build-job.test.ts +9 -1
  60. package/examples/custom-deploy.test.ts +9 -1
  61. package/examples/custom-envs.test.ts +9 -1
  62. package/examples/custom-sbom-java.test.ts +9 -1
  63. package/examples/git-submodule.test.ts +9 -1
  64. package/examples/kubernetes-application-customization.test.ts +9 -1
  65. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +9 -1
  66. package/examples/kubernetes-with-cloud-sql.test.ts +9 -1
  67. package/examples/kubernetes-with-jobs.test.ts +9 -1
  68. package/examples/kubernetes-with-mongodb.test.ts +9 -1
  69. package/examples/local-dot-env.test.ts +9 -1
  70. package/examples/meteor-kubernetes.test.ts +9 -1
  71. package/examples/multiline-var.test.ts +9 -1
  72. package/examples/native-app.test.ts +9 -1
  73. package/examples/node-build-with-custom-image.test.ts +9 -1
  74. package/examples/node-build-with-docker-additions.test.ts +9 -1
  75. package/examples/rails-k8s-with-worker.test.ts +9 -1
  76. package/examples/wait-for-other-deploy.test.ts +9 -1
  77. package/package.json +4 -3
  78. package/scripts/generate-examples-test.ts +7 -5
  79. package/src/build/types.ts +6 -0
  80. package/src/pipeline/generatePipelineFiles.ts +61 -36
@@ -1957,3 +1957,1344 @@ EOF
1957
1957
  },
1958
1958
  }
1959
1959
  `;
1960
+
1961
+ exports[`matches snapshot for cloud-run-memory-limit local pipeline YAML 1`] = `
1962
+ "image: path/to/docker/jobs-default:the-version
1963
+ stages:
1964
+ - setup
1965
+ - setup dev
1966
+ - setup review
1967
+ - setup stage
1968
+ - setup prod
1969
+ - test
1970
+ - test dev
1971
+ - test review
1972
+ - test stage
1973
+ - test prod
1974
+ - build
1975
+ - build dev
1976
+ - build review
1977
+ - build stage
1978
+ - build prod
1979
+ - deploy
1980
+ - deploy dev
1981
+ - deploy review
1982
+ - deploy stage
1983
+ - deploy prod
1984
+ - verify
1985
+ - verify dev
1986
+ - verify review
1987
+ - verify stage
1988
+ - verify prod
1989
+ - rollback
1990
+ - rollback dev
1991
+ - rollback review
1992
+ - rollback stage
1993
+ - rollback prod
1994
+ - stop
1995
+ - stop dev
1996
+ - stop review
1997
+ - stop stage
1998
+ - stop prod
1999
+ - release
2000
+ variables:
2001
+ FF_USE_FASTZIP: 'true'
2002
+ ARTIFACT_COMPRESSION_LEVEL: fast
2003
+ CACHE_COMPRESSION_LEVEL: fast
2004
+ TRANSFER_METER_FREQUENCY: 5s
2005
+ GIT_DEPTH: '1'
2006
+ api ๐Ÿ›ก audit:
2007
+ stage: test
2008
+ image: path/to/docker/jobs-default:the-version
2009
+ variables:
2010
+ KUBERNETES_CPU_REQUEST: '0.45'
2011
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2012
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2013
+ script:
2014
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2015
+ - export APP_PATH="api"
2016
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2017
+ - cd api
2018
+ - yarn npm audit --environment production
2019
+ rules:
2020
+ - when: never
2021
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2022
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2023
+ - if: $CI_MERGE_REQUEST_ID
2024
+ needs: []
2025
+ retry: &a1
2026
+ max: 2
2027
+ when:
2028
+ - runner_system_failure
2029
+ - stuck_or_timeout_failure
2030
+ interruptible: true
2031
+ allow_failure: true
2032
+ api ๐Ÿ‘ฎ lint:
2033
+ stage: test
2034
+ image: path/to/docker/jobs-default:the-version
2035
+ variables:
2036
+ KUBERNETES_CPU_REQUEST: '0.45'
2037
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2038
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2039
+ script:
2040
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2041
+ - export APP_PATH="api"
2042
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2043
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2044
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2045
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2046
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2047
+ - cd api
2048
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2049
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2050
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2051
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2052
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2053
+ - yarn install --immutable
2054
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2055
+ - yarn lint
2056
+ cache:
2057
+ - key: api-yarn
2058
+ policy: pull-push
2059
+ paths:
2060
+ - api/.yarn
2061
+ - key: api-node-modules
2062
+ policy: pull-push
2063
+ paths:
2064
+ - api/node_modules
2065
+ rules:
2066
+ - when: never
2067
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2068
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2069
+ - if: $CI_MERGE_REQUEST_ID
2070
+ needs: []
2071
+ retry: *a1
2072
+ interruptible: true
2073
+ api ๐Ÿงช test:
2074
+ stage: test
2075
+ image: path/to/docker/jobs-testing-chrome:the-version
2076
+ variables:
2077
+ KUBERNETES_CPU_REQUEST: '0.45'
2078
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2079
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2080
+ script:
2081
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2082
+ - export APP_PATH="api"
2083
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2084
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2085
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2086
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2087
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2088
+ - cd api
2089
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2090
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2091
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2092
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2093
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2094
+ - yarn install --immutable
2095
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2096
+ - yarn test
2097
+ cache:
2098
+ - key: api-yarn
2099
+ policy: pull-push
2100
+ paths:
2101
+ - api/.yarn
2102
+ - key: api-node-modules
2103
+ policy: pull-push
2104
+ paths:
2105
+ - api/node_modules
2106
+ rules:
2107
+ - when: never
2108
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2109
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2110
+ - if: $CI_MERGE_REQUEST_ID
2111
+ needs: []
2112
+ retry: *a1
2113
+ interruptible: true
2114
+ 'api ๐Ÿ”จ app | dev ':
2115
+ stage: build
2116
+ image: path/to/docker/jobs-default:the-version
2117
+ variables:
2118
+ KUBERNETES_CPU_REQUEST: '0.45'
2119
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2120
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2121
+ script:
2122
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2123
+ - export ENV_SHORT="dev"
2124
+ - export APP_DIR="api"
2125
+ - export ENV_TYPE="dev"
2126
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2127
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2128
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2129
+ - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2130
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2131
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2132
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2133
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2134
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2135
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2136
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
2137
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
2138
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2139
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2140
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2141
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2142
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2143
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2144
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2145
+ - cd api
2146
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2147
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2148
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2149
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2150
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2151
+ - yarn install --immutable
2152
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2153
+ - yarn build
2154
+ cache:
2155
+ - key: api-yarn
2156
+ policy: pull-push
2157
+ paths:
2158
+ - api/.yarn
2159
+ - key: api-node-modules
2160
+ policy: pull-push
2161
+ paths:
2162
+ - api/node_modules
2163
+ - key: api-next-cache
2164
+ policy: pull-push
2165
+ paths:
2166
+ - api/.next/cache
2167
+ artifacts:
2168
+ paths:
2169
+ - api/__build_info.json
2170
+ - api/.next
2171
+ - api/dist
2172
+ expire_in: 1 day
2173
+ when: always
2174
+ reports: {}
2175
+ rules:
2176
+ - when: never
2177
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2178
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2179
+ needs: []
2180
+ retry: *a1
2181
+ interruptible: true
2182
+ 'api ๐Ÿ”จ docker | dev ':
2183
+ stage: build
2184
+ image: path/to/docker/docker-build:the-version
2185
+ services:
2186
+ - name: docker:24.0.6-dind
2187
+ command:
2188
+ - --tls=false
2189
+ variables:
2190
+ DOCKER_HOST: tcp://0.0.0.0:2375
2191
+ DOCKER_TLS_CERTDIR: ''
2192
+ DOCKER_DRIVER: overlay2
2193
+ DOCKER_BUILDKIT: '1'
2194
+ KUBERNETES_CPU_REQUEST: '0.45'
2195
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2196
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2197
+ script:
2198
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2199
+ - export APP_DIR="api"
2200
+ - export DOCKER_BUILD_CONTEXT="."
2201
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2202
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
2203
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2204
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2205
+ - |-
2206
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2207
+ RUN yarn plugin import workspace-tools
2208
+ RUN yarn workspaces focus --production && yarn rebuild"
2209
+ - |-
2210
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2211
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2212
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2213
+ COPY --chown=node:node .yarn /app/.yarn"
2214
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2215
+ - ensureNodeDockerfile
2216
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2217
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
2218
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
2219
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2220
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2221
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2222
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2223
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2224
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2225
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2226
+ - docker push $DOCKER_CACHE_IMAGE
2227
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2228
+ cache:
2229
+ - key: api-yarn
2230
+ policy: pull
2231
+ paths:
2232
+ - api/.yarn
2233
+ rules:
2234
+ - when: never
2235
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2236
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2237
+ needs:
2238
+ - 'api ๐Ÿ”จ app | dev '
2239
+ retry: *a1
2240
+ interruptible: true
2241
+ 'api ๐Ÿงพ sbom | dev ':
2242
+ stage: build
2243
+ image: aquasec/trivy:0.38.3
2244
+ variables: {}
2245
+ script:
2246
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2247
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2248
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2249
+ artifacts:
2250
+ paths:
2251
+ - __sbom.json
2252
+ rules:
2253
+ - when: never
2254
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2255
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2256
+ needs: []
2257
+ retry: *a1
2258
+ interruptible: true
2259
+ allow_failure: true
2260
+ 'api ๐Ÿš€ Deploy | dev ':
2261
+ stage: deploy dev
2262
+ image: path/to/docker/gcloud:the-version
2263
+ variables:
2264
+ KUBERNETES_CPU_REQUEST: '0.22'
2265
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2266
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2267
+ script:
2268
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2269
+ - export ENV_SHORT="dev"
2270
+ - export APP_DIR="api"
2271
+ - export ENV_TYPE="dev"
2272
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2273
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2274
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2275
+ - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2276
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2277
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2278
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2279
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2280
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2281
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2282
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
2283
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
2284
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2285
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2286
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
2287
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2288
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2289
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2290
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2291
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2292
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
2293
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2294
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2295
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2296
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2297
+ - |
2298
+ cat > ____envvars.yaml <<EOF
2299
+ ENV_SHORT: |-
2300
+ dev
2301
+ APP_DIR: |-
2302
+ api
2303
+ ENV_TYPE: |-
2304
+ dev
2305
+ BUILD_INFO_BUILD_ID: |-
2306
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2307
+ BUILD_INFO_BUILD_TIME: |-
2308
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2309
+ BUILD_INFO_CURRENT_VERSION: |-
2310
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2311
+ HOST: |-
2312
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2313
+ ROOT_URL: |-
2314
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2315
+ HOST_INTERNAL: |-
2316
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2317
+ HOST_CANONICAL: |-
2318
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2319
+ ROOT_URL_INTERNAL: |-
2320
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2321
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2322
+ google-project-id
2323
+ DEPLOY_CLOUD_RUN_REGION: |-
2324
+ europe-west6
2325
+ GCLOUD_RUN_canonicalHostSuffix: |-
2326
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2327
+ _ALL_ENV_VAR_KEYS: |-
2328
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2329
+
2330
+ EOF
2331
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2332
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2333
+ - gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --cpu=2 --memory=8Gi --allow-unauthenticated --ingress=all --cpu-boost
2334
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2335
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2336
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --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=google-project-id --region=europe-west6 --quiet $revisionname ; done
2337
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/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 europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done
2338
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2339
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2340
+ - echo 'Uploading SBOM to Dependency Track'
2341
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2342
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2343
+ environment:
2344
+ name: dev/api
2345
+ url: $CL_GITLAB_ENVIRONMENT_URL
2346
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
2347
+ auto_stop_in: 4 weeks
2348
+ artifacts:
2349
+ reports:
2350
+ dotenv: gitlab_environment.env
2351
+ rules:
2352
+ - when: never
2353
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2354
+ - when: on_success
2355
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2356
+ needs:
2357
+ - job: api ๐Ÿ‘ฎ lint
2358
+ artifacts: false
2359
+ - job: 'api ๐Ÿ”จ app | dev '
2360
+ artifacts: false
2361
+ - job: 'api ๐Ÿ”จ docker | dev '
2362
+ artifacts: false
2363
+ - job: api ๐Ÿงช test
2364
+ artifacts: false
2365
+ - job: 'api ๐Ÿงพ sbom | dev '
2366
+ artifacts: true
2367
+ - job: api ๐Ÿ›ก audit
2368
+ artifacts: false
2369
+ retry: *a1
2370
+ interruptible: true
2371
+ allow_failure: false
2372
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
2373
+ stage: stop dev
2374
+ image: path/to/docker/gcloud:the-version
2375
+ variables:
2376
+ KUBERNETES_CPU_REQUEST: '0.22'
2377
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2378
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2379
+ GIT_STRATEGY: none
2380
+ script:
2381
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2382
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2383
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2384
+ - set +e
2385
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
2386
+ - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
2387
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags
2388
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2389
+ - echo 'Disabling component in Dependency Track'
2390
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2391
+ - set -e
2392
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2393
+ environment:
2394
+ name: dev/api
2395
+ url: $CL_GITLAB_ENVIRONMENT_URL
2396
+ action: stop
2397
+ artifacts:
2398
+ reports:
2399
+ dotenv: gitlab_environment.env
2400
+ rules:
2401
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2402
+ when: on_success
2403
+ - when: never
2404
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2405
+ - when: manual
2406
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2407
+ needs: []
2408
+ retry: *a1
2409
+ interruptible: true
2410
+ allow_failure: true
2411
+ 'api ๐Ÿ”จ app | review ':
2412
+ stage: build
2413
+ image: path/to/docker/jobs-default:the-version
2414
+ variables:
2415
+ KUBERNETES_CPU_REQUEST: '0.45'
2416
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2417
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2418
+ script:
2419
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2420
+ - export ENV_SHORT="review"
2421
+ - export APP_DIR="api"
2422
+ - export ENV_TYPE="review"
2423
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2424
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2425
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2426
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2427
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2428
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2429
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2430
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2431
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2432
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2433
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
2434
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
2435
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2436
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2437
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2438
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2439
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2440
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2441
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2442
+ - cd api
2443
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2444
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2445
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2446
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2447
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2448
+ - yarn install --immutable
2449
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2450
+ - yarn build
2451
+ cache:
2452
+ - key: api-yarn
2453
+ policy: pull-push
2454
+ paths:
2455
+ - api/.yarn
2456
+ - key: api-node-modules
2457
+ policy: pull-push
2458
+ paths:
2459
+ - api/node_modules
2460
+ - key: api-next-cache
2461
+ policy: pull-push
2462
+ paths:
2463
+ - api/.next/cache
2464
+ artifacts:
2465
+ paths:
2466
+ - api/__build_info.json
2467
+ - api/.next
2468
+ - api/dist
2469
+ expire_in: 1 day
2470
+ when: always
2471
+ reports: {}
2472
+ rules:
2473
+ - if: $CI_MERGE_REQUEST_ID
2474
+ needs: []
2475
+ retry: *a1
2476
+ interruptible: true
2477
+ 'api ๐Ÿ”จ docker | review ':
2478
+ stage: build
2479
+ image: path/to/docker/docker-build:the-version
2480
+ services:
2481
+ - name: docker:24.0.6-dind
2482
+ command:
2483
+ - --tls=false
2484
+ variables:
2485
+ DOCKER_HOST: tcp://0.0.0.0:2375
2486
+ DOCKER_TLS_CERTDIR: ''
2487
+ DOCKER_DRIVER: overlay2
2488
+ DOCKER_BUILDKIT: '1'
2489
+ KUBERNETES_CPU_REQUEST: '0.45'
2490
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2491
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2492
+ script:
2493
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2494
+ - export APP_DIR="api"
2495
+ - export DOCKER_BUILD_CONTEXT="."
2496
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2497
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
2498
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2499
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2500
+ - |-
2501
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2502
+ RUN yarn plugin import workspace-tools
2503
+ RUN yarn workspaces focus --production && yarn rebuild"
2504
+ - |-
2505
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2506
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2507
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2508
+ COPY --chown=node:node .yarn /app/.yarn"
2509
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2510
+ - ensureNodeDockerfile
2511
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2512
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
2513
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
2514
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2515
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2516
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2517
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2518
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2519
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2520
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2521
+ - docker push $DOCKER_CACHE_IMAGE
2522
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2523
+ cache:
2524
+ - key: api-yarn
2525
+ policy: pull
2526
+ paths:
2527
+ - api/.yarn
2528
+ rules:
2529
+ - if: $CI_MERGE_REQUEST_ID
2530
+ needs:
2531
+ - 'api ๐Ÿ”จ app | review '
2532
+ retry: *a1
2533
+ interruptible: true
2534
+ 'api ๐Ÿงพ sbom | review ':
2535
+ stage: build
2536
+ image: aquasec/trivy:0.38.3
2537
+ variables: {}
2538
+ script:
2539
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2540
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2541
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2542
+ artifacts:
2543
+ paths:
2544
+ - __sbom.json
2545
+ rules:
2546
+ - if: $CI_MERGE_REQUEST_ID
2547
+ needs: []
2548
+ retry: *a1
2549
+ interruptible: true
2550
+ allow_failure: true
2551
+ 'api ๐Ÿš€ Deploy | review ':
2552
+ stage: deploy review
2553
+ image: path/to/docker/gcloud:the-version
2554
+ variables:
2555
+ KUBERNETES_CPU_REQUEST: '0.22'
2556
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2557
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2558
+ script:
2559
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2560
+ - export ENV_SHORT="review"
2561
+ - export APP_DIR="api"
2562
+ - export ENV_TYPE="review"
2563
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2564
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2565
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2566
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2567
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2568
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2569
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2570
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2571
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2572
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2573
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
2574
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
2575
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2576
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2577
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
2578
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2579
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2580
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2581
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2582
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2583
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
2584
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2585
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2586
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2587
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2588
+ - |
2589
+ cat > ____envvars.yaml <<EOF
2590
+ ENV_SHORT: |-
2591
+ review
2592
+ APP_DIR: |-
2593
+ api
2594
+ ENV_TYPE: |-
2595
+ review
2596
+ BUILD_INFO_BUILD_ID: |-
2597
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2598
+ BUILD_INFO_BUILD_TIME: |-
2599
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2600
+ BUILD_INFO_CURRENT_VERSION: |-
2601
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2602
+ HOST: |-
2603
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2604
+ ROOT_URL: |-
2605
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2606
+ HOST_INTERNAL: |-
2607
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2608
+ HOST_CANONICAL: |-
2609
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2610
+ ROOT_URL_INTERNAL: |-
2611
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2612
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2613
+ google-project-id
2614
+ DEPLOY_CLOUD_RUN_REGION: |-
2615
+ europe-west6
2616
+ GCLOUD_RUN_canonicalHostSuffix: |-
2617
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2618
+ _ALL_ENV_VAR_KEYS: |-
2619
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2620
+
2621
+ EOF
2622
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2623
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2624
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --cpu=2 --memory=8Gi --allow-unauthenticated --ingress=all --cpu-boost
2625
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2626
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2627
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
2628
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
2629
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2630
+ - set +e
2631
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
2632
+ - set -e
2633
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2634
+ - echo 'Uploading SBOM to Dependency Track'
2635
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2636
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2637
+ environment:
2638
+ name: review/$CI_COMMIT_REF_NAME/api
2639
+ url: $CL_GITLAB_ENVIRONMENT_URL
2640
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
2641
+ auto_stop_in: 1 week
2642
+ artifacts:
2643
+ reports:
2644
+ dotenv: gitlab_environment.env
2645
+ rules:
2646
+ - when: on_success
2647
+ if: $CI_MERGE_REQUEST_ID
2648
+ needs:
2649
+ - job: api ๐Ÿ‘ฎ lint
2650
+ artifacts: false
2651
+ - job: 'api ๐Ÿ”จ app | review '
2652
+ artifacts: false
2653
+ - job: 'api ๐Ÿ”จ docker | review '
2654
+ artifacts: false
2655
+ - job: api ๐Ÿงช test
2656
+ artifacts: false
2657
+ - job: 'api ๐Ÿงพ sbom | review '
2658
+ artifacts: true
2659
+ - job: api ๐Ÿ›ก audit
2660
+ artifacts: false
2661
+ retry: *a1
2662
+ interruptible: true
2663
+ allow_failure: false
2664
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
2665
+ stage: stop review
2666
+ image: path/to/docker/gcloud:the-version
2667
+ variables:
2668
+ KUBERNETES_CPU_REQUEST: '0.22'
2669
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2670
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2671
+ GIT_STRATEGY: none
2672
+ script:
2673
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2674
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2675
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2676
+ - set +e
2677
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
2678
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
2679
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
2680
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2681
+ - set +e
2682
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
2683
+ - set -e
2684
+ - echo 'Disabling component in Dependency Track'
2685
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2686
+ - set -e
2687
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2688
+ environment:
2689
+ name: review/$CI_COMMIT_REF_NAME/api
2690
+ url: $CL_GITLAB_ENVIRONMENT_URL
2691
+ action: stop
2692
+ artifacts:
2693
+ reports:
2694
+ dotenv: gitlab_environment.env
2695
+ rules:
2696
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2697
+ when: on_success
2698
+ - when: manual
2699
+ if: $CI_MERGE_REQUEST_ID
2700
+ needs: []
2701
+ retry: *a1
2702
+ interruptible: true
2703
+ allow_failure: true
2704
+ 'api ๐Ÿ”จ app | stage ':
2705
+ stage: build
2706
+ image: path/to/docker/jobs-default:the-version
2707
+ variables:
2708
+ KUBERNETES_CPU_REQUEST: '0.45'
2709
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2710
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2711
+ script:
2712
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2713
+ - export ENV_SHORT="stage"
2714
+ - export APP_DIR="api"
2715
+ - export ENV_TYPE="stage"
2716
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2717
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2718
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2719
+ - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2720
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2721
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2722
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2723
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2724
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2725
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2726
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
2727
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
2728
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2729
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2730
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2731
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2732
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2733
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2734
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2735
+ - cd api
2736
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2737
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2738
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2739
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2740
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2741
+ - yarn install --immutable
2742
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2743
+ - yarn build
2744
+ cache:
2745
+ - key: api-yarn
2746
+ policy: pull-push
2747
+ paths:
2748
+ - api/.yarn
2749
+ - key: api-node-modules
2750
+ policy: pull-push
2751
+ paths:
2752
+ - api/node_modules
2753
+ - key: api-next-cache
2754
+ policy: pull-push
2755
+ paths:
2756
+ - api/.next/cache
2757
+ artifacts:
2758
+ paths:
2759
+ - api/__build_info.json
2760
+ - api/.next
2761
+ - api/dist
2762
+ expire_in: 1 day
2763
+ when: always
2764
+ reports: {}
2765
+ rules:
2766
+ - if: $CI_COMMIT_TAG
2767
+ needs: []
2768
+ retry: *a1
2769
+ interruptible: true
2770
+ 'api ๐Ÿ”จ docker | stage ':
2771
+ stage: build
2772
+ image: path/to/docker/docker-build:the-version
2773
+ services:
2774
+ - name: docker:24.0.6-dind
2775
+ command:
2776
+ - --tls=false
2777
+ variables:
2778
+ DOCKER_HOST: tcp://0.0.0.0:2375
2779
+ DOCKER_TLS_CERTDIR: ''
2780
+ DOCKER_DRIVER: overlay2
2781
+ DOCKER_BUILDKIT: '1'
2782
+ KUBERNETES_CPU_REQUEST: '0.45'
2783
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2784
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2785
+ script:
2786
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2787
+ - export APP_DIR="api"
2788
+ - export DOCKER_BUILD_CONTEXT="."
2789
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2790
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
2791
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2792
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2793
+ - |-
2794
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2795
+ RUN yarn plugin import workspace-tools
2796
+ RUN yarn workspaces focus --production && yarn rebuild"
2797
+ - |-
2798
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2799
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2800
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2801
+ COPY --chown=node:node .yarn /app/.yarn"
2802
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2803
+ - ensureNodeDockerfile
2804
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2805
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2806
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
2807
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2808
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2809
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2810
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2811
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2812
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2813
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2814
+ - docker push $DOCKER_CACHE_IMAGE
2815
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2816
+ cache:
2817
+ - key: api-yarn
2818
+ policy: pull
2819
+ paths:
2820
+ - api/.yarn
2821
+ rules:
2822
+ - if: $CI_COMMIT_TAG
2823
+ needs:
2824
+ - 'api ๐Ÿ”จ app | stage '
2825
+ retry: *a1
2826
+ interruptible: true
2827
+ 'api ๐Ÿงพ sbom | stage ':
2828
+ stage: build
2829
+ image: aquasec/trivy:0.38.3
2830
+ variables: {}
2831
+ script:
2832
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2833
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2834
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2835
+ artifacts:
2836
+ paths:
2837
+ - __sbom.json
2838
+ rules:
2839
+ - if: $CI_COMMIT_TAG
2840
+ needs: []
2841
+ retry: *a1
2842
+ interruptible: true
2843
+ allow_failure: true
2844
+ 'api ๐Ÿš€ Deploy | stage ':
2845
+ stage: deploy stage
2846
+ image: path/to/docker/gcloud:the-version
2847
+ variables:
2848
+ KUBERNETES_CPU_REQUEST: '0.22'
2849
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2850
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2851
+ script:
2852
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2853
+ - export ENV_SHORT="stage"
2854
+ - export APP_DIR="api"
2855
+ - export ENV_TYPE="stage"
2856
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2857
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2858
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2859
+ - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2860
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2861
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2862
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2863
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2864
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
2865
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2866
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
2867
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
2868
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2869
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2870
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
2871
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
2872
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2873
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2874
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2875
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2876
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2877
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2878
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2879
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2880
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2881
+ - |
2882
+ cat > ____envvars.yaml <<EOF
2883
+ ENV_SHORT: |-
2884
+ stage
2885
+ APP_DIR: |-
2886
+ api
2887
+ ENV_TYPE: |-
2888
+ stage
2889
+ BUILD_INFO_BUILD_ID: |-
2890
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2891
+ BUILD_INFO_BUILD_TIME: |-
2892
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2893
+ BUILD_INFO_CURRENT_VERSION: |-
2894
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2895
+ HOST: |-
2896
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2897
+ ROOT_URL: |-
2898
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2899
+ HOST_INTERNAL: |-
2900
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2901
+ HOST_CANONICAL: |-
2902
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2903
+ ROOT_URL_INTERNAL: |-
2904
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2905
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2906
+ google-project-id
2907
+ DEPLOY_CLOUD_RUN_REGION: |-
2908
+ europe-west6
2909
+ GCLOUD_RUN_canonicalHostSuffix: |-
2910
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2911
+ _ALL_ENV_VAR_KEYS: |-
2912
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2913
+
2914
+ EOF
2915
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2916
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2917
+ - gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --cpu=2 --memory=8Gi --allow-unauthenticated --ingress=all --cpu-boost
2918
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2919
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2920
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --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=google-project-id --region=europe-west6 --quiet $revisionname ; done
2921
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/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 europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done
2922
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2923
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2924
+ - echo 'Uploading SBOM to Dependency Track'
2925
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2926
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2927
+ environment:
2928
+ name: stage/api
2929
+ url: $CL_GITLAB_ENVIRONMENT_URL
2930
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
2931
+ artifacts:
2932
+ reports:
2933
+ dotenv: gitlab_environment.env
2934
+ rules:
2935
+ - when: on_success
2936
+ if: $CI_COMMIT_TAG
2937
+ needs:
2938
+ - job: 'api ๐Ÿ”จ app | stage '
2939
+ artifacts: false
2940
+ - job: 'api ๐Ÿ”จ docker | stage '
2941
+ artifacts: false
2942
+ - job: 'api ๐Ÿงพ sbom | stage '
2943
+ artifacts: true
2944
+ retry: *a1
2945
+ interruptible: true
2946
+ allow_failure: false
2947
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
2948
+ stage: stop stage
2949
+ image: path/to/docker/gcloud:the-version
2950
+ variables:
2951
+ KUBERNETES_CPU_REQUEST: '0.22'
2952
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2953
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2954
+ GIT_STRATEGY: none
2955
+ script:
2956
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2957
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2958
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2959
+ - set +e
2960
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2961
+ - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
2962
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags
2963
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2964
+ - echo 'Disabling component in Dependency Track'
2965
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2966
+ - set -e
2967
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2968
+ environment:
2969
+ name: stage/api
2970
+ url: $CL_GITLAB_ENVIRONMENT_URL
2971
+ action: stop
2972
+ artifacts:
2973
+ reports:
2974
+ dotenv: gitlab_environment.env
2975
+ rules:
2976
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2977
+ when: on_success
2978
+ - when: manual
2979
+ if: $CI_COMMIT_TAG
2980
+ needs: []
2981
+ retry: *a1
2982
+ interruptible: true
2983
+ allow_failure: true
2984
+ 'api ๐Ÿ”จ app | prod ':
2985
+ stage: build
2986
+ image: path/to/docker/jobs-default:the-version
2987
+ variables:
2988
+ KUBERNETES_CPU_REQUEST: '0.45'
2989
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2990
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2991
+ script:
2992
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2993
+ - export ENV_SHORT="prod"
2994
+ - export APP_DIR="api"
2995
+ - export ENV_TYPE="prod"
2996
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2997
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2998
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2999
+ - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3000
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3001
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3002
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3003
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3004
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
3005
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
3006
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
3007
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
3008
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
3009
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3010
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
3011
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3012
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3013
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3014
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3015
+ - cd api
3016
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3017
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3018
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3019
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3020
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
3021
+ - yarn install --immutable
3022
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
3023
+ - yarn build
3024
+ cache:
3025
+ - key: api-yarn
3026
+ policy: pull-push
3027
+ paths:
3028
+ - api/.yarn
3029
+ - key: api-node-modules
3030
+ policy: pull-push
3031
+ paths:
3032
+ - api/node_modules
3033
+ - key: api-next-cache
3034
+ policy: pull-push
3035
+ paths:
3036
+ - api/.next/cache
3037
+ artifacts:
3038
+ paths:
3039
+ - api/__build_info.json
3040
+ - api/.next
3041
+ - api/dist
3042
+ expire_in: 1 day
3043
+ when: always
3044
+ reports: {}
3045
+ rules:
3046
+ - if: $CI_COMMIT_TAG
3047
+ needs: []
3048
+ retry: *a1
3049
+ interruptible: true
3050
+ 'api ๐Ÿ”จ docker | prod ':
3051
+ stage: build
3052
+ image: path/to/docker/docker-build:the-version
3053
+ services:
3054
+ - name: docker:24.0.6-dind
3055
+ command:
3056
+ - --tls=false
3057
+ variables:
3058
+ DOCKER_HOST: tcp://0.0.0.0:2375
3059
+ DOCKER_TLS_CERTDIR: ''
3060
+ DOCKER_DRIVER: overlay2
3061
+ DOCKER_BUILDKIT: '1'
3062
+ KUBERNETES_CPU_REQUEST: '0.45'
3063
+ KUBERNETES_MEMORY_REQUEST: 1Gi
3064
+ KUBERNETES_MEMORY_LIMIT: 2Gi
3065
+ script:
3066
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3067
+ - export APP_DIR="api"
3068
+ - export DOCKER_BUILD_CONTEXT="."
3069
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
3070
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
3071
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
3072
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3073
+ - |-
3074
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
3075
+ RUN yarn plugin import workspace-tools
3076
+ RUN yarn workspaces focus --production && yarn rebuild"
3077
+ - |-
3078
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
3079
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
3080
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3081
+ COPY --chown=node:node .yarn /app/.yarn"
3082
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3083
+ - ensureNodeDockerfile
3084
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
3085
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
3086
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
3087
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
3088
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
3089
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
3090
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
3091
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
3092
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
3093
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
3094
+ - docker push $DOCKER_CACHE_IMAGE
3095
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
3096
+ cache:
3097
+ - key: api-yarn
3098
+ policy: pull
3099
+ paths:
3100
+ - api/.yarn
3101
+ rules:
3102
+ - if: $CI_COMMIT_TAG
3103
+ needs:
3104
+ - 'api ๐Ÿ”จ app | prod '
3105
+ retry: *a1
3106
+ interruptible: true
3107
+ 'api ๐Ÿงพ sbom | prod ':
3108
+ stage: build
3109
+ image: aquasec/trivy:0.38.3
3110
+ variables: {}
3111
+ script:
3112
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3113
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3114
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
3115
+ artifacts:
3116
+ paths:
3117
+ - __sbom.json
3118
+ rules:
3119
+ - if: $CI_COMMIT_TAG
3120
+ needs: []
3121
+ retry: *a1
3122
+ interruptible: true
3123
+ allow_failure: true
3124
+ 'api ๐Ÿš€ Deploy | prod ':
3125
+ stage: deploy prod
3126
+ image: path/to/docker/gcloud:the-version
3127
+ variables:
3128
+ KUBERNETES_CPU_REQUEST: '0.22'
3129
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3130
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3131
+ script:
3132
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3133
+ - export ENV_SHORT="prod"
3134
+ - export APP_DIR="api"
3135
+ - export ENV_TYPE="prod"
3136
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3137
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3138
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3139
+ - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3140
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3141
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3142
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3143
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
3144
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
3145
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
3146
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
3147
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
3148
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
3149
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
3150
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
3151
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
3152
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3153
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
3154
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3155
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
3156
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
3157
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
3158
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
3159
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
3160
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
3161
+ - |
3162
+ cat > ____envvars.yaml <<EOF
3163
+ ENV_SHORT: |-
3164
+ prod
3165
+ APP_DIR: |-
3166
+ api
3167
+ ENV_TYPE: |-
3168
+ prod
3169
+ BUILD_INFO_BUILD_ID: |-
3170
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3171
+ BUILD_INFO_BUILD_TIME: |-
3172
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3173
+ BUILD_INFO_CURRENT_VERSION: |-
3174
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
3175
+ HOST: |-
3176
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
3177
+ ROOT_URL: |-
3178
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
3179
+ HOST_INTERNAL: |-
3180
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
3181
+ HOST_CANONICAL: |-
3182
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
3183
+ ROOT_URL_INTERNAL: |-
3184
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
3185
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
3186
+ google-project-id
3187
+ DEPLOY_CLOUD_RUN_REGION: |-
3188
+ europe-west6
3189
+ GCLOUD_RUN_canonicalHostSuffix: |-
3190
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
3191
+ _ALL_ENV_VAR_KEYS: |-
3192
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
3193
+
3194
+ EOF
3195
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
3196
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
3197
+ - gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --cpu=2 --memory=8Gi --allow-unauthenticated --ingress=all --cpu-boost
3198
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
3199
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
3200
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --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=google-project-id --region=europe-west6 --quiet $revisionname ; done
3201
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/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 europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done
3202
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
3203
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
3204
+ - echo 'Uploading SBOM to Dependency Track'
3205
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
3206
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
3207
+ environment:
3208
+ name: prod/api
3209
+ url: $CL_GITLAB_ENVIRONMENT_URL
3210
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
3211
+ artifacts:
3212
+ reports:
3213
+ dotenv: gitlab_environment.env
3214
+ rules:
3215
+ - when: manual
3216
+ if: $CI_COMMIT_TAG
3217
+ needs:
3218
+ - job: 'api ๐Ÿ”จ app | prod '
3219
+ artifacts: false
3220
+ - job: 'api ๐Ÿ”จ docker | prod '
3221
+ artifacts: false
3222
+ - job: 'api ๐Ÿงพ sbom | prod '
3223
+ artifacts: true
3224
+ retry: *a1
3225
+ interruptible: true
3226
+ allow_failure: true
3227
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
3228
+ stage: stop prod
3229
+ image: path/to/docker/gcloud:the-version
3230
+ variables:
3231
+ KUBERNETES_CPU_REQUEST: '0.22'
3232
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3233
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3234
+ GIT_STRATEGY: none
3235
+ script:
3236
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3237
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
3238
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3239
+ - set +e
3240
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
3241
+ - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6
3242
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags
3243
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
3244
+ - echo 'Disabling component in Dependency Track'
3245
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
3246
+ - set -e
3247
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
3248
+ environment:
3249
+ name: prod/api
3250
+ url: $CL_GITLAB_ENVIRONMENT_URL
3251
+ action: stop
3252
+ artifacts:
3253
+ reports:
3254
+ dotenv: gitlab_environment.env
3255
+ rules:
3256
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
3257
+ when: on_success
3258
+ - when: manual
3259
+ if: $CI_COMMIT_TAG
3260
+ needs: []
3261
+ retry: *a1
3262
+ interruptible: true
3263
+ allow_failure: true
3264
+ create release:
3265
+ stage: release
3266
+ image: path/to/docker/semantic-release:the-version
3267
+ script:
3268
+ - semanticRelease
3269
+ after_script:
3270
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
3271
+ rules:
3272
+ - &a2
3273
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
3274
+ when: never
3275
+ - &a3
3276
+ if: $CI_PIPELINE_SOURCE == "schedule"
3277
+ when: never
3278
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
3279
+ when: on_success
3280
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3281
+ when: manual
3282
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
3283
+ when: manual
3284
+ โš ๏ธ force create release:
3285
+ stage: release
3286
+ image: path/to/docker/semantic-release:the-version
3287
+ script:
3288
+ - semanticRelease
3289
+ after_script:
3290
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
3291
+ rules:
3292
+ - *a2
3293
+ - *a3
3294
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3295
+ when: manual
3296
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
3297
+ when: manual
3298
+ needs: []
3299
+ "
3300
+ `;