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