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