@catladder/pipeline 1.163.1 → 1.163.2

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 (72) hide show
  1. package/dist/bundles/catladder-gitlab/index.js +1 -1
  2. package/dist/constants.js +1 -1
  3. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +0 -1958
  4. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1 -1935
  5. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1 -1959
  6. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1 -2011
  7. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1 -1959
  8. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1 -1970
  9. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1 -1959
  10. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1 -1959
  11. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1 -2003
  12. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1 -1675
  13. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1 -1959
  14. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +1 -3935
  15. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1 -3458
  16. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1 -1967
  17. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1 -1787
  18. package/examples/__snapshots__/custom-build-job.test.ts.snap +1 -1487
  19. package/examples/__snapshots__/custom-deploy.test.ts.snap +1 -1721
  20. package/examples/__snapshots__/custom-envs.test.ts.snap +1 -1175
  21. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1 -1495
  22. package/examples/__snapshots__/git-submodule.test.ts.snap +1 -1962
  23. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1 -2450
  24. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1 -2462
  25. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1 -2470
  26. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +1 -4558
  27. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1 -2574
  28. package/examples/__snapshots__/local-dot-env.test.ts.snap +1 -1959
  29. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1 -2503
  30. package/examples/__snapshots__/multiline-var.test.ts.snap +1 -4488
  31. package/examples/__snapshots__/native-app.test.ts.snap +1 -3167
  32. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1 -1959
  33. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1 -1967
  34. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1479 -2003
  35. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1 -1995
  36. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1 -2105
  37. package/examples/cloud-run-memory-limit.test.ts +1 -8
  38. package/examples/cloud-run-meteor-with-worker.test.ts +2 -9
  39. package/examples/cloud-run-no-cpu-throttling.test.ts +2 -9
  40. package/examples/cloud-run-no-service.test.ts +2 -9
  41. package/examples/cloud-run-non-public.test.ts +2 -9
  42. package/examples/cloud-run-post-stop-job.test.ts +2 -9
  43. package/examples/cloud-run-service-gen2.test.ts +2 -9
  44. package/examples/cloud-run-service-increase-timout.test.ts +2 -9
  45. package/examples/cloud-run-service-with-volumes.test.ts +2 -9
  46. package/examples/cloud-run-storybook.test.ts +2 -9
  47. package/examples/cloud-run-with-ngnix.test.ts +2 -9
  48. package/examples/cloud-run-with-sql-reuse-db.test.ts +2 -9
  49. package/examples/cloud-run-with-sql.test.ts +2 -9
  50. package/examples/cloud-run-with-worker.test.ts +2 -9
  51. package/examples/custom-build-job-with-tests.test.ts +2 -9
  52. package/examples/custom-build-job.test.ts +2 -9
  53. package/examples/custom-deploy.test.ts +2 -9
  54. package/examples/custom-envs.test.ts +2 -9
  55. package/examples/custom-sbom-java.test.ts +2 -9
  56. package/examples/git-submodule.test.ts +2 -9
  57. package/examples/kubernetes-application-customization.test.ts +2 -9
  58. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +2 -9
  59. package/examples/kubernetes-with-cloud-sql.test.ts +2 -9
  60. package/examples/kubernetes-with-jobs.test.ts +2 -9
  61. package/examples/kubernetes-with-mongodb.test.ts +2 -9
  62. package/examples/local-dot-env.test.ts +2 -9
  63. package/examples/meteor-kubernetes.test.ts +2 -9
  64. package/examples/multiline-var.test.ts +2 -9
  65. package/examples/native-app.test.ts +2 -9
  66. package/examples/node-build-with-custom-image.test.ts +2 -9
  67. package/examples/node-build-with-docker-additions.test.ts +2 -9
  68. package/examples/rails-k8s-with-worker-dockerfile.test.ts +2 -2
  69. package/examples/rails-k8s-with-worker.test.ts +2 -9
  70. package/examples/wait-for-other-deploy.test.ts +2 -9
  71. package/package.json +1 -1
  72. package/scripts/generate-examples-test.ts +3 -5
@@ -1,6 +1,6 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`matches snapshot for cloud-run-memory-limit local pipeline YAML 1`] = `
3
+ exports[`matches snapshot for meteor-kubernetes local pipeline YAML 1`] = `
4
4
  "image: path/to/docker/jobs-default:the-version
5
5
  stages:
6
6
  - setup
@@ -1838,2505 +1838,3 @@ create release:
1838
1838
  needs: []
1839
1839
  "
1840
1840
  `;
1841
-
1842
- exports[`matches snapshot for meteor-kubernetes 1`] = `
1843
- {
1844
- "mainBranch": {
1845
- "image": "path/to/docker/jobs-default:the-version",
1846
- "jobs": {
1847
- "web ↩️ Rollback ⚠️ | dev ": {
1848
- "allow_failure": true,
1849
- "artifacts": {
1850
- "reports": {
1851
- "dotenv": "gitlab_environment.env",
1852
- },
1853
- },
1854
- "environment": {
1855
- "action": "access",
1856
- "name": "dev/web",
1857
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1858
- },
1859
- "image": "path/to/docker/kubernetes:the-version",
1860
- "interruptible": true,
1861
- "needs": [],
1862
- "retry": {
1863
- "max": 2,
1864
- "when": [
1865
- "runner_system_failure",
1866
- "stuck_or_timeout_failure",
1867
- ],
1868
- },
1869
- "rules": [
1870
- {
1871
- "when": "manual",
1872
- },
1873
- ],
1874
- "script": [
1875
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1876
- "export ENV_SHORT="dev"",
1877
- "export APP_DIR="app"",
1878
- "export ENV_TYPE="dev"",
1879
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1880
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1881
- "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")"",
1882
- "export HOST="web.dev.my-app.pan.panter.cloud"",
1883
- "export ROOT_URL="https://web.dev.my-app.pan.panter.cloud"",
1884
- "export HOST_INTERNAL="web.dev.my-app.pan.panter.cloud"",
1885
- "export HOST_CANONICAL="web.dev.my-app.pan.panter.cloud"",
1886
- "export ROOT_URL_INTERNAL="https://web.dev.my-app.pan.panter.cloud"",
1887
- "export KUBE_NAMESPACE="pan-my-app-dev"",
1888
- "export KUBE_APP_NAME="web"",
1889
- "export KUBE_APP_NAME_PREFIX=""",
1890
- "export MONGODB_ROOT_PASSWORD="$CL_dev_web_MONGODB_ROOT_PASSWORD"",
1891
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
1892
- "export RELEASE_NAME="pan-my-app-dev-web"",
1893
- "export HELM_EXPERIMENTAL_OCI="1"",
1894
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
1895
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1896
- "export HELM_ARGS=""",
1897
- "export COMPONENT_NAME="web"",
1898
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1899
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1900
- "kubectl config set-cluster "kube-pan-my-app-dev-web" --server="$CL_dev_web_KUBE_URL" --certificate-authority <(echo $CL_dev_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1901
- "kubectl config set-credentials "kube-pan-my-app-dev-web" --token="$CL_dev_web_KUBE_TOKEN"",
1902
- "kubectl config set-context "kube-pan-my-app-dev-web" --cluster="kube-pan-my-app-dev-web" --user="kube-pan-my-app-dev-web" --namespace="pan-my-app-dev"",
1903
- "kubectl config use-context "kube-pan-my-app-dev-web"",
1904
- "kubernetesRollback",
1905
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.dev.my-app.pan.panter.cloud" >> gitlab_environment.env",
1906
- ],
1907
- "stage": "rollback dev",
1908
- "variables": {
1909
- "GIT_STRATEGY": "none",
1910
- "KUBERNETES_CPU_REQUEST": "0.22",
1911
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1912
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1913
- },
1914
- },
1915
- "web 👮 lint": {
1916
- "cache": [
1917
- {
1918
- "key": "app-yarn",
1919
- "paths": [
1920
- "app/.yarn",
1921
- ],
1922
- "policy": "pull-push",
1923
- },
1924
- {
1925
- "key": "app-node-modules",
1926
- "paths": [
1927
- "app/node_modules",
1928
- ],
1929
- "policy": "pull-push",
1930
- },
1931
- ],
1932
- "image": "path/to/docker/jobs-default:the-version",
1933
- "interruptible": true,
1934
- "needs": [],
1935
- "retry": {
1936
- "max": 2,
1937
- "when": [
1938
- "runner_system_failure",
1939
- "stuck_or_timeout_failure",
1940
- ],
1941
- },
1942
- "script": [
1943
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1944
- "export APP_PATH="app"",
1945
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1946
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1947
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1948
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1949
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1950
- "cd app",
1951
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1952
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1953
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1954
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1955
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
1956
- "yarn install --immutable",
1957
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
1958
- "yarn lint",
1959
- ],
1960
- "stage": "test",
1961
- "variables": {
1962
- "KUBERNETES_CPU_REQUEST": "0.45",
1963
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
1964
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1965
- },
1966
- },
1967
- "web 🔨 app | dev ": {
1968
- "artifacts": {
1969
- "expire_in": "1 day",
1970
- "paths": [
1971
- "app/__build_info.json",
1972
- "app/dist",
1973
- ],
1974
- "reports": {
1975
- "junit": undefined,
1976
- },
1977
- "when": "always",
1978
- },
1979
- "cache": [
1980
- {
1981
- "key": "app-yarn",
1982
- "paths": [
1983
- "app/.yarn",
1984
- ],
1985
- "policy": "pull-push",
1986
- },
1987
- {
1988
- "key": "app-node-modules",
1989
- "paths": [
1990
- "app/node_modules",
1991
- ],
1992
- "policy": "pull-push",
1993
- },
1994
- {
1995
- "key": "webmeteor-build-cache",
1996
- "paths": [
1997
- "app/.meteor/local/resolver-result-cache.json",
1998
- "app/.meteor/local/plugin-cache",
1999
- "app/.meteor/local/isopacks",
2000
- "app/.meteor/local/bundler-cache/scanner",
2001
- ],
2002
- "policy": "pull-push",
2003
- },
2004
- ],
2005
- "image": "path/to/docker/jobs-meteor:the-version",
2006
- "interruptible": true,
2007
- "needs": [],
2008
- "retry": {
2009
- "max": 2,
2010
- "when": [
2011
- "runner_system_failure",
2012
- "stuck_or_timeout_failure",
2013
- ],
2014
- },
2015
- "script": [
2016
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2017
- "export METEOR_DISABLE_OPTIMISTIC_CACHING="1"",
2018
- "export ENV_SHORT="dev"",
2019
- "export APP_DIR="app"",
2020
- "export ENV_TYPE="dev"",
2021
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2022
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2023
- "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")"",
2024
- "export HOST="web.dev.my-app.pan.panter.cloud"",
2025
- "export ROOT_URL="https://web.dev.my-app.pan.panter.cloud"",
2026
- "export HOST_INTERNAL="web.dev.my-app.pan.panter.cloud"",
2027
- "export HOST_CANONICAL="web.dev.my-app.pan.panter.cloud"",
2028
- "export ROOT_URL_INTERNAL="https://web.dev.my-app.pan.panter.cloud"",
2029
- "export KUBE_NAMESPACE="pan-my-app-dev"",
2030
- "export KUBE_APP_NAME="web"",
2031
- "export KUBE_APP_NAME_PREFIX=""",
2032
- "export MONGODB_ROOT_PASSWORD="$CL_dev_web_MONGODB_ROOT_PASSWORD"",
2033
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
2034
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2035
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
2036
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2037
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2038
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2039
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2040
- "cd app",
2041
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2042
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2043
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2044
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2045
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2046
- "yarn install --immutable",
2047
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2048
- "echo "add healthcheck package"",
2049
- "meteor add panter:healthroute --allow-superuser",
2050
- "meteor add qualia:prod-shell --allow-superuser",
2051
- "TOOL_NODE_FLAGS="--max_old_space_size=3584 --min_semi_space_size=8 --max_semi_space_size=256 --optimize_for_size" meteor build ./dist --architecture os.linux.x86_64 --allow-superuser --server-only --directory",
2052
- "cp ./__build_info.json ./dist/bundle/programs/server",
2053
- ],
2054
- "stage": "build",
2055
- "variables": {
2056
- "KUBERNETES_CPU_REQUEST": "0.45",
2057
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2058
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2059
- },
2060
- },
2061
- "web 🔨 docker | dev ": {
2062
- "image": "path/to/docker/docker-build:the-version",
2063
- "interruptible": true,
2064
- "needs": [
2065
- "web 🔨 app | dev ",
2066
- ],
2067
- "retry": {
2068
- "max": 2,
2069
- "when": [
2070
- "runner_system_failure",
2071
- "stuck_or_timeout_failure",
2072
- ],
2073
- },
2074
- "script": [
2075
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2076
- "export APP_DIR="app"",
2077
- "export DOCKER_BUILD_CONTEXT="."",
2078
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
2079
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
2080
- "export DOCKER_IMAGE_NAME="dev/web"",
2081
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2082
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2083
- "export METEOR_INSTALL_SCRIPTS=""",
2084
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2085
- "ensureMeteorDockerfile",
2086
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
2087
- "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2088
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
2089
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
2090
- "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",
2091
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
2092
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
2093
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2094
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2095
- "docker push $DOCKER_CACHE_IMAGE",
2096
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
2097
- ],
2098
- "services": [
2099
- {
2100
- "command": [
2101
- "--tls=false",
2102
- ],
2103
- "name": "docker:24.0.6-dind",
2104
- },
2105
- ],
2106
- "stage": "build",
2107
- "variables": {
2108
- "DOCKER_BUILDKIT": "1",
2109
- "DOCKER_DRIVER": "overlay2",
2110
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
2111
- "DOCKER_TLS_CERTDIR": "",
2112
- "KUBERNETES_CPU_REQUEST": "0.45",
2113
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
2114
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2115
- },
2116
- },
2117
- "web 🚀 Deploy | dev ": {
2118
- "allow_failure": false,
2119
- "artifacts": {
2120
- "reports": {
2121
- "dotenv": "gitlab_environment.env",
2122
- },
2123
- },
2124
- "environment": {
2125
- "auto_stop_in": "4 weeks",
2126
- "name": "dev/web",
2127
- "on_stop": "web 🛑 Stop ⚠️ | dev ",
2128
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
2129
- },
2130
- "image": "path/to/docker/kubernetes:the-version",
2131
- "interruptible": true,
2132
- "needs": [
2133
- {
2134
- "artifacts": false,
2135
- "job": "web 👮 lint",
2136
- },
2137
- {
2138
- "artifacts": false,
2139
- "job": "web 🔨 app | dev ",
2140
- },
2141
- {
2142
- "artifacts": false,
2143
- "job": "web 🔨 docker | dev ",
2144
- },
2145
- {
2146
- "artifacts": false,
2147
- "job": "web 🧪 test",
2148
- },
2149
- {
2150
- "artifacts": true,
2151
- "job": "web 🧾 sbom | dev ",
2152
- },
2153
- {
2154
- "artifacts": false,
2155
- "job": "web 🛡 audit",
2156
- },
2157
- ],
2158
- "retry": {
2159
- "max": 2,
2160
- "when": [
2161
- "runner_system_failure",
2162
- "stuck_or_timeout_failure",
2163
- ],
2164
- },
2165
- "rules": [
2166
- {
2167
- "when": "on_success",
2168
- },
2169
- ],
2170
- "script": [
2171
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2172
- "export ENV_SHORT="dev"",
2173
- "export APP_DIR="app"",
2174
- "export ENV_TYPE="dev"",
2175
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2176
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2177
- "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")"",
2178
- "export HOST="web.dev.my-app.pan.panter.cloud"",
2179
- "export ROOT_URL="https://web.dev.my-app.pan.panter.cloud"",
2180
- "export HOST_INTERNAL="web.dev.my-app.pan.panter.cloud"",
2181
- "export HOST_CANONICAL="web.dev.my-app.pan.panter.cloud"",
2182
- "export ROOT_URL_INTERNAL="https://web.dev.my-app.pan.panter.cloud"",
2183
- "export KUBE_NAMESPACE="pan-my-app-dev"",
2184
- "export KUBE_APP_NAME="web"",
2185
- "export KUBE_APP_NAME_PREFIX=""",
2186
- "export MONGODB_ROOT_PASSWORD="$CL_dev_web_MONGODB_ROOT_PASSWORD"",
2187
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
2188
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
2189
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
2190
- "export DOCKER_IMAGE_NAME="dev/web"",
2191
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2192
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2193
- "export RELEASE_NAME="pan-my-app-dev-web"",
2194
- "export HELM_EXPERIMENTAL_OCI="1"",
2195
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
2196
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2197
- "export HELM_ARGS=""",
2198
- "export COMPONENT_NAME="web"",
2199
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2200
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2201
- "kubectl config set-cluster "kube-pan-my-app-dev-web" --server="$CL_dev_web_KUBE_URL" --certificate-authority <(echo $CL_dev_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2202
- "kubectl config set-credentials "kube-pan-my-app-dev-web" --token="$CL_dev_web_KUBE_TOKEN"",
2203
- "kubectl config set-context "kube-pan-my-app-dev-web" --cluster="kube-pan-my-app-dev-web" --user="kube-pan-my-app-dev-web" --namespace="pan-my-app-dev"",
2204
- "kubectl config use-context "kube-pan-my-app-dev-web"",
2205
- "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
2206
- "cat > __all_values.yml <<EOF
2207
- env:
2208
- secret:
2209
- MONGODB_ROOT_PASSWORD: |-
2210
- $(printf %s "$CL_dev_web_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
2211
- MONGO_URL: |-
2212
- mongodb://root:$CL_dev_web_MONGODB_ROOT_PASSWORD@web-mongodb.pan-my-app-dev.svc.cluster.local:27017/app?authSource=admin
2213
- public:
2214
- ENV_SHORT: |-
2215
- dev
2216
- APP_DIR: |-
2217
- app
2218
- ENV_TYPE: |-
2219
- dev
2220
- BUILD_INFO_BUILD_ID: |-
2221
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2222
- BUILD_INFO_BUILD_TIME: |-
2223
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2224
- BUILD_INFO_CURRENT_VERSION: |-
2225
- $(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/^/ /')
2226
- HOST: |-
2227
- web.dev.my-app.pan.panter.cloud
2228
- ROOT_URL: |-
2229
- https://web.dev.my-app.pan.panter.cloud
2230
- HOST_INTERNAL: |-
2231
- web.dev.my-app.pan.panter.cloud
2232
- HOST_CANONICAL: |-
2233
- web.dev.my-app.pan.panter.cloud
2234
- ROOT_URL_INTERNAL: |-
2235
- https://web.dev.my-app.pan.panter.cloud
2236
- KUBE_NAMESPACE: |-
2237
- pan-my-app-dev
2238
- KUBE_APP_NAME: |-
2239
- web
2240
- KUBE_APP_NAME_PREFIX: ""
2241
- _ALL_ENV_VAR_KEYS: |-
2242
- ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD"]
2243
- application:
2244
- host: |-
2245
- web.dev.my-app.pan.panter.cloud
2246
- command: |-
2247
- node main.js
2248
- livenessProbe:
2249
- httpGet:
2250
- path: |-
2251
- __health
2252
- readinessProbe:
2253
- httpGet:
2254
- path: |-
2255
- __health
2256
- startupProbe:
2257
- httpGet:
2258
- path: |-
2259
- __health
2260
- worker:
2261
- enabled: true
2262
- mongodb:
2263
- enabled: true
2264
- auth:
2265
- enabled: true
2266
- rootPassword: |-
2267
- $CL_dev_web_MONGODB_ROOT_PASSWORD
2268
- replicaSetKey: |-
2269
- $CL_dev_web_MONGODB_REPLICASET_KEY
2270
- persistence:
2271
- storageClass: |-
2272
- standard-rwo
2273
- backup:
2274
- enabled: false
2275
- hostToBackup: |-
2276
- web-mongodb.pan-my-app-dev.svc.cluster.local:27017
2277
- pvcToBackup: |-
2278
- web-mongodb
2279
- image: |-
2280
- mrelite/kubectlmongoshell:v1.0
2281
- schedule: |-
2282
- 0 4 * * *
2283
- volumeSnapshotClass: |-
2284
- snapshotclass
2285
- architecture: |-
2286
- standalone
2287
-
2288
- EOF
2289
- ",
2290
- "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2291
- "kubernetesCreateSecret",
2292
- "kubernetesDeploy",
2293
- "echo 'Uploading SBOM to Dependency Track'",
2294
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-my-app/web" "https://web.dev.my-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2295
- "echo deployment successful 😻",
2296
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.dev.my-app.pan.panter.cloud" >> gitlab_environment.env",
2297
- ],
2298
- "stage": "deploy dev",
2299
- "variables": {
2300
- "KUBERNETES_CPU_REQUEST": "0.22",
2301
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2302
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2303
- },
2304
- },
2305
- "web 🛑 Stop ⚠️ | dev ": {
2306
- "allow_failure": true,
2307
- "artifacts": {
2308
- "reports": {
2309
- "dotenv": "gitlab_environment.env",
2310
- },
2311
- },
2312
- "environment": {
2313
- "action": "stop",
2314
- "name": "dev/web",
2315
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
2316
- },
2317
- "image": "path/to/docker/kubernetes:the-version",
2318
- "interruptible": true,
2319
- "needs": [],
2320
- "retry": {
2321
- "max": 2,
2322
- "when": [
2323
- "runner_system_failure",
2324
- "stuck_or_timeout_failure",
2325
- ],
2326
- },
2327
- "rules": [
2328
- {
2329
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2330
- "when": "on_success",
2331
- },
2332
- {
2333
- "when": "manual",
2334
- },
2335
- ],
2336
- "script": [
2337
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2338
- "export ENV_SHORT="dev"",
2339
- "export APP_DIR="app"",
2340
- "export ENV_TYPE="dev"",
2341
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2342
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2343
- "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")"",
2344
- "export HOST="web.dev.my-app.pan.panter.cloud"",
2345
- "export ROOT_URL="https://web.dev.my-app.pan.panter.cloud"",
2346
- "export HOST_INTERNAL="web.dev.my-app.pan.panter.cloud"",
2347
- "export HOST_CANONICAL="web.dev.my-app.pan.panter.cloud"",
2348
- "export ROOT_URL_INTERNAL="https://web.dev.my-app.pan.panter.cloud"",
2349
- "export KUBE_NAMESPACE="pan-my-app-dev"",
2350
- "export KUBE_APP_NAME="web"",
2351
- "export KUBE_APP_NAME_PREFIX=""",
2352
- "export MONGODB_ROOT_PASSWORD="$CL_dev_web_MONGODB_ROOT_PASSWORD"",
2353
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
2354
- "export RELEASE_NAME="pan-my-app-dev-web"",
2355
- "export HELM_EXPERIMENTAL_OCI="1"",
2356
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
2357
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2358
- "export HELM_ARGS=""",
2359
- "export COMPONENT_NAME="web"",
2360
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2361
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2362
- "kubectl config set-cluster "kube-pan-my-app-dev-web" --server="$CL_dev_web_KUBE_URL" --certificate-authority <(echo $CL_dev_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2363
- "kubectl config set-credentials "kube-pan-my-app-dev-web" --token="$CL_dev_web_KUBE_TOKEN"",
2364
- "kubectl config set-context "kube-pan-my-app-dev-web" --cluster="kube-pan-my-app-dev-web" --user="kube-pan-my-app-dev-web" --namespace="pan-my-app-dev"",
2365
- "kubectl config use-context "kube-pan-my-app-dev-web"",
2366
- "kubernetesDelete",
2367
- "echo 'Disabling component in Dependency Track'",
2368
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-my-app/web" "https://web.dev.my-app.pan.panter.cloud" || true",
2369
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.dev.my-app.pan.panter.cloud" >> gitlab_environment.env",
2370
- ],
2371
- "stage": "stop dev",
2372
- "variables": {
2373
- "GIT_STRATEGY": "none",
2374
- "KUBERNETES_CPU_REQUEST": "0.22",
2375
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2376
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2377
- },
2378
- },
2379
- "web 🛡 audit": {
2380
- "allow_failure": true,
2381
- "image": "path/to/docker/jobs-default:the-version",
2382
- "interruptible": true,
2383
- "needs": [],
2384
- "retry": {
2385
- "max": 2,
2386
- "when": [
2387
- "runner_system_failure",
2388
- "stuck_or_timeout_failure",
2389
- ],
2390
- },
2391
- "script": [
2392
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2393
- "export APP_PATH="app"",
2394
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2395
- "cd app",
2396
- "yarn npm audit --environment production",
2397
- ],
2398
- "stage": "test",
2399
- "variables": {
2400
- "KUBERNETES_CPU_REQUEST": "0.45",
2401
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2402
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2403
- },
2404
- },
2405
- "web 🧪 test": {
2406
- "cache": [
2407
- {
2408
- "key": "app-yarn",
2409
- "paths": [
2410
- "app/.yarn",
2411
- ],
2412
- "policy": "pull-push",
2413
- },
2414
- {
2415
- "key": "app-node-modules",
2416
- "paths": [
2417
- "app/node_modules",
2418
- ],
2419
- "policy": "pull-push",
2420
- },
2421
- ],
2422
- "image": "path/to/docker/jobs-testing-chrome:the-version",
2423
- "interruptible": true,
2424
- "needs": [],
2425
- "retry": {
2426
- "max": 2,
2427
- "when": [
2428
- "runner_system_failure",
2429
- "stuck_or_timeout_failure",
2430
- ],
2431
- },
2432
- "script": [
2433
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2434
- "export APP_PATH="app"",
2435
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2436
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2437
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2438
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2439
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2440
- "cd app",
2441
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2442
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2443
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2444
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2445
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2446
- "yarn install --immutable",
2447
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2448
- "yarn test",
2449
- ],
2450
- "stage": "test",
2451
- "variables": {
2452
- "KUBERNETES_CPU_REQUEST": "0.45",
2453
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2454
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2455
- },
2456
- },
2457
- "web 🧾 sbom | dev ": {
2458
- "allow_failure": true,
2459
- "artifacts": {
2460
- "paths": [
2461
- "__sbom.json",
2462
- ],
2463
- },
2464
- "image": "aquasec/trivy:0.38.3",
2465
- "interruptible": true,
2466
- "needs": [],
2467
- "retry": {
2468
- "max": 2,
2469
- "when": [
2470
- "runner_system_failure",
2471
- "stuck_or_timeout_failure",
2472
- ],
2473
- },
2474
- "script": [
2475
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2476
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2477
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
2478
- ],
2479
- "stage": "build",
2480
- "variables": {},
2481
- },
2482
- },
2483
- "stages": [
2484
- "setup",
2485
- "setup dev",
2486
- "setup review",
2487
- "setup stage",
2488
- "setup prod",
2489
- "test",
2490
- "test dev",
2491
- "test review",
2492
- "test stage",
2493
- "test prod",
2494
- "build",
2495
- "build dev",
2496
- "build review",
2497
- "build stage",
2498
- "build prod",
2499
- "deploy",
2500
- "deploy dev",
2501
- "deploy review",
2502
- "deploy stage",
2503
- "deploy prod",
2504
- "verify",
2505
- "verify dev",
2506
- "verify review",
2507
- "verify stage",
2508
- "verify prod",
2509
- "rollback",
2510
- "rollback dev",
2511
- "rollback review",
2512
- "rollback stage",
2513
- "rollback prod",
2514
- "stop",
2515
- "stop dev",
2516
- "stop review",
2517
- "stop stage",
2518
- "stop prod",
2519
- ],
2520
- "variables": {
2521
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
2522
- "CACHE_COMPRESSION_LEVEL": "fast",
2523
- "FF_USE_FASTZIP": "true",
2524
- "GIT_DEPTH": "1",
2525
- "TRANSFER_METER_FREQUENCY": "5s",
2526
- },
2527
- "workflow": {
2528
- "rules": [
2529
- {
2530
- "if": "$CI_COMMIT_TAG",
2531
- },
2532
- {
2533
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
2534
- "when": "never",
2535
- },
2536
- {
2537
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
2538
- "when": "never",
2539
- },
2540
- {
2541
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
2542
- },
2543
- {
2544
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
2545
- },
2546
- {
2547
- "if": "$CI_MERGE_REQUEST_ID",
2548
- },
2549
- ],
2550
- },
2551
- },
2552
- "mr": {
2553
- "image": "path/to/docker/jobs-default:the-version",
2554
- "jobs": {
2555
- "web ↩️ Rollback ⚠️ | review ": {
2556
- "allow_failure": true,
2557
- "artifacts": {
2558
- "reports": {
2559
- "dotenv": "gitlab_environment.env",
2560
- },
2561
- },
2562
- "environment": {
2563
- "action": "access",
2564
- "name": "review/$CI_COMMIT_REF_NAME/web",
2565
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
2566
- },
2567
- "image": "path/to/docker/kubernetes:the-version",
2568
- "interruptible": true,
2569
- "needs": [],
2570
- "retry": {
2571
- "max": 2,
2572
- "when": [
2573
- "runner_system_failure",
2574
- "stuck_or_timeout_failure",
2575
- ],
2576
- },
2577
- "rules": [
2578
- {
2579
- "when": "manual",
2580
- },
2581
- ],
2582
- "script": [
2583
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2584
- "export ENV_SHORT="review"",
2585
- "export APP_DIR="app"",
2586
- "export ENV_TYPE="review"",
2587
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2588
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2589
- "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")"",
2590
- "export HOST="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2591
- "export ROOT_URL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2592
- "export HOST_INTERNAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2593
- "export HOST_CANONICAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2594
- "export ROOT_URL_INTERNAL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2595
- "export KUBE_NAMESPACE="pan-my-app-review"",
2596
- "export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web"",
2597
- "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
2598
- "export MONGODB_ROOT_PASSWORD="$CL_review_web_MONGODB_ROOT_PASSWORD"",
2599
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
2600
- "export RELEASE_NAME="pan-my-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"; })-web"",
2601
- "export HELM_EXPERIMENTAL_OCI="1"",
2602
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
2603
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2604
- "export HELM_ARGS=""",
2605
- "export COMPONENT_NAME="web"",
2606
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2607
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2608
- "kubectl config set-cluster "kube-pan-my-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"; })-web" --server="$CL_review_web_KUBE_URL" --certificate-authority <(echo $CL_review_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2609
- "kubectl config set-credentials "kube-pan-my-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"; })-web" --token="$CL_review_web_KUBE_TOKEN"",
2610
- "kubectl config set-context "kube-pan-my-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"; })-web" --cluster="kube-pan-my-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"; })-web" --user="kube-pan-my-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"; })-web" --namespace="pan-my-app-review"",
2611
- "kubectl config use-context "kube-pan-my-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"; })-web"",
2612
- "kubernetesRollback",
2613
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" >> gitlab_environment.env",
2614
- ],
2615
- "stage": "rollback review",
2616
- "variables": {
2617
- "GIT_STRATEGY": "none",
2618
- "KUBERNETES_CPU_REQUEST": "0.22",
2619
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2620
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2621
- },
2622
- },
2623
- "web 👮 lint": {
2624
- "cache": [
2625
- {
2626
- "key": "app-yarn",
2627
- "paths": [
2628
- "app/.yarn",
2629
- ],
2630
- "policy": "pull-push",
2631
- },
2632
- {
2633
- "key": "app-node-modules",
2634
- "paths": [
2635
- "app/node_modules",
2636
- ],
2637
- "policy": "pull-push",
2638
- },
2639
- ],
2640
- "image": "path/to/docker/jobs-default:the-version",
2641
- "interruptible": true,
2642
- "needs": [],
2643
- "retry": {
2644
- "max": 2,
2645
- "when": [
2646
- "runner_system_failure",
2647
- "stuck_or_timeout_failure",
2648
- ],
2649
- },
2650
- "script": [
2651
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2652
- "export APP_PATH="app"",
2653
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2654
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2655
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2656
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2657
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2658
- "cd app",
2659
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2660
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2661
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2662
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2663
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2664
- "yarn install --immutable",
2665
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2666
- "yarn lint",
2667
- ],
2668
- "stage": "test",
2669
- "variables": {
2670
- "KUBERNETES_CPU_REQUEST": "0.45",
2671
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2672
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2673
- },
2674
- },
2675
- "web 🔨 app | review ": {
2676
- "artifacts": {
2677
- "expire_in": "1 day",
2678
- "paths": [
2679
- "app/__build_info.json",
2680
- "app/dist",
2681
- ],
2682
- "reports": {
2683
- "junit": undefined,
2684
- },
2685
- "when": "always",
2686
- },
2687
- "cache": [
2688
- {
2689
- "key": "app-yarn",
2690
- "paths": [
2691
- "app/.yarn",
2692
- ],
2693
- "policy": "pull-push",
2694
- },
2695
- {
2696
- "key": "app-node-modules",
2697
- "paths": [
2698
- "app/node_modules",
2699
- ],
2700
- "policy": "pull-push",
2701
- },
2702
- {
2703
- "key": "webmeteor-build-cache",
2704
- "paths": [
2705
- "app/.meteor/local/resolver-result-cache.json",
2706
- "app/.meteor/local/plugin-cache",
2707
- "app/.meteor/local/isopacks",
2708
- "app/.meteor/local/bundler-cache/scanner",
2709
- ],
2710
- "policy": "pull-push",
2711
- },
2712
- ],
2713
- "image": "path/to/docker/jobs-meteor:the-version",
2714
- "interruptible": true,
2715
- "needs": [],
2716
- "retry": {
2717
- "max": 2,
2718
- "when": [
2719
- "runner_system_failure",
2720
- "stuck_or_timeout_failure",
2721
- ],
2722
- },
2723
- "script": [
2724
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2725
- "export METEOR_DISABLE_OPTIMISTIC_CACHING="1"",
2726
- "export ENV_SHORT="review"",
2727
- "export APP_DIR="app"",
2728
- "export ENV_TYPE="review"",
2729
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2730
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2731
- "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")"",
2732
- "export HOST="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2733
- "export ROOT_URL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2734
- "export HOST_INTERNAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2735
- "export HOST_CANONICAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2736
- "export ROOT_URL_INTERNAL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2737
- "export KUBE_NAMESPACE="pan-my-app-review"",
2738
- "export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web"",
2739
- "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
2740
- "export MONGODB_ROOT_PASSWORD="$CL_review_web_MONGODB_ROOT_PASSWORD"",
2741
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
2742
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2743
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
2744
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2745
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2746
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2747
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2748
- "cd app",
2749
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2750
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2751
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2752
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2753
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2754
- "yarn install --immutable",
2755
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2756
- "echo "add healthcheck package"",
2757
- "meteor add panter:healthroute --allow-superuser",
2758
- "meteor add qualia:prod-shell --allow-superuser",
2759
- "TOOL_NODE_FLAGS="--max_old_space_size=3584 --min_semi_space_size=8 --max_semi_space_size=256 --optimize_for_size" meteor build ./dist --architecture os.linux.x86_64 --allow-superuser --server-only --directory",
2760
- "cp ./__build_info.json ./dist/bundle/programs/server",
2761
- ],
2762
- "stage": "build",
2763
- "variables": {
2764
- "KUBERNETES_CPU_REQUEST": "0.45",
2765
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2766
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2767
- },
2768
- },
2769
- "web 🔨 docker | review ": {
2770
- "image": "path/to/docker/docker-build:the-version",
2771
- "interruptible": true,
2772
- "needs": [
2773
- "web 🔨 app | review ",
2774
- ],
2775
- "retry": {
2776
- "max": 2,
2777
- "when": [
2778
- "runner_system_failure",
2779
- "stuck_or_timeout_failure",
2780
- ],
2781
- },
2782
- "script": [
2783
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2784
- "export APP_DIR="app"",
2785
- "export DOCKER_BUILD_CONTEXT="."",
2786
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
2787
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
2788
- "export DOCKER_IMAGE_NAME="review/web"",
2789
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2790
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2791
- "export METEOR_INSTALL_SCRIPTS=""",
2792
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2793
- "ensureMeteorDockerfile",
2794
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
2795
- "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2796
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
2797
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
2798
- "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",
2799
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
2800
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
2801
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2802
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2803
- "docker push $DOCKER_CACHE_IMAGE",
2804
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
2805
- ],
2806
- "services": [
2807
- {
2808
- "command": [
2809
- "--tls=false",
2810
- ],
2811
- "name": "docker:24.0.6-dind",
2812
- },
2813
- ],
2814
- "stage": "build",
2815
- "variables": {
2816
- "DOCKER_BUILDKIT": "1",
2817
- "DOCKER_DRIVER": "overlay2",
2818
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
2819
- "DOCKER_TLS_CERTDIR": "",
2820
- "KUBERNETES_CPU_REQUEST": "0.45",
2821
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
2822
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2823
- },
2824
- },
2825
- "web 🚀 Deploy | review ": {
2826
- "allow_failure": false,
2827
- "artifacts": {
2828
- "reports": {
2829
- "dotenv": "gitlab_environment.env",
2830
- },
2831
- },
2832
- "environment": {
2833
- "auto_stop_in": "1 week",
2834
- "name": "review/$CI_COMMIT_REF_NAME/web",
2835
- "on_stop": "web 🛑 Stop ⚠️ | review ",
2836
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
2837
- },
2838
- "image": "path/to/docker/kubernetes:the-version",
2839
- "interruptible": true,
2840
- "needs": [
2841
- {
2842
- "artifacts": false,
2843
- "job": "web 👮 lint",
2844
- },
2845
- {
2846
- "artifacts": false,
2847
- "job": "web 🔨 app | review ",
2848
- },
2849
- {
2850
- "artifacts": false,
2851
- "job": "web 🔨 docker | review ",
2852
- },
2853
- {
2854
- "artifacts": false,
2855
- "job": "web 🧪 test",
2856
- },
2857
- {
2858
- "artifacts": true,
2859
- "job": "web 🧾 sbom | review ",
2860
- },
2861
- {
2862
- "artifacts": false,
2863
- "job": "web 🛡 audit",
2864
- },
2865
- ],
2866
- "retry": {
2867
- "max": 2,
2868
- "when": [
2869
- "runner_system_failure",
2870
- "stuck_or_timeout_failure",
2871
- ],
2872
- },
2873
- "rules": [
2874
- {
2875
- "when": "on_success",
2876
- },
2877
- ],
2878
- "script": [
2879
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2880
- "export ENV_SHORT="review"",
2881
- "export APP_DIR="app"",
2882
- "export ENV_TYPE="review"",
2883
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2884
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2885
- "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")"",
2886
- "export HOST="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2887
- "export ROOT_URL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2888
- "export HOST_INTERNAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2889
- "export HOST_CANONICAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2890
- "export ROOT_URL_INTERNAL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
2891
- "export KUBE_NAMESPACE="pan-my-app-review"",
2892
- "export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web"",
2893
- "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
2894
- "export MONGODB_ROOT_PASSWORD="$CL_review_web_MONGODB_ROOT_PASSWORD"",
2895
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
2896
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
2897
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
2898
- "export DOCKER_IMAGE_NAME="review/web"",
2899
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2900
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2901
- "export RELEASE_NAME="pan-my-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"; })-web"",
2902
- "export HELM_EXPERIMENTAL_OCI="1"",
2903
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
2904
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2905
- "export HELM_ARGS=""",
2906
- "export COMPONENT_NAME="web"",
2907
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2908
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2909
- "kubectl config set-cluster "kube-pan-my-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"; })-web" --server="$CL_review_web_KUBE_URL" --certificate-authority <(echo $CL_review_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2910
- "kubectl config set-credentials "kube-pan-my-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"; })-web" --token="$CL_review_web_KUBE_TOKEN"",
2911
- "kubectl config set-context "kube-pan-my-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"; })-web" --cluster="kube-pan-my-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"; })-web" --user="kube-pan-my-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"; })-web" --namespace="pan-my-app-review"",
2912
- "kubectl config use-context "kube-pan-my-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"; })-web"",
2913
- "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
2914
- "cat > __all_values.yml <<EOF
2915
- env:
2916
- secret:
2917
- MONGODB_ROOT_PASSWORD: |-
2918
- $(printf %s "$CL_review_web_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
2919
- MONGO_URL: |-
2920
- mongodb://root:$CL_review_web_MONGODB_ROOT_PASSWORD@$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-mongodb.pan-my-app-review.svc.cluster.local:27017/app?authSource=admin
2921
- public:
2922
- ENV_SHORT: |-
2923
- review
2924
- APP_DIR: |-
2925
- app
2926
- ENV_TYPE: |-
2927
- review
2928
- BUILD_INFO_BUILD_ID: |-
2929
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2930
- BUILD_INFO_BUILD_TIME: |-
2931
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2932
- BUILD_INFO_CURRENT_VERSION: |-
2933
- $(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/^/ /')
2934
- HOST: |-
2935
- $(printf %s "web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" | sed 's/^/ /')
2936
- ROOT_URL: |-
2937
- $(printf %s "https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" | sed 's/^/ /')
2938
- HOST_INTERNAL: |-
2939
- $(printf %s "web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" | sed 's/^/ /')
2940
- HOST_CANONICAL: |-
2941
- $(printf %s "web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" | sed 's/^/ /')
2942
- ROOT_URL_INTERNAL: |-
2943
- $(printf %s "https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" | sed 's/^/ /')
2944
- KUBE_NAMESPACE: |-
2945
- pan-my-app-review
2946
- KUBE_APP_NAME: |-
2947
- $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | sed 's/^/ /')
2948
- KUBE_APP_NAME_PREFIX: |-
2949
- $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed 's/^/ /')
2950
- _ALL_ENV_VAR_KEYS: |-
2951
- ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD"]
2952
- application:
2953
- host: |-
2954
- $(printf %s "web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" | sed 's/^/ /')
2955
- command: |-
2956
- node main.js
2957
- livenessProbe:
2958
- httpGet:
2959
- path: |-
2960
- __health
2961
- readinessProbe:
2962
- httpGet:
2963
- path: |-
2964
- __health
2965
- startupProbe:
2966
- httpGet:
2967
- path: |-
2968
- __health
2969
- worker:
2970
- enabled: true
2971
- mongodb:
2972
- enabled: true
2973
- auth:
2974
- enabled: true
2975
- rootPassword: |-
2976
- $CL_review_web_MONGODB_ROOT_PASSWORD
2977
- replicaSetKey: |-
2978
- $CL_review_web_MONGODB_REPLICASET_KEY
2979
- persistence:
2980
- storageClass: |-
2981
- standard-rwo
2982
- backup:
2983
- enabled: false
2984
- hostToBackup: |-
2985
- $([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-mongodb.pan-my-app-review.svc.cluster.local:27017
2986
- pvcToBackup: |-
2987
- $([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-mongodb
2988
- image: |-
2989
- mrelite/kubectlmongoshell:v1.0
2990
- schedule: |-
2991
- 0 4 * * *
2992
- volumeSnapshotClass: |-
2993
- snapshotclass
2994
- architecture: |-
2995
- standalone
2996
-
2997
- EOF
2998
- ",
2999
- "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
3000
- "kubernetesCreateSecret",
3001
- "kubernetesDeploy",
3002
- "echo 'Uploading SBOM to Dependency Track'",
3003
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-my-app/web" "https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" "__sbom.json" vex.json || true",
3004
- "echo deployment successful 😻",
3005
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" >> gitlab_environment.env",
3006
- ],
3007
- "stage": "deploy review",
3008
- "variables": {
3009
- "KUBERNETES_CPU_REQUEST": "0.22",
3010
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3011
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3012
- },
3013
- },
3014
- "web 🛑 Stop ⚠️ | review ": {
3015
- "allow_failure": true,
3016
- "artifacts": {
3017
- "reports": {
3018
- "dotenv": "gitlab_environment.env",
3019
- },
3020
- },
3021
- "environment": {
3022
- "action": "stop",
3023
- "name": "review/$CI_COMMIT_REF_NAME/web",
3024
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
3025
- },
3026
- "image": "path/to/docker/kubernetes:the-version",
3027
- "interruptible": true,
3028
- "needs": [],
3029
- "retry": {
3030
- "max": 2,
3031
- "when": [
3032
- "runner_system_failure",
3033
- "stuck_or_timeout_failure",
3034
- ],
3035
- },
3036
- "rules": [
3037
- {
3038
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3039
- "when": "on_success",
3040
- },
3041
- {
3042
- "when": "manual",
3043
- },
3044
- ],
3045
- "script": [
3046
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3047
- "export ENV_SHORT="review"",
3048
- "export APP_DIR="app"",
3049
- "export ENV_TYPE="review"",
3050
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3051
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3052
- "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")"",
3053
- "export HOST="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
3054
- "export ROOT_URL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
3055
- "export HOST_INTERNAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
3056
- "export HOST_CANONICAL="web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
3057
- "export ROOT_URL_INTERNAL="https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud"",
3058
- "export KUBE_NAMESPACE="pan-my-app-review"",
3059
- "export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web"",
3060
- "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
3061
- "export MONGODB_ROOT_PASSWORD="$CL_review_web_MONGODB_ROOT_PASSWORD"",
3062
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
3063
- "export RELEASE_NAME="pan-my-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"; })-web"",
3064
- "export HELM_EXPERIMENTAL_OCI="1"",
3065
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
3066
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3067
- "export HELM_ARGS=""",
3068
- "export COMPONENT_NAME="web"",
3069
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3070
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3071
- "kubectl config set-cluster "kube-pan-my-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"; })-web" --server="$CL_review_web_KUBE_URL" --certificate-authority <(echo $CL_review_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3072
- "kubectl config set-credentials "kube-pan-my-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"; })-web" --token="$CL_review_web_KUBE_TOKEN"",
3073
- "kubectl config set-context "kube-pan-my-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"; })-web" --cluster="kube-pan-my-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"; })-web" --user="kube-pan-my-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"; })-web" --namespace="pan-my-app-review"",
3074
- "kubectl config use-context "kube-pan-my-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"; })-web"",
3075
- "kubernetesDelete",
3076
- "echo 'Disabling component in Dependency Track'",
3077
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-my-app/web" "https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" || true",
3078
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.my-app.pan.panter.cloud" >> gitlab_environment.env",
3079
- ],
3080
- "stage": "stop review",
3081
- "variables": {
3082
- "GIT_STRATEGY": "none",
3083
- "KUBERNETES_CPU_REQUEST": "0.22",
3084
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3085
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3086
- },
3087
- },
3088
- "web 🛡 audit": {
3089
- "allow_failure": true,
3090
- "image": "path/to/docker/jobs-default:the-version",
3091
- "interruptible": true,
3092
- "needs": [],
3093
- "retry": {
3094
- "max": 2,
3095
- "when": [
3096
- "runner_system_failure",
3097
- "stuck_or_timeout_failure",
3098
- ],
3099
- },
3100
- "script": [
3101
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3102
- "export APP_PATH="app"",
3103
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3104
- "cd app",
3105
- "yarn npm audit --environment production",
3106
- ],
3107
- "stage": "test",
3108
- "variables": {
3109
- "KUBERNETES_CPU_REQUEST": "0.45",
3110
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3111
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3112
- },
3113
- },
3114
- "web 🧪 test": {
3115
- "cache": [
3116
- {
3117
- "key": "app-yarn",
3118
- "paths": [
3119
- "app/.yarn",
3120
- ],
3121
- "policy": "pull-push",
3122
- },
3123
- {
3124
- "key": "app-node-modules",
3125
- "paths": [
3126
- "app/node_modules",
3127
- ],
3128
- "policy": "pull-push",
3129
- },
3130
- ],
3131
- "image": "path/to/docker/jobs-testing-chrome:the-version",
3132
- "interruptible": true,
3133
- "needs": [],
3134
- "retry": {
3135
- "max": 2,
3136
- "when": [
3137
- "runner_system_failure",
3138
- "stuck_or_timeout_failure",
3139
- ],
3140
- },
3141
- "script": [
3142
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3143
- "export APP_PATH="app"",
3144
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3145
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3146
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3147
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3148
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3149
- "cd app",
3150
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3151
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3152
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3153
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3154
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3155
- "yarn install --immutable",
3156
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3157
- "yarn test",
3158
- ],
3159
- "stage": "test",
3160
- "variables": {
3161
- "KUBERNETES_CPU_REQUEST": "0.45",
3162
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3163
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3164
- },
3165
- },
3166
- "web 🧾 sbom | review ": {
3167
- "allow_failure": true,
3168
- "artifacts": {
3169
- "paths": [
3170
- "__sbom.json",
3171
- ],
3172
- },
3173
- "image": "aquasec/trivy:0.38.3",
3174
- "interruptible": true,
3175
- "needs": [],
3176
- "retry": {
3177
- "max": 2,
3178
- "when": [
3179
- "runner_system_failure",
3180
- "stuck_or_timeout_failure",
3181
- ],
3182
- },
3183
- "script": [
3184
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3185
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3186
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
3187
- ],
3188
- "stage": "build",
3189
- "variables": {},
3190
- },
3191
- },
3192
- "stages": [
3193
- "setup",
3194
- "setup dev",
3195
- "setup review",
3196
- "setup stage",
3197
- "setup prod",
3198
- "test",
3199
- "test dev",
3200
- "test review",
3201
- "test stage",
3202
- "test prod",
3203
- "build",
3204
- "build dev",
3205
- "build review",
3206
- "build stage",
3207
- "build prod",
3208
- "deploy",
3209
- "deploy dev",
3210
- "deploy review",
3211
- "deploy stage",
3212
- "deploy prod",
3213
- "verify",
3214
- "verify dev",
3215
- "verify review",
3216
- "verify stage",
3217
- "verify prod",
3218
- "rollback",
3219
- "rollback dev",
3220
- "rollback review",
3221
- "rollback stage",
3222
- "rollback prod",
3223
- "stop",
3224
- "stop dev",
3225
- "stop review",
3226
- "stop stage",
3227
- "stop prod",
3228
- ],
3229
- "variables": {
3230
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
3231
- "CACHE_COMPRESSION_LEVEL": "fast",
3232
- "FF_USE_FASTZIP": "true",
3233
- "GIT_DEPTH": "1",
3234
- "TRANSFER_METER_FREQUENCY": "5s",
3235
- },
3236
- "workflow": {
3237
- "rules": [
3238
- {
3239
- "if": "$CI_COMMIT_TAG",
3240
- },
3241
- {
3242
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
3243
- "when": "never",
3244
- },
3245
- {
3246
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
3247
- "when": "never",
3248
- },
3249
- {
3250
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
3251
- },
3252
- {
3253
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
3254
- },
3255
- {
3256
- "if": "$CI_MERGE_REQUEST_ID",
3257
- },
3258
- ],
3259
- },
3260
- },
3261
- "taggedRelease": {
3262
- "image": "path/to/docker/jobs-default:the-version",
3263
- "jobs": {
3264
- "web ↩️ Rollback ⚠️ | prod ": {
3265
- "allow_failure": true,
3266
- "artifacts": {
3267
- "reports": {
3268
- "dotenv": "gitlab_environment.env",
3269
- },
3270
- },
3271
- "environment": {
3272
- "action": "access",
3273
- "name": "prod/web",
3274
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
3275
- },
3276
- "image": "path/to/docker/kubernetes:the-version",
3277
- "interruptible": true,
3278
- "needs": [],
3279
- "retry": {
3280
- "max": 2,
3281
- "when": [
3282
- "runner_system_failure",
3283
- "stuck_or_timeout_failure",
3284
- ],
3285
- },
3286
- "rules": [
3287
- {
3288
- "when": "manual",
3289
- },
3290
- ],
3291
- "script": [
3292
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3293
- "export ENV_SHORT="prod"",
3294
- "export APP_DIR="app"",
3295
- "export ENV_TYPE="prod"",
3296
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3297
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3298
- "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")"",
3299
- "export HOST="www.example.com"",
3300
- "export ROOT_URL="https://www.example.com"",
3301
- "export HOST_INTERNAL="web.prod.my-app.pan.panter.cloud"",
3302
- "export HOST_CANONICAL="web.prod.my-app.pan.panter.cloud"",
3303
- "export ROOT_URL_INTERNAL="https://web.prod.my-app.pan.panter.cloud"",
3304
- "export KUBE_NAMESPACE="pan-my-app-prod"",
3305
- "export KUBE_APP_NAME="web"",
3306
- "export KUBE_APP_NAME_PREFIX=""",
3307
- "export MONGODB_ROOT_PASSWORD="$CL_prod_web_MONGODB_ROOT_PASSWORD"",
3308
- "export MONGODB_REPLICASET_KEY="$CL_prod_web_MONGODB_REPLICASET_KEY"",
3309
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3310
- "export RELEASE_NAME="pan-my-app-prod-web"",
3311
- "export HELM_EXPERIMENTAL_OCI="1"",
3312
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
3313
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3314
- "export HELM_ARGS=""",
3315
- "export COMPONENT_NAME="web"",
3316
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3317
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3318
- "kubectl config set-cluster "kube-pan-my-app-prod-web" --server="$CL_prod_web_KUBE_URL" --certificate-authority <(echo $CL_prod_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3319
- "kubectl config set-credentials "kube-pan-my-app-prod-web" --token="$CL_prod_web_KUBE_TOKEN"",
3320
- "kubectl config set-context "kube-pan-my-app-prod-web" --cluster="kube-pan-my-app-prod-web" --user="kube-pan-my-app-prod-web" --namespace="pan-my-app-prod"",
3321
- "kubectl config use-context "kube-pan-my-app-prod-web"",
3322
- "kubernetesRollback",
3323
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://www.example.com" >> gitlab_environment.env",
3324
- ],
3325
- "stage": "rollback prod",
3326
- "variables": {
3327
- "GIT_STRATEGY": "none",
3328
- "KUBERNETES_CPU_REQUEST": "0.22",
3329
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3330
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3331
- },
3332
- },
3333
- "web ↩️ Rollback ⚠️ | stage ": {
3334
- "allow_failure": true,
3335
- "artifacts": {
3336
- "reports": {
3337
- "dotenv": "gitlab_environment.env",
3338
- },
3339
- },
3340
- "environment": {
3341
- "action": "access",
3342
- "name": "stage/web",
3343
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
3344
- },
3345
- "image": "path/to/docker/kubernetes:the-version",
3346
- "interruptible": true,
3347
- "needs": [],
3348
- "retry": {
3349
- "max": 2,
3350
- "when": [
3351
- "runner_system_failure",
3352
- "stuck_or_timeout_failure",
3353
- ],
3354
- },
3355
- "rules": [
3356
- {
3357
- "when": "manual",
3358
- },
3359
- ],
3360
- "script": [
3361
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3362
- "export ENV_SHORT="stage"",
3363
- "export APP_DIR="app"",
3364
- "export ENV_TYPE="stage"",
3365
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3366
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3367
- "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")"",
3368
- "export HOST="web.stage.my-app.pan.panter.cloud"",
3369
- "export ROOT_URL="https://web.stage.my-app.pan.panter.cloud"",
3370
- "export HOST_INTERNAL="web.stage.my-app.pan.panter.cloud"",
3371
- "export HOST_CANONICAL="web.stage.my-app.pan.panter.cloud"",
3372
- "export ROOT_URL_INTERNAL="https://web.stage.my-app.pan.panter.cloud"",
3373
- "export KUBE_NAMESPACE="pan-my-app-stage"",
3374
- "export KUBE_APP_NAME="web"",
3375
- "export KUBE_APP_NAME_PREFIX=""",
3376
- "export MONGODB_ROOT_PASSWORD="$CL_stage_web_MONGODB_ROOT_PASSWORD"",
3377
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
3378
- "export RELEASE_NAME="pan-my-app-stage-web"",
3379
- "export HELM_EXPERIMENTAL_OCI="1"",
3380
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
3381
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3382
- "export HELM_ARGS=""",
3383
- "export COMPONENT_NAME="web"",
3384
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3385
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3386
- "kubectl config set-cluster "kube-pan-my-app-stage-web" --server="$CL_stage_web_KUBE_URL" --certificate-authority <(echo $CL_stage_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3387
- "kubectl config set-credentials "kube-pan-my-app-stage-web" --token="$CL_stage_web_KUBE_TOKEN"",
3388
- "kubectl config set-context "kube-pan-my-app-stage-web" --cluster="kube-pan-my-app-stage-web" --user="kube-pan-my-app-stage-web" --namespace="pan-my-app-stage"",
3389
- "kubectl config use-context "kube-pan-my-app-stage-web"",
3390
- "kubernetesRollback",
3391
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.stage.my-app.pan.panter.cloud" >> gitlab_environment.env",
3392
- ],
3393
- "stage": "rollback stage",
3394
- "variables": {
3395
- "GIT_STRATEGY": "none",
3396
- "KUBERNETES_CPU_REQUEST": "0.22",
3397
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3398
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3399
- },
3400
- },
3401
- "web 🔨 app | prod ": {
3402
- "artifacts": {
3403
- "expire_in": "1 day",
3404
- "paths": [
3405
- "app/__build_info.json",
3406
- "app/dist",
3407
- ],
3408
- "reports": {
3409
- "junit": undefined,
3410
- },
3411
- "when": "always",
3412
- },
3413
- "cache": [
3414
- {
3415
- "key": "app-yarn",
3416
- "paths": [
3417
- "app/.yarn",
3418
- ],
3419
- "policy": "pull-push",
3420
- },
3421
- {
3422
- "key": "app-node-modules",
3423
- "paths": [
3424
- "app/node_modules",
3425
- ],
3426
- "policy": "pull-push",
3427
- },
3428
- {
3429
- "key": "webmeteor-build-cache",
3430
- "paths": [
3431
- "app/.meteor/local/resolver-result-cache.json",
3432
- "app/.meteor/local/plugin-cache",
3433
- "app/.meteor/local/isopacks",
3434
- "app/.meteor/local/bundler-cache/scanner",
3435
- ],
3436
- "policy": "pull-push",
3437
- },
3438
- ],
3439
- "image": "path/to/docker/jobs-meteor:the-version",
3440
- "interruptible": true,
3441
- "needs": [],
3442
- "retry": {
3443
- "max": 2,
3444
- "when": [
3445
- "runner_system_failure",
3446
- "stuck_or_timeout_failure",
3447
- ],
3448
- },
3449
- "script": [
3450
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3451
- "export METEOR_DISABLE_OPTIMISTIC_CACHING="1"",
3452
- "export ENV_SHORT="prod"",
3453
- "export APP_DIR="app"",
3454
- "export ENV_TYPE="prod"",
3455
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3456
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3457
- "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")"",
3458
- "export HOST="www.example.com"",
3459
- "export ROOT_URL="https://www.example.com"",
3460
- "export HOST_INTERNAL="web.prod.my-app.pan.panter.cloud"",
3461
- "export HOST_CANONICAL="web.prod.my-app.pan.panter.cloud"",
3462
- "export ROOT_URL_INTERNAL="https://web.prod.my-app.pan.panter.cloud"",
3463
- "export KUBE_NAMESPACE="pan-my-app-prod"",
3464
- "export KUBE_APP_NAME="web"",
3465
- "export KUBE_APP_NAME_PREFIX=""",
3466
- "export MONGODB_ROOT_PASSWORD="$CL_prod_web_MONGODB_ROOT_PASSWORD"",
3467
- "export MONGODB_REPLICASET_KEY="$CL_prod_web_MONGODB_REPLICASET_KEY"",
3468
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3469
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3470
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
3471
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3472
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3473
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3474
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3475
- "cd app",
3476
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3477
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3478
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3479
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3480
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3481
- "yarn install --immutable",
3482
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3483
- "echo "add healthcheck package"",
3484
- "meteor add panter:healthroute --allow-superuser",
3485
- "meteor add qualia:prod-shell --allow-superuser",
3486
- "TOOL_NODE_FLAGS="--max_old_space_size=3584 --min_semi_space_size=8 --max_semi_space_size=256 --optimize_for_size" meteor build ./dist --architecture os.linux.x86_64 --allow-superuser --server-only --directory",
3487
- "cp ./__build_info.json ./dist/bundle/programs/server",
3488
- ],
3489
- "stage": "build",
3490
- "variables": {
3491
- "KUBERNETES_CPU_REQUEST": "0.45",
3492
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3493
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3494
- },
3495
- },
3496
- "web 🔨 app | stage ": {
3497
- "artifacts": {
3498
- "expire_in": "1 day",
3499
- "paths": [
3500
- "app/__build_info.json",
3501
- "app/dist",
3502
- ],
3503
- "reports": {
3504
- "junit": undefined,
3505
- },
3506
- "when": "always",
3507
- },
3508
- "cache": [
3509
- {
3510
- "key": "app-yarn",
3511
- "paths": [
3512
- "app/.yarn",
3513
- ],
3514
- "policy": "pull-push",
3515
- },
3516
- {
3517
- "key": "app-node-modules",
3518
- "paths": [
3519
- "app/node_modules",
3520
- ],
3521
- "policy": "pull-push",
3522
- },
3523
- {
3524
- "key": "webmeteor-build-cache",
3525
- "paths": [
3526
- "app/.meteor/local/resolver-result-cache.json",
3527
- "app/.meteor/local/plugin-cache",
3528
- "app/.meteor/local/isopacks",
3529
- "app/.meteor/local/bundler-cache/scanner",
3530
- ],
3531
- "policy": "pull-push",
3532
- },
3533
- ],
3534
- "image": "path/to/docker/jobs-meteor:the-version",
3535
- "interruptible": true,
3536
- "needs": [],
3537
- "retry": {
3538
- "max": 2,
3539
- "when": [
3540
- "runner_system_failure",
3541
- "stuck_or_timeout_failure",
3542
- ],
3543
- },
3544
- "script": [
3545
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3546
- "export METEOR_DISABLE_OPTIMISTIC_CACHING="1"",
3547
- "export ENV_SHORT="stage"",
3548
- "export APP_DIR="app"",
3549
- "export ENV_TYPE="stage"",
3550
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3551
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3552
- "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")"",
3553
- "export HOST="web.stage.my-app.pan.panter.cloud"",
3554
- "export ROOT_URL="https://web.stage.my-app.pan.panter.cloud"",
3555
- "export HOST_INTERNAL="web.stage.my-app.pan.panter.cloud"",
3556
- "export HOST_CANONICAL="web.stage.my-app.pan.panter.cloud"",
3557
- "export ROOT_URL_INTERNAL="https://web.stage.my-app.pan.panter.cloud"",
3558
- "export KUBE_NAMESPACE="pan-my-app-stage"",
3559
- "export KUBE_APP_NAME="web"",
3560
- "export KUBE_APP_NAME_PREFIX=""",
3561
- "export MONGODB_ROOT_PASSWORD="$CL_stage_web_MONGODB_ROOT_PASSWORD"",
3562
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
3563
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3564
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
3565
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3566
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3567
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3568
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3569
- "cd app",
3570
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3571
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3572
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3573
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3574
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3575
- "yarn install --immutable",
3576
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3577
- "echo "add healthcheck package"",
3578
- "meteor add panter:healthroute --allow-superuser",
3579
- "meteor add qualia:prod-shell --allow-superuser",
3580
- "TOOL_NODE_FLAGS="--max_old_space_size=3584 --min_semi_space_size=8 --max_semi_space_size=256 --optimize_for_size" meteor build ./dist --architecture os.linux.x86_64 --allow-superuser --server-only --directory",
3581
- "cp ./__build_info.json ./dist/bundle/programs/server",
3582
- ],
3583
- "stage": "build",
3584
- "variables": {
3585
- "KUBERNETES_CPU_REQUEST": "0.45",
3586
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3587
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3588
- },
3589
- },
3590
- "web 🔨 docker | prod ": {
3591
- "image": "path/to/docker/docker-build:the-version",
3592
- "interruptible": true,
3593
- "needs": [
3594
- "web 🔨 app | prod ",
3595
- ],
3596
- "retry": {
3597
- "max": 2,
3598
- "when": [
3599
- "runner_system_failure",
3600
- "stuck_or_timeout_failure",
3601
- ],
3602
- },
3603
- "script": [
3604
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3605
- "export APP_DIR="app"",
3606
- "export DOCKER_BUILD_CONTEXT="."",
3607
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
3608
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
3609
- "export DOCKER_IMAGE_NAME="prod/web"",
3610
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
3611
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3612
- "export METEOR_INSTALL_SCRIPTS=""",
3613
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3614
- "ensureMeteorDockerfile",
3615
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
3616
- "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
3617
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
3618
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
3619
- "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",
3620
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
3621
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
3622
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
3623
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
3624
- "docker push $DOCKER_CACHE_IMAGE",
3625
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
3626
- ],
3627
- "services": [
3628
- {
3629
- "command": [
3630
- "--tls=false",
3631
- ],
3632
- "name": "docker:24.0.6-dind",
3633
- },
3634
- ],
3635
- "stage": "build",
3636
- "variables": {
3637
- "DOCKER_BUILDKIT": "1",
3638
- "DOCKER_DRIVER": "overlay2",
3639
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
3640
- "DOCKER_TLS_CERTDIR": "",
3641
- "KUBERNETES_CPU_REQUEST": "0.45",
3642
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
3643
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3644
- },
3645
- },
3646
- "web 🔨 docker | stage ": {
3647
- "image": "path/to/docker/docker-build:the-version",
3648
- "interruptible": true,
3649
- "needs": [
3650
- "web 🔨 app | stage ",
3651
- ],
3652
- "retry": {
3653
- "max": 2,
3654
- "when": [
3655
- "runner_system_failure",
3656
- "stuck_or_timeout_failure",
3657
- ],
3658
- },
3659
- "script": [
3660
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3661
- "export APP_DIR="app"",
3662
- "export DOCKER_BUILD_CONTEXT="."",
3663
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
3664
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
3665
- "export DOCKER_IMAGE_NAME="stage/web"",
3666
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
3667
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3668
- "export METEOR_INSTALL_SCRIPTS=""",
3669
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3670
- "ensureMeteorDockerfile",
3671
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
3672
- "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
3673
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
3674
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
3675
- "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",
3676
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
3677
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
3678
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
3679
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
3680
- "docker push $DOCKER_CACHE_IMAGE",
3681
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
3682
- ],
3683
- "services": [
3684
- {
3685
- "command": [
3686
- "--tls=false",
3687
- ],
3688
- "name": "docker:24.0.6-dind",
3689
- },
3690
- ],
3691
- "stage": "build",
3692
- "variables": {
3693
- "DOCKER_BUILDKIT": "1",
3694
- "DOCKER_DRIVER": "overlay2",
3695
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
3696
- "DOCKER_TLS_CERTDIR": "",
3697
- "KUBERNETES_CPU_REQUEST": "0.45",
3698
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
3699
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3700
- },
3701
- },
3702
- "web 🚀 Deploy | prod ": {
3703
- "allow_failure": true,
3704
- "artifacts": {
3705
- "reports": {
3706
- "dotenv": "gitlab_environment.env",
3707
- },
3708
- },
3709
- "environment": {
3710
- "auto_stop_in": undefined,
3711
- "name": "prod/web",
3712
- "on_stop": "web 🛑 Stop ⚠️ | prod ",
3713
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
3714
- },
3715
- "image": "path/to/docker/kubernetes:the-version",
3716
- "interruptible": true,
3717
- "needs": [
3718
- {
3719
- "artifacts": false,
3720
- "job": "web 🔨 app | prod ",
3721
- },
3722
- {
3723
- "artifacts": false,
3724
- "job": "web 🔨 docker | prod ",
3725
- },
3726
- {
3727
- "artifacts": true,
3728
- "job": "web 🧾 sbom | prod ",
3729
- },
3730
- ],
3731
- "retry": {
3732
- "max": 2,
3733
- "when": [
3734
- "runner_system_failure",
3735
- "stuck_or_timeout_failure",
3736
- ],
3737
- },
3738
- "rules": [
3739
- {
3740
- "when": "manual",
3741
- },
3742
- ],
3743
- "script": [
3744
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3745
- "export ENV_SHORT="prod"",
3746
- "export APP_DIR="app"",
3747
- "export ENV_TYPE="prod"",
3748
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3749
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3750
- "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")"",
3751
- "export HOST="www.example.com"",
3752
- "export ROOT_URL="https://www.example.com"",
3753
- "export HOST_INTERNAL="web.prod.my-app.pan.panter.cloud"",
3754
- "export HOST_CANONICAL="web.prod.my-app.pan.panter.cloud"",
3755
- "export ROOT_URL_INTERNAL="https://web.prod.my-app.pan.panter.cloud"",
3756
- "export KUBE_NAMESPACE="pan-my-app-prod"",
3757
- "export KUBE_APP_NAME="web"",
3758
- "export KUBE_APP_NAME_PREFIX=""",
3759
- "export MONGODB_ROOT_PASSWORD="$CL_prod_web_MONGODB_ROOT_PASSWORD"",
3760
- "export MONGODB_REPLICASET_KEY="$CL_prod_web_MONGODB_REPLICASET_KEY"",
3761
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3762
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
3763
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
3764
- "export DOCKER_IMAGE_NAME="prod/web"",
3765
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
3766
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3767
- "export RELEASE_NAME="pan-my-app-prod-web"",
3768
- "export HELM_EXPERIMENTAL_OCI="1"",
3769
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
3770
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3771
- "export HELM_ARGS=""",
3772
- "export COMPONENT_NAME="web"",
3773
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3774
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3775
- "kubectl config set-cluster "kube-pan-my-app-prod-web" --server="$CL_prod_web_KUBE_URL" --certificate-authority <(echo $CL_prod_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3776
- "kubectl config set-credentials "kube-pan-my-app-prod-web" --token="$CL_prod_web_KUBE_TOKEN"",
3777
- "kubectl config set-context "kube-pan-my-app-prod-web" --cluster="kube-pan-my-app-prod-web" --user="kube-pan-my-app-prod-web" --namespace="pan-my-app-prod"",
3778
- "kubectl config use-context "kube-pan-my-app-prod-web"",
3779
- "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
3780
- "cat > __all_values.yml <<EOF
3781
- env:
3782
- secret:
3783
- MONGODB_ROOT_PASSWORD: |-
3784
- $(printf %s "$CL_prod_web_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
3785
- MONGODB_REPLICASET_KEY: |-
3786
- $(printf %s "$CL_prod_web_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
3787
- MONGO_URL: |-
3788
- mongodb://root:$CL_prod_web_MONGODB_ROOT_PASSWORD@web-mongodb-0.web-mongodb-headless.pan-my-app-prod.svc.cluster.local:27017,web-mongodb-1.web-mongodb-headless.pan-my-app-prod.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
3789
- MONGO_OPLOG_URL: |-
3790
- mongodb://root:$CL_prod_web_MONGODB_ROOT_PASSWORD@web-mongodb-0.web-mongodb-headless.pan-my-app-prod.svc.cluster.local:27017,web-mongodb-1.web-mongodb-headless.pan-my-app-prod.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
3791
- public:
3792
- ENV_SHORT: |-
3793
- prod
3794
- APP_DIR: |-
3795
- app
3796
- ENV_TYPE: |-
3797
- prod
3798
- BUILD_INFO_BUILD_ID: |-
3799
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3800
- BUILD_INFO_BUILD_TIME: |-
3801
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3802
- BUILD_INFO_CURRENT_VERSION: |-
3803
- $(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/^/ /')
3804
- HOST: |-
3805
- www.example.com
3806
- ROOT_URL: |-
3807
- https://www.example.com
3808
- HOST_INTERNAL: |-
3809
- web.prod.my-app.pan.panter.cloud
3810
- HOST_CANONICAL: |-
3811
- web.prod.my-app.pan.panter.cloud
3812
- ROOT_URL_INTERNAL: |-
3813
- https://web.prod.my-app.pan.panter.cloud
3814
- KUBE_NAMESPACE: |-
3815
- pan-my-app-prod
3816
- KUBE_APP_NAME: |-
3817
- web
3818
- KUBE_APP_NAME_PREFIX: ""
3819
- _ALL_ENV_VAR_KEYS: |-
3820
- ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
3821
- application:
3822
- host: |-
3823
- www.example.com
3824
- command: |-
3825
- node main.js
3826
- livenessProbe:
3827
- httpGet:
3828
- path: |-
3829
- __health
3830
- readinessProbe:
3831
- httpGet:
3832
- path: |-
3833
- __health
3834
- startupProbe:
3835
- httpGet:
3836
- path: |-
3837
- __health
3838
- worker:
3839
- enabled: true
3840
- redirects:
3841
- - host: |-
3842
- example.com
3843
- mongodb:
3844
- enabled: true
3845
- auth:
3846
- enabled: true
3847
- rootPassword: |-
3848
- $CL_prod_web_MONGODB_ROOT_PASSWORD
3849
- replicaSetKey: |-
3850
- $CL_prod_web_MONGODB_REPLICASET_KEY
3851
- persistence:
3852
- storageClass: |-
3853
- premium-rwo
3854
- size: |-
3855
- 50Gi
3856
- backup:
3857
- enabled: true
3858
- hostToBackup: |-
3859
- web-mongodb-1.web-mongodb-headless.pan-my-app-prod.svc.cluster.local:27017
3860
- pvcToBackup: |-
3861
- datadir-web-mongodb-1
3862
- image: |-
3863
- mrelite/kubectlmongoshell:v1.0
3864
- schedule: |-
3865
- 0 4 * * *
3866
- volumeSnapshotClass: |-
3867
- snapshotclass
3868
- architecture: |-
3869
- replicaset
3870
- replicaCount: 2
3871
- resources:
3872
- limits:
3873
- memory: |-
3874
- 8Gi
3875
- requests:
3876
- memory: |-
3877
- 8Gi
3878
-
3879
- EOF
3880
- ",
3881
- "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
3882
- "kubernetesCreateSecret",
3883
- "kubernetesDeploy",
3884
- "echo 'Uploading SBOM to Dependency Track'",
3885
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-my-app/web" "https://www.example.com" "__sbom.json" vex.json || true",
3886
- "echo deployment successful 😻",
3887
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://www.example.com" >> gitlab_environment.env",
3888
- ],
3889
- "stage": "deploy prod",
3890
- "variables": {
3891
- "KUBERNETES_CPU_REQUEST": "0.22",
3892
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3893
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3894
- },
3895
- },
3896
- "web 🚀 Deploy | stage ": {
3897
- "allow_failure": false,
3898
- "artifacts": {
3899
- "reports": {
3900
- "dotenv": "gitlab_environment.env",
3901
- },
3902
- },
3903
- "environment": {
3904
- "auto_stop_in": undefined,
3905
- "name": "stage/web",
3906
- "on_stop": "web 🛑 Stop ⚠️ | stage ",
3907
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
3908
- },
3909
- "image": "path/to/docker/kubernetes:the-version",
3910
- "interruptible": true,
3911
- "needs": [
3912
- {
3913
- "artifacts": false,
3914
- "job": "web 🔨 app | stage ",
3915
- },
3916
- {
3917
- "artifacts": false,
3918
- "job": "web 🔨 docker | stage ",
3919
- },
3920
- {
3921
- "artifacts": true,
3922
- "job": "web 🧾 sbom | stage ",
3923
- },
3924
- ],
3925
- "retry": {
3926
- "max": 2,
3927
- "when": [
3928
- "runner_system_failure",
3929
- "stuck_or_timeout_failure",
3930
- ],
3931
- },
3932
- "rules": [
3933
- {
3934
- "when": "on_success",
3935
- },
3936
- ],
3937
- "script": [
3938
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3939
- "export ENV_SHORT="stage"",
3940
- "export APP_DIR="app"",
3941
- "export ENV_TYPE="stage"",
3942
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3943
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3944
- "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")"",
3945
- "export HOST="web.stage.my-app.pan.panter.cloud"",
3946
- "export ROOT_URL="https://web.stage.my-app.pan.panter.cloud"",
3947
- "export HOST_INTERNAL="web.stage.my-app.pan.panter.cloud"",
3948
- "export HOST_CANONICAL="web.stage.my-app.pan.panter.cloud"",
3949
- "export ROOT_URL_INTERNAL="https://web.stage.my-app.pan.panter.cloud"",
3950
- "export KUBE_NAMESPACE="pan-my-app-stage"",
3951
- "export KUBE_APP_NAME="web"",
3952
- "export KUBE_APP_NAME_PREFIX=""",
3953
- "export MONGODB_ROOT_PASSWORD="$CL_stage_web_MONGODB_ROOT_PASSWORD"",
3954
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
3955
- "export DOCKER_REGISTRY="$CI_REGISTRY"",
3956
- "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/web"",
3957
- "export DOCKER_IMAGE_NAME="stage/web"",
3958
- "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
3959
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3960
- "export RELEASE_NAME="pan-my-app-stage-web"",
3961
- "export HELM_EXPERIMENTAL_OCI="1"",
3962
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
3963
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3964
- "export HELM_ARGS=""",
3965
- "export COMPONENT_NAME="web"",
3966
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3967
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3968
- "kubectl config set-cluster "kube-pan-my-app-stage-web" --server="$CL_stage_web_KUBE_URL" --certificate-authority <(echo $CL_stage_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
3969
- "kubectl config set-credentials "kube-pan-my-app-stage-web" --token="$CL_stage_web_KUBE_TOKEN"",
3970
- "kubectl config set-context "kube-pan-my-app-stage-web" --cluster="kube-pan-my-app-stage-web" --user="kube-pan-my-app-stage-web" --namespace="pan-my-app-stage"",
3971
- "kubectl config use-context "kube-pan-my-app-stage-web"",
3972
- "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
3973
- "cat > __all_values.yml <<EOF
3974
- env:
3975
- secret:
3976
- MONGODB_ROOT_PASSWORD: |-
3977
- $(printf %s "$CL_stage_web_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
3978
- MONGO_URL: |-
3979
- mongodb://root:$CL_stage_web_MONGODB_ROOT_PASSWORD@web-mongodb.pan-my-app-stage.svc.cluster.local:27017/app?authSource=admin
3980
- public:
3981
- ENV_SHORT: |-
3982
- stage
3983
- APP_DIR: |-
3984
- app
3985
- ENV_TYPE: |-
3986
- stage
3987
- BUILD_INFO_BUILD_ID: |-
3988
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3989
- BUILD_INFO_BUILD_TIME: |-
3990
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3991
- BUILD_INFO_CURRENT_VERSION: |-
3992
- $(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/^/ /')
3993
- HOST: |-
3994
- web.stage.my-app.pan.panter.cloud
3995
- ROOT_URL: |-
3996
- https://web.stage.my-app.pan.panter.cloud
3997
- HOST_INTERNAL: |-
3998
- web.stage.my-app.pan.panter.cloud
3999
- HOST_CANONICAL: |-
4000
- web.stage.my-app.pan.panter.cloud
4001
- ROOT_URL_INTERNAL: |-
4002
- https://web.stage.my-app.pan.panter.cloud
4003
- KUBE_NAMESPACE: |-
4004
- pan-my-app-stage
4005
- KUBE_APP_NAME: |-
4006
- web
4007
- KUBE_APP_NAME_PREFIX: ""
4008
- _ALL_ENV_VAR_KEYS: |-
4009
- ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD"]
4010
- application:
4011
- host: |-
4012
- web.stage.my-app.pan.panter.cloud
4013
- command: |-
4014
- node main.js
4015
- livenessProbe:
4016
- httpGet:
4017
- path: |-
4018
- __health
4019
- readinessProbe:
4020
- httpGet:
4021
- path: |-
4022
- __health
4023
- startupProbe:
4024
- httpGet:
4025
- path: |-
4026
- __health
4027
- worker:
4028
- enabled: true
4029
- mongodb:
4030
- enabled: true
4031
- auth:
4032
- enabled: true
4033
- rootPassword: |-
4034
- $CL_stage_web_MONGODB_ROOT_PASSWORD
4035
- replicaSetKey: |-
4036
- $CL_stage_web_MONGODB_REPLICASET_KEY
4037
- persistence:
4038
- storageClass: |-
4039
- standard-rwo
4040
- backup:
4041
- enabled: true
4042
- hostToBackup: |-
4043
- web-mongodb.pan-my-app-stage.svc.cluster.local:27017
4044
- pvcToBackup: |-
4045
- web-mongodb
4046
- image: |-
4047
- mrelite/kubectlmongoshell:v1.0
4048
- schedule: |-
4049
- 0 4 * * *
4050
- volumeSnapshotClass: |-
4051
- snapshotclass
4052
- architecture: |-
4053
- standalone
4054
-
4055
- EOF
4056
- ",
4057
- "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
4058
- "kubernetesCreateSecret",
4059
- "kubernetesDeploy",
4060
- "echo 'Uploading SBOM to Dependency Track'",
4061
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-my-app/web" "https://web.stage.my-app.pan.panter.cloud" "__sbom.json" vex.json || true",
4062
- "echo deployment successful 😻",
4063
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.stage.my-app.pan.panter.cloud" >> gitlab_environment.env",
4064
- ],
4065
- "stage": "deploy stage",
4066
- "variables": {
4067
- "KUBERNETES_CPU_REQUEST": "0.22",
4068
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
4069
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
4070
- },
4071
- },
4072
- "web 🛑 Stop ⚠️ | prod ": {
4073
- "allow_failure": true,
4074
- "artifacts": {
4075
- "reports": {
4076
- "dotenv": "gitlab_environment.env",
4077
- },
4078
- },
4079
- "environment": {
4080
- "action": "stop",
4081
- "name": "prod/web",
4082
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
4083
- },
4084
- "image": "path/to/docker/kubernetes:the-version",
4085
- "interruptible": true,
4086
- "needs": [],
4087
- "retry": {
4088
- "max": 2,
4089
- "when": [
4090
- "runner_system_failure",
4091
- "stuck_or_timeout_failure",
4092
- ],
4093
- },
4094
- "rules": [
4095
- {
4096
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
4097
- "when": "on_success",
4098
- },
4099
- {
4100
- "when": "manual",
4101
- },
4102
- ],
4103
- "script": [
4104
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4105
- "export ENV_SHORT="prod"",
4106
- "export APP_DIR="app"",
4107
- "export ENV_TYPE="prod"",
4108
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4109
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4110
- "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")"",
4111
- "export HOST="www.example.com"",
4112
- "export ROOT_URL="https://www.example.com"",
4113
- "export HOST_INTERNAL="web.prod.my-app.pan.panter.cloud"",
4114
- "export HOST_CANONICAL="web.prod.my-app.pan.panter.cloud"",
4115
- "export ROOT_URL_INTERNAL="https://web.prod.my-app.pan.panter.cloud"",
4116
- "export KUBE_NAMESPACE="pan-my-app-prod"",
4117
- "export KUBE_APP_NAME="web"",
4118
- "export KUBE_APP_NAME_PREFIX=""",
4119
- "export MONGODB_ROOT_PASSWORD="$CL_prod_web_MONGODB_ROOT_PASSWORD"",
4120
- "export MONGODB_REPLICASET_KEY="$CL_prod_web_MONGODB_REPLICASET_KEY"",
4121
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
4122
- "export RELEASE_NAME="pan-my-app-prod-web"",
4123
- "export HELM_EXPERIMENTAL_OCI="1"",
4124
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
4125
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
4126
- "export HELM_ARGS=""",
4127
- "export COMPONENT_NAME="web"",
4128
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4129
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4130
- "kubectl config set-cluster "kube-pan-my-app-prod-web" --server="$CL_prod_web_KUBE_URL" --certificate-authority <(echo $CL_prod_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
4131
- "kubectl config set-credentials "kube-pan-my-app-prod-web" --token="$CL_prod_web_KUBE_TOKEN"",
4132
- "kubectl config set-context "kube-pan-my-app-prod-web" --cluster="kube-pan-my-app-prod-web" --user="kube-pan-my-app-prod-web" --namespace="pan-my-app-prod"",
4133
- "kubectl config use-context "kube-pan-my-app-prod-web"",
4134
- "kubernetesDelete",
4135
- "echo 'Disabling component in Dependency Track'",
4136
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-my-app/web" "https://www.example.com" || true",
4137
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://www.example.com" >> gitlab_environment.env",
4138
- ],
4139
- "stage": "stop prod",
4140
- "variables": {
4141
- "GIT_STRATEGY": "none",
4142
- "KUBERNETES_CPU_REQUEST": "0.22",
4143
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
4144
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
4145
- },
4146
- },
4147
- "web 🛑 Stop ⚠️ | stage ": {
4148
- "allow_failure": true,
4149
- "artifacts": {
4150
- "reports": {
4151
- "dotenv": "gitlab_environment.env",
4152
- },
4153
- },
4154
- "environment": {
4155
- "action": "stop",
4156
- "name": "stage/web",
4157
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
4158
- },
4159
- "image": "path/to/docker/kubernetes:the-version",
4160
- "interruptible": true,
4161
- "needs": [],
4162
- "retry": {
4163
- "max": 2,
4164
- "when": [
4165
- "runner_system_failure",
4166
- "stuck_or_timeout_failure",
4167
- ],
4168
- },
4169
- "rules": [
4170
- {
4171
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
4172
- "when": "on_success",
4173
- },
4174
- {
4175
- "when": "manual",
4176
- },
4177
- ],
4178
- "script": [
4179
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4180
- "export ENV_SHORT="stage"",
4181
- "export APP_DIR="app"",
4182
- "export ENV_TYPE="stage"",
4183
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4184
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4185
- "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")"",
4186
- "export HOST="web.stage.my-app.pan.panter.cloud"",
4187
- "export ROOT_URL="https://web.stage.my-app.pan.panter.cloud"",
4188
- "export HOST_INTERNAL="web.stage.my-app.pan.panter.cloud"",
4189
- "export HOST_CANONICAL="web.stage.my-app.pan.panter.cloud"",
4190
- "export ROOT_URL_INTERNAL="https://web.stage.my-app.pan.panter.cloud"",
4191
- "export KUBE_NAMESPACE="pan-my-app-stage"",
4192
- "export KUBE_APP_NAME="web"",
4193
- "export KUBE_APP_NAME_PREFIX=""",
4194
- "export MONGODB_ROOT_PASSWORD="$CL_stage_web_MONGODB_ROOT_PASSWORD"",
4195
- "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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\"]"",
4196
- "export RELEASE_NAME="pan-my-app-stage-web"",
4197
- "export HELM_EXPERIMENTAL_OCI="1"",
4198
- "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-web"",
4199
- "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
4200
- "export HELM_ARGS=""",
4201
- "export COMPONENT_NAME="web"",
4202
- "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4203
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4204
- "kubectl config set-cluster "kube-pan-my-app-stage-web" --server="$CL_stage_web_KUBE_URL" --certificate-authority <(echo $CL_stage_web_KUBE_CA_PEM | base64 -d) --embed-certs=true",
4205
- "kubectl config set-credentials "kube-pan-my-app-stage-web" --token="$CL_stage_web_KUBE_TOKEN"",
4206
- "kubectl config set-context "kube-pan-my-app-stage-web" --cluster="kube-pan-my-app-stage-web" --user="kube-pan-my-app-stage-web" --namespace="pan-my-app-stage"",
4207
- "kubectl config use-context "kube-pan-my-app-stage-web"",
4208
- "kubernetesDelete",
4209
- "echo 'Disabling component in Dependency Track'",
4210
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-my-app/web" "https://web.stage.my-app.pan.panter.cloud" || true",
4211
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://web.stage.my-app.pan.panter.cloud" >> gitlab_environment.env",
4212
- ],
4213
- "stage": "stop stage",
4214
- "variables": {
4215
- "GIT_STRATEGY": "none",
4216
- "KUBERNETES_CPU_REQUEST": "0.22",
4217
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
4218
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
4219
- },
4220
- },
4221
- "web 🧾 sbom | prod ": {
4222
- "allow_failure": true,
4223
- "artifacts": {
4224
- "paths": [
4225
- "__sbom.json",
4226
- ],
4227
- },
4228
- "image": "aquasec/trivy:0.38.3",
4229
- "interruptible": true,
4230
- "needs": [],
4231
- "retry": {
4232
- "max": 2,
4233
- "when": [
4234
- "runner_system_failure",
4235
- "stuck_or_timeout_failure",
4236
- ],
4237
- },
4238
- "script": [
4239
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4240
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4241
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
4242
- ],
4243
- "stage": "build",
4244
- "variables": {},
4245
- },
4246
- "web 🧾 sbom | stage ": {
4247
- "allow_failure": true,
4248
- "artifacts": {
4249
- "paths": [
4250
- "__sbom.json",
4251
- ],
4252
- },
4253
- "image": "aquasec/trivy:0.38.3",
4254
- "interruptible": true,
4255
- "needs": [],
4256
- "retry": {
4257
- "max": 2,
4258
- "when": [
4259
- "runner_system_failure",
4260
- "stuck_or_timeout_failure",
4261
- ],
4262
- },
4263
- "script": [
4264
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4265
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4266
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
4267
- ],
4268
- "stage": "build",
4269
- "variables": {},
4270
- },
4271
- },
4272
- "stages": [
4273
- "setup",
4274
- "setup dev",
4275
- "setup review",
4276
- "setup stage",
4277
- "setup prod",
4278
- "test",
4279
- "test dev",
4280
- "test review",
4281
- "test stage",
4282
- "test prod",
4283
- "build",
4284
- "build dev",
4285
- "build review",
4286
- "build stage",
4287
- "build prod",
4288
- "deploy",
4289
- "deploy dev",
4290
- "deploy review",
4291
- "deploy stage",
4292
- "deploy prod",
4293
- "verify",
4294
- "verify dev",
4295
- "verify review",
4296
- "verify stage",
4297
- "verify prod",
4298
- "rollback",
4299
- "rollback dev",
4300
- "rollback review",
4301
- "rollback stage",
4302
- "rollback prod",
4303
- "stop",
4304
- "stop dev",
4305
- "stop review",
4306
- "stop stage",
4307
- "stop prod",
4308
- ],
4309
- "variables": {
4310
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
4311
- "CACHE_COMPRESSION_LEVEL": "fast",
4312
- "FF_USE_FASTZIP": "true",
4313
- "GIT_DEPTH": "1",
4314
- "TRANSFER_METER_FREQUENCY": "5s",
4315
- },
4316
- "workflow": {
4317
- "rules": [
4318
- {
4319
- "if": "$CI_COMMIT_TAG",
4320
- },
4321
- {
4322
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
4323
- "when": "never",
4324
- },
4325
- {
4326
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
4327
- "when": "never",
4328
- },
4329
- {
4330
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
4331
- },
4332
- {
4333
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
4334
- },
4335
- {
4336
- "if": "$CI_MERGE_REQUEST_ID",
4337
- },
4338
- ],
4339
- },
4340
- },
4341
- }
4342
- `;