@catladder/pipeline 0.0.0-refactore-catenv-command-validates-argument-78d05852 โ 0.0.0-reference-database-url-1befbbee
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.
- package/README.md +15 -1
- package/dist/bash/BashExpression.d.ts +36 -0
- package/dist/bash/BashExpression.js +114 -0
- package/dist/bash/bashEscape.d.ts +37 -0
- package/dist/bash/bashEscape.js +119 -0
- package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
- package/dist/bash/bashExpressionPerPipelineType.js +11 -0
- package/dist/bash/bashYaml.d.ts +10 -0
- package/dist/bash/bashYaml.js +69 -0
- package/dist/bash/getInjectVarsScript.d.ts +2 -0
- package/dist/bash/getInjectVarsScript.js +47 -0
- package/dist/bash/index.d.ts +2 -0
- package/dist/bash/index.js +26 -0
- package/dist/build/artifacts/createBuildJobArtifact.d.ts +3 -0
- package/dist/build/artifacts/createBuildJobArtifact.js +97 -0
- package/dist/build/base/__tests__/createArtifactsConfig.test.js +3 -1
- package/dist/build/base/constants.js +4 -2
- package/dist/build/base/createAppBuildJob.d.ts +5 -3
- package/dist/build/base/createAppBuildJob.js +18 -15
- package/dist/build/base/createArtifactsConfig.d.ts +1 -1
- package/dist/build/base/createArtifactsConfig.js +3 -1
- package/dist/build/base/createBuildJobDefinition.d.ts +6 -0
- package/dist/build/base/createBuildJobDefinition.js +58 -0
- package/dist/build/base/index.d.ts +6 -4
- package/dist/build/base/index.js +17 -6
- package/dist/build/base/writeBuildInfo.d.ts +2 -2
- package/dist/build/base/writeBuildInfo.js +4 -3
- package/dist/build/base/writeDotEnv.d.ts +3 -2
- package/dist/build/base/writeDotEnv.js +30 -6
- package/dist/build/cache/createJobCache.d.ts +7 -0
- package/dist/build/cache/createJobCache.js +115 -0
- package/dist/build/cache/getAllCacheConfigsFromConfig.d.ts +3 -0
- package/dist/build/cache/getAllCacheConfigsFromConfig.js +64 -0
- package/dist/build/cache/transformLegacyJobCache.d.ts +3 -0
- package/dist/build/cache/transformLegacyJobCache.js +29 -0
- package/dist/build/custom/__tests__/testJob.test.js +15 -16
- package/dist/build/custom/buildJob.d.ts +2 -2
- package/dist/build/custom/buildJob.js +8 -66
- package/dist/build/custom/index.d.ts +2 -2
- package/dist/build/custom/index.js +3 -1
- package/dist/build/custom/testJob.d.ts +4 -4
- package/dist/build/custom/testJob.js +25 -20
- package/dist/build/docker.d.ts +37 -46
- package/dist/build/docker.js +65 -34
- package/dist/build/index.d.ts +14 -7
- package/dist/build/index.js +44 -17
- package/dist/build/node/buildJob.d.ts +8 -2
- package/dist/build/node/buildJob.js +39 -52
- package/dist/build/node/cache.d.ts +4 -5
- package/dist/build/node/cache.js +18 -24
- package/dist/build/node/constants.js +5 -3
- package/dist/build/node/index.d.ts +4 -4
- package/dist/build/node/index.js +3 -1
- package/dist/build/node/meteor.d.ts +2 -2
- package/dist/build/node/meteor.js +10 -12
- package/dist/build/node/testJob.d.ts +3 -2
- package/dist/build/node/testJob.js +29 -19
- package/dist/build/node/yarn.d.ts +4 -3
- package/dist/build/node/yarn.js +11 -12
- package/dist/build/rails/build.d.ts +2 -2
- package/dist/build/rails/build.js +13 -6
- package/dist/build/rails/index.d.ts +2 -2
- package/dist/build/rails/index.js +3 -1
- package/dist/build/rails/test.d.ts +2 -2
- package/dist/build/rails/test.js +30 -11
- package/dist/build/sbom.d.ts +2 -2
- package/dist/build/sbom.js +13 -7
- package/dist/build/types.d.ts +160 -47
- package/dist/build/types.js +10 -2
- package/dist/catladder-gitlab.js +129 -49
- package/dist/config/__tests__/configruedEnvs.test.js +3 -1
- package/dist/config/__tests__/getAllEnvs.test.js +79 -0
- package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
- package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
- package/dist/config/configruedEnvs.js +3 -1
- package/dist/config/index.js +13 -7
- package/dist/config/readConfig.d.ts +2 -2
- package/dist/config/readConfig.js +191 -40
- package/dist/constants.js +5 -3
- package/dist/context/createAllComponentsContext.d.ts +12 -0
- package/dist/{pipeline/commitInfo/getCommitInfo.js โ context/createAllComponentsContext.js} +35 -19
- package/dist/context/createComponentContext.d.ts +11 -0
- package/dist/context/createComponentContext.js +262 -0
- package/dist/context/createWorkspaceContext.d.ts +16 -0
- package/dist/context/createWorkspaceContext.js +173 -0
- package/dist/context/getBuildInfoVariables.d.ts +6 -0
- package/dist/context/getBuildInfoVariables.js +55 -0
- package/dist/context/getEnvConfig.js +21 -4
- package/dist/context/getEnvType.js +3 -1
- package/dist/context/getEnvironment.d.ts +3 -3
- package/dist/context/getEnvironment.js +11 -12
- package/dist/context/getEnvironmentContext.d.ts +7 -3
- package/dist/context/getEnvironmentContext.js +21 -11
- package/dist/context/getEnvironmentVariables.d.ts +22 -5
- package/dist/context/getEnvironmentVariables.js +79 -53
- package/dist/context/getLabels.d.ts +2 -2
- package/dist/context/getLabels.js +9 -7
- package/dist/context/getReviewSlug.d.ts +4 -0
- package/dist/context/getReviewSlug.js +21 -0
- package/dist/context/index.d.ts +2 -4
- package/dist/context/index.js +15 -162
- package/dist/context/transformJobOnlyVars.d.ts +5 -2
- package/dist/context/transformJobOnlyVars.js +4 -2
- package/dist/context/utils/envVars.d.ts +1 -1
- package/dist/context/utils/envVars.js +5 -2
- package/dist/defaults/index.js +3 -1
- package/dist/deploy/base/deploy.d.ts +3 -3
- package/dist/deploy/base/deploy.js +37 -21
- package/dist/deploy/base/index.d.ts +3 -5
- package/dist/deploy/base/index.js +3 -1
- package/dist/deploy/base/rollback.d.ts +3 -3
- package/dist/deploy/base/rollback.js +13 -9
- package/dist/deploy/base/stop.d.ts +3 -3
- package/dist/deploy/base/stop.js +16 -11
- package/dist/deploy/base/types.d.ts +1 -1
- package/dist/deploy/base/types.js +3 -1
- package/dist/deploy/base/variables.js +4 -2
- package/dist/deploy/cloudRun/artifactsRegistry.d.ts +8 -11
- package/dist/deploy/cloudRun/artifactsRegistry.js +15 -14
- package/dist/deploy/cloudRun/cleanup.d.ts +2 -2
- package/dist/deploy/cloudRun/cleanup.js +3 -1
- package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -2
- package/dist/deploy/cloudRun/cloudRunRevisions.js +7 -6
- package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +8 -6
- package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +57 -106
- package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +3 -3
- package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +79 -15
- package/dist/deploy/cloudRun/createJobs/common.d.ts +7 -7
- package/dist/deploy/cloudRun/createJobs/common.js +6 -3
- package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
- package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
- package/dist/deploy/cloudRun/createJobs/execute/onDeploy.d.ts +3 -0
- package/dist/deploy/cloudRun/createJobs/execute/onDeploy.js +115 -0
- package/dist/deploy/cloudRun/createJobs/execute/schedules.d.ts +3 -0
- package/dist/deploy/cloudRun/createJobs/execute/schedules.js +173 -0
- package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -2
- package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +13 -5
- package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -2
- package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +7 -3
- package/dist/deploy/cloudRun/createJobs/healthCheck.d.ts +5 -0
- package/dist/deploy/cloudRun/createJobs/healthCheck.js +82 -0
- package/dist/deploy/cloudRun/createJobs/index.d.ts +2 -2
- package/dist/deploy/cloudRun/createJobs/index.js +26 -12
- package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
- package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
- package/dist/deploy/cloudRun/index.d.ts +2 -2
- package/dist/deploy/cloudRun/index.js +25 -13
- package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.d.ts +10 -0
- package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.js +16 -0
- package/dist/deploy/cloudRun/utils/createArgsString.d.ts +2 -2
- package/dist/deploy/cloudRun/utils/createArgsString.js +3 -1
- package/dist/deploy/cloudRun/utils/database.d.ts +25 -4
- package/dist/deploy/cloudRun/utils/database.js +49 -15
- package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -2
- package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +3 -1
- package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.d.ts +2 -0
- package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.js +12 -0
- package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -2
- package/dist/deploy/cloudRun/utils/getServiceName.js +3 -1
- package/dist/deploy/cloudRun/utils/jobName.d.ts +6 -1
- package/dist/deploy/cloudRun/utils/jobName.js +18 -4
- package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +3 -1
- package/dist/deploy/cloudSql/utils.d.ts +2 -1
- package/dist/deploy/cloudSql/utils.js +7 -2
- package/dist/deploy/custom/deployJob.d.ts +2 -2
- package/dist/deploy/custom/deployJob.js +10 -9
- package/dist/deploy/custom/index.d.ts +2 -2
- package/dist/deploy/custom/index.js +3 -1
- package/dist/deploy/dockerTag/deployJob.d.ts +2 -2
- package/dist/deploy/dockerTag/deployJob.js +6 -6
- package/dist/deploy/dockerTag/index.d.ts +2 -2
- package/dist/deploy/dockerTag/index.js +3 -1
- package/dist/deploy/index.d.ts +10 -9
- package/dist/deploy/index.js +13 -7
- package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +3 -1
- package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
- package/dist/deploy/kubernetes/cloudSql/index.d.ts +6 -5
- package/dist/deploy/kubernetes/cloudSql/index.js +14 -21
- package/dist/deploy/kubernetes/deployJob.d.ts +2 -2
- package/dist/deploy/kubernetes/deployJob.js +23 -22
- package/dist/deploy/kubernetes/index.d.ts +2 -2
- package/dist/deploy/kubernetes/index.js +52 -15
- package/dist/deploy/kubernetes/kubeEnv.d.ts +5 -4
- package/dist/deploy/kubernetes/kubeEnv.js +9 -5
- package/dist/deploy/kubernetes/kubeValues.d.ts +5 -6
- package/dist/deploy/kubernetes/kubeValues.js +17 -19
- package/dist/deploy/kubernetes/mongodb.d.ts +2 -2
- package/dist/deploy/kubernetes/mongodb.js +14 -12
- package/dist/deploy/sbom.d.ts +4 -4
- package/dist/deploy/sbom.js +8 -4
- package/dist/deploy/types/base.d.ts +5 -5
- package/dist/deploy/types/base.js +3 -1
- package/dist/deploy/types/custom.d.ts +3 -7
- package/dist/deploy/types/custom.js +3 -1
- package/dist/deploy/types/dockerTag.d.ts +1 -1
- package/dist/deploy/types/dockerTag.js +3 -1
- package/dist/deploy/types/googleCloudRun.d.ts +291 -16
- package/dist/deploy/types/googleCloudRun.js +28 -1
- package/dist/deploy/types/index.d.ts +8 -7
- package/dist/deploy/types/index.js +21 -10
- package/dist/deploy/types/kubernetes.d.ts +21 -54
- package/dist/deploy/types/kubernetes.js +3 -1
- package/dist/deploy/utils.d.ts +2 -2
- package/dist/deploy/utils.js +5 -2
- package/dist/globalScriptFunctions/index.d.ts +14 -0
- package/dist/globalScriptFunctions/index.js +37 -0
- package/dist/index.d.ts +5 -2
- package/dist/index.js +18 -9
- package/dist/packageInfos.d.ts +4 -0
- package/dist/packageInfos.js +20 -0
- package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
- package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
- package/dist/pipeline/createAllJobs.d.ts +16 -6
- package/dist/pipeline/createAllJobs.js +99 -27
- package/dist/pipeline/createJobsForComponent.d.ts +2 -2
- package/dist/pipeline/createJobsForComponent.js +9 -149
- package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
- package/dist/pipeline/createJobsForWorkspace.js +12 -0
- package/dist/pipeline/createMainPipeline.d.ts +3 -0
- package/dist/pipeline/createMainPipeline.js +283 -0
- package/dist/pipeline/generatePipelineFiles.d.ts +7 -0
- package/dist/pipeline/generatePipelineFiles.js +305 -0
- package/dist/pipeline/getPipelineStages.d.ts +7 -0
- package/dist/pipeline/getPipelineStages.js +56 -0
- package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -14
- package/dist/pipeline/gitlab/createGitlabJobs.js +264 -74
- package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +9 -0
- package/dist/pipeline/gitlab/createGitlabPipeline.js +77 -0
- package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
- package/dist/pipeline/gitlab/gitlabReleaseJobs.js +25 -0
- package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
- package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
- package/dist/pipeline/index.d.ts +3 -2
- package/dist/pipeline/index.js +16 -9
- package/dist/pipeline/packageManager.d.ts +4 -2
- package/dist/pipeline/packageManager.js +56 -19
- package/dist/pipeline/yarn/yarnUtils.d.ts +2 -2
- package/dist/pipeline/yarn/yarnUtils.js +18 -15
- package/dist/rules/index.d.ts +10 -3
- package/dist/rules/index.js +35 -17
- package/dist/runner/index.d.ts +1 -1
- package/dist/runner/index.js +3 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/config.d.ts +54 -36
- package/dist/types/config.js +5 -2
- package/dist/types/context.d.ts +123 -38
- package/dist/types/context.js +12 -1
- package/dist/types/environmentContext.d.ts +15 -12
- package/dist/types/environmentContext.js +3 -1
- package/dist/types/gitlab-ci-yml.d.ts +30 -30
- package/dist/types/gitlab-ci-yml.js +3 -2
- package/dist/types/gitlab-types.d.ts +8 -8
- package/dist/types/gitlab-types.js +3 -1
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.js +16 -8
- package/dist/types/jobDefinition.d.ts +11 -0
- package/dist/types/jobDefinition.js +5 -0
- package/dist/types/jobs.d.ts +30 -15
- package/dist/types/jobs.js +3 -1
- package/dist/types/pipeline.d.ts +3 -3
- package/dist/types/pipeline.js +3 -1
- package/dist/types/utils.d.ts +1 -1
- package/dist/types/utils.js +3 -1
- package/dist/utils/gitlab.js +7 -2
- package/dist/utils/index.d.ts +2 -1
- package/dist/utils/index.js +10 -3
- package/dist/utils/jsonParse.d.ts +1 -0
- package/dist/utils/jsonParse.js +14 -0
- package/dist/utils/removeUndefined.d.ts +1 -0
- package/dist/utils/removeUndefined.js +36 -0
- package/dist/utils/writeFiles.d.ts +11 -0
- package/dist/{pipeline/commitInfo/getBuildId.js โ utils/writeFiles.js} +39 -22
- package/dist/variables/VariableValue.d.ts +3 -0
- package/dist/variables/VariableValue.js +5 -0
- package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
- package/dist/variables/VariableValueContainingReferences.js +97 -0
- package/dist/variables/__tests__/resolveAllReferences.test.d.ts +1 -0
- package/dist/variables/__tests__/resolveAllReferences.test.js +218 -0
- package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
- package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
- package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
- package/dist/variables/__tests__/resolveReferencesOnce.test.js +199 -0
- package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
- package/dist/variables/__tests__/variableValue.test.js +36 -0
- package/dist/variables/resolveAllReferences.d.ts +3 -0
- package/dist/{pipeline/createChildPipeline.js โ variables/resolveAllReferences.js} +44 -48
- package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
- package/dist/variables/resolveAllReferencesOnce.js +191 -0
- package/dist/variables/resolveReferencesOnce.d.ts +8 -0
- package/dist/variables/resolveReferencesOnce.js +22 -0
- package/examples/.test-gen-ignore +1 -0
- package/examples/__snapshots__/cloud-run-health-check-defaults.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-health-check-only-startup.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-health-check.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-http2.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-llama.test.ts.snap +624 -0
- package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1410 -0
- package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1502 -0
- package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1412 -0
- package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +1462 -0
- package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +1462 -0
- package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1466 -0
- package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1284 -0
- package/examples/__snapshots__/cloud-run-with-gpu.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1394 -0
- package/examples/__snapshots__/cloud-run-with-sql-legacy-jobs.test.ts.snap +1709 -0
- package/examples/__snapshots__/cloud-run-with-sql-multiple-dbs.test.ts.snap +4515 -0
- package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2950 -0
- package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1772 -0
- package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1402 -0
- package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1261 -0
- package/examples/__snapshots__/custom-build-job.test.ts.snap +1156 -0
- package/examples/__snapshots__/custom-deploy.test.ts.snap +1059 -0
- package/examples/__snapshots__/custom-envs.test.ts.snap +786 -0
- package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1152 -0
- package/examples/__snapshots__/custom-verify-job.test.ts.snap +1606 -0
- package/examples/__snapshots__/git-submodule.test.ts.snap +1395 -0
- package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1713 -0
- package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1733 -0
- package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3265 -0
- package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1837 -0
- package/examples/__snapshots__/local-dot-env.test.ts.snap +1318 -0
- package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1790 -0
- package/examples/__snapshots__/multiline-var.test.ts.snap +5585 -0
- package/examples/__snapshots__/native-app.test.ts.snap +2210 -0
- package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1394 -0
- package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1402 -0
- package/examples/__snapshots__/override-secrets.test.ts.snap +1419 -0
- package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1464 -0
- package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1444 -0
- package/examples/__snapshots__/referencing-other-vars.test.ts.snap +4645 -0
- package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1424 -0
- package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +2298 -0
- package/examples/__snapshots__/workspace-api-www.test.ts.snap +2290 -0
- package/examples/__utils__/helpers.ts +9 -12
- package/examples/cloud-run-health-check-defaults.test.ts +11 -0
- package/examples/cloud-run-health-check-defaults.ts +28 -0
- package/examples/cloud-run-health-check-only-startup.test.ts +11 -0
- package/examples/cloud-run-health-check-only-startup.ts +38 -0
- package/examples/cloud-run-health-check.test.ts +11 -0
- package/examples/cloud-run-health-check.ts +45 -0
- package/examples/cloud-run-http2.test.ts +11 -0
- package/examples/cloud-run-http2.ts +29 -0
- package/examples/cloud-run-llama.test.ts +11 -0
- package/examples/cloud-run-llama.ts +40 -0
- package/examples/cloud-run-memory-limit.test.ts +11 -0
- package/examples/cloud-run-memory-limit.ts +12 -7
- package/examples/cloud-run-meteor-with-worker.test.ts +11 -0
- package/examples/cloud-run-meteor-with-worker.ts +13 -7
- package/examples/cloud-run-nextjs.test.ts +11 -0
- package/examples/cloud-run-nextjs.ts +28 -0
- package/examples/cloud-run-no-cpu-throttling.test.ts +11 -0
- package/examples/cloud-run-no-cpu-throttling.ts +8 -6
- package/examples/cloud-run-no-service.test.ts +11 -0
- package/examples/cloud-run-no-service.ts +39 -0
- package/examples/cloud-run-non-public.test.ts +11 -0
- package/examples/cloud-run-non-public.ts +7 -6
- package/examples/cloud-run-post-stop-job.test.ts +11 -0
- package/examples/cloud-run-post-stop-job.ts +15 -6
- package/examples/cloud-run-service-custom-vpc-connector.test.ts +11 -0
- package/examples/cloud-run-service-custom-vpc-connector.ts +37 -0
- package/examples/cloud-run-service-custom-vpc.test.ts +11 -0
- package/examples/cloud-run-service-custom-vpc.ts +39 -0
- package/examples/cloud-run-service-gen2.test.ts +11 -0
- package/examples/cloud-run-service-gen2.ts +8 -6
- package/examples/cloud-run-service-increase-timout.test.ts +11 -0
- package/examples/cloud-run-service-increase-timout.ts +29 -0
- package/examples/cloud-run-service-with-volumes.test.ts +11 -0
- package/examples/cloud-run-service-with-volumes.ts +64 -0
- package/examples/cloud-run-storybook.test.ts +11 -0
- package/examples/cloud-run-storybook.ts +33 -0
- package/examples/cloud-run-with-gpu.test.ts +11 -0
- package/examples/cloud-run-with-gpu.ts +30 -0
- package/examples/cloud-run-with-ngnix.test.ts +11 -0
- package/examples/cloud-run-with-ngnix.ts +29 -0
- package/examples/cloud-run-with-sql-legacy-jobs.test.ts +11 -0
- package/examples/cloud-run-with-sql-legacy-jobs.ts +49 -0
- package/examples/cloud-run-with-sql-multiple-dbs.test.ts +11 -0
- package/examples/cloud-run-with-sql-multiple-dbs.ts +87 -0
- package/examples/cloud-run-with-sql-reuse-db.test.ts +11 -0
- package/examples/cloud-run-with-sql-reuse-db.ts +7 -6
- package/examples/cloud-run-with-sql.test.ts +11 -0
- package/examples/cloud-run-with-sql.ts +45 -24
- package/examples/cloud-run-with-worker.test.ts +11 -0
- package/examples/cloud-run-with-worker.ts +8 -6
- package/examples/custom-build-job-with-tests.test.ts +11 -0
- package/examples/custom-build-job-with-tests.ts +7 -6
- package/examples/custom-build-job.test.ts +11 -0
- package/examples/custom-build-job.ts +7 -6
- package/examples/custom-deploy.test.ts +11 -0
- package/examples/custom-deploy.ts +22 -14
- package/examples/custom-envs.test.ts +11 -0
- package/examples/custom-envs.ts +7 -6
- package/examples/custom-sbom-java.test.ts +11 -0
- package/examples/custom-sbom-java.ts +12 -8
- package/examples/custom-verify-job.test.ts +11 -0
- package/examples/custom-verify-job.ts +65 -0
- package/examples/git-submodule.test.ts +11 -0
- package/examples/git-submodule.ts +30 -0
- package/examples/kubernetes-application-customization.test.ts +11 -0
- package/examples/kubernetes-application-customization.ts +9 -6
- package/examples/kubernetes-with-cloud-sql.test.ts +11 -0
- package/examples/kubernetes-with-cloud-sql.ts +9 -6
- package/examples/kubernetes-with-jobs.test.ts +11 -0
- package/examples/kubernetes-with-jobs.ts +9 -6
- package/examples/kubernetes-with-mongodb.test.ts +11 -0
- package/examples/kubernetes-with-mongodb.ts +9 -6
- package/examples/local-dot-env.test.ts +11 -0
- package/examples/local-dot-env.ts +27 -0
- package/examples/meteor-kubernetes.test.ts +11 -0
- package/examples/meteor-kubernetes.ts +6 -7
- package/examples/multiline-var.test.ts +11 -0
- package/examples/multiline-var.ts +107 -0
- package/examples/native-app.test.ts +11 -0
- package/examples/native-app.ts +24 -19
- package/examples/node-build-with-custom-image.test.ts +11 -0
- package/examples/node-build-with-custom-image.ts +7 -6
- package/examples/node-build-with-docker-additions.test.ts +11 -0
- package/examples/node-build-with-docker-additions.ts +7 -6
- package/examples/override-secrets.test.ts +11 -0
- package/examples/override-secrets.ts +44 -0
- package/examples/rails-k8s-with-worker-dockerfile.test.ts +33 -0
- package/examples/rails-k8s-with-worker.test.ts +11 -0
- package/examples/rails-k8s-with-worker.ts +13 -13
- package/examples/referencing-other-vars.test.ts +11 -0
- package/examples/referencing-other-vars.ts +83 -0
- package/examples/wait-for-other-deploy.test.ts +11 -0
- package/examples/wait-for-other-deploy.ts +6 -5
- package/examples/workspace-api-www-turbo-cache.test.ts +11 -0
- package/examples/workspace-api-www-turbo-cache.ts +52 -0
- package/examples/workspace-api-www.test.ts +11 -0
- package/examples/workspace-api-www.ts +46 -0
- package/package.json +23 -26
- package/scripts/generate-examples-test.ts +84 -0
- package/scripts/generate-gitlab-ci-types.ts +2 -2
- package/scripts/tsconfig.json +7 -0
- package/src/bash/BashExpression.ts +78 -0
- package/src/bash/bashEscape.ts +164 -0
- package/src/bash/bashExpressionPerPipelineType.ts +16 -0
- package/src/bash/bashYaml.ts +80 -0
- package/src/bash/getInjectVarsScript.ts +21 -0
- package/src/bash/index.ts +2 -0
- package/src/build/artifacts/createBuildJobArtifact.ts +63 -0
- package/src/build/base/__tests__/createArtifactsConfig.test.ts +3 -3
- package/src/build/base/constants.ts +1 -1
- package/src/build/base/createAppBuildJob.ts +40 -24
- package/src/build/base/createArtifactsConfig.ts +2 -2
- package/src/build/base/createBuildJobDefinition.ts +37 -0
- package/src/build/base/index.ts +40 -8
- package/src/build/base/writeBuildInfo.ts +3 -3
- package/src/build/base/writeDotEnv.ts +25 -6
- package/src/build/cache/createJobCache.ts +83 -0
- package/src/build/cache/getAllCacheConfigsFromConfig.ts +29 -0
- package/src/build/cache/transformLegacyJobCache.ts +14 -0
- package/src/build/custom/__tests__/testJob.test.ts +10 -13
- package/src/build/custom/buildJob.ts +11 -37
- package/src/build/custom/index.ts +4 -2
- package/src/build/custom/testJob.ts +24 -21
- package/src/build/docker.ts +110 -49
- package/src/build/index.ts +45 -11
- package/src/build/node/buildJob.ts +68 -69
- package/src/build/node/cache.ts +28 -34
- package/src/build/node/constants.ts +2 -2
- package/src/build/node/index.ts +13 -4
- package/src/build/node/meteor.ts +19 -24
- package/src/build/node/testJob.ts +44 -25
- package/src/build/node/yarn.ts +22 -15
- package/src/build/rails/build.ts +15 -9
- package/src/build/rails/index.ts +4 -2
- package/src/build/rails/test.ts +41 -12
- package/src/build/sbom.ts +21 -11
- package/src/build/types.ts +198 -47
- package/src/catladder-gitlab.ts +7 -56
- package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
- package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
- package/src/config/__tests__/getAllEnvs.test.ts +71 -0
- package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
- package/src/config/configruedEnvs.ts +6 -6
- package/src/config/readConfig.ts +15 -22
- package/src/constants.ts +5 -2
- package/src/context/createAllComponentsContext.ts +31 -0
- package/src/context/createComponentContext.ts +148 -0
- package/src/context/createWorkspaceContext.ts +56 -0
- package/src/context/getBuildInfoVariables.ts +36 -0
- package/src/context/getEnvConfig.ts +25 -5
- package/src/context/getEnvType.ts +1 -1
- package/src/context/getEnvironment.ts +8 -24
- package/src/context/getEnvironmentContext.ts +25 -29
- package/src/context/getEnvironmentVariables.ts +101 -83
- package/src/context/getLabels.ts +8 -5
- package/src/context/getReviewSlug.ts +27 -0
- package/src/context/index.ts +1 -65
- package/src/context/transformJobOnlyVars.ts +6 -3
- package/src/context/utils/envVars.ts +5 -4
- package/src/deploy/base/deploy.ts +63 -47
- package/src/deploy/base/index.ts +11 -6
- package/src/deploy/base/rollback.ts +11 -16
- package/src/deploy/base/stop.ts +11 -15
- package/src/deploy/base/variables.ts +1 -1
- package/src/deploy/cloudRun/artifactsRegistry.ts +32 -28
- package/src/deploy/cloudRun/cleanup.ts +5 -5
- package/src/deploy/cloudRun/cloudRunRevisions.ts +9 -11
- package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +71 -153
- package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +65 -26
- package/src/deploy/cloudRun/createJobs/common.ts +7 -7
- package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
- package/src/deploy/cloudRun/createJobs/execute/onDeploy.ts +102 -0
- package/src/deploy/cloudRun/createJobs/execute/schedules.ts +186 -0
- package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +27 -16
- package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +9 -11
- package/src/deploy/cloudRun/createJobs/healthCheck.ts +64 -0
- package/src/deploy/cloudRun/createJobs/index.ts +20 -14
- package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
- package/src/deploy/cloudRun/index.ts +94 -60
- package/src/deploy/cloudRun/utils/cloudRunExecutionUrl.ts +20 -0
- package/src/deploy/cloudRun/utils/createArgsString.ts +6 -2
- package/src/deploy/cloudRun/utils/database.ts +116 -9
- package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +5 -3
- package/src/deploy/cloudRun/utils/getJobOrServiceArgs.ts +18 -0
- package/src/deploy/cloudRun/utils/getServiceName.ts +2 -2
- package/src/deploy/cloudRun/utils/jobName.ts +22 -2
- package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +1 -1
- package/src/deploy/cloudSql/utils.ts +13 -10
- package/src/deploy/custom/deployJob.ts +15 -10
- package/src/deploy/custom/index.ts +2 -2
- package/src/deploy/dockerTag/deployJob.ts +6 -7
- package/src/deploy/dockerTag/index.ts +8 -7
- package/src/deploy/index.ts +15 -12
- package/src/deploy/kubernetes/additionalSecretKeys.ts +3 -1
- package/src/deploy/kubernetes/cloudSql/index.ts +16 -25
- package/src/deploy/kubernetes/deployJob.ts +30 -21
- package/src/deploy/kubernetes/index.ts +43 -35
- package/src/deploy/kubernetes/kubeEnv.ts +12 -10
- package/src/deploy/kubernetes/kubeValues.ts +25 -20
- package/src/deploy/kubernetes/mongodb.ts +15 -15
- package/src/deploy/sbom.ts +20 -10
- package/src/deploy/types/base.ts +3 -3
- package/src/deploy/types/custom.ts +3 -7
- package/src/deploy/types/googleCloudRun.ts +359 -2
- package/src/deploy/types/index.ts +9 -2
- package/src/deploy/types/kubernetes.ts +1 -36
- package/src/deploy/utils.ts +5 -5
- package/src/globalScriptFunctions/index.ts +30 -0
- package/src/index.ts +4 -1
- package/src/packageInfos.ts +14 -0
- package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
- package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
- package/src/pipeline/createAllJobs.ts +67 -33
- package/src/pipeline/createJobsForComponent.ts +17 -37
- package/src/pipeline/createJobsForWorkspace.ts +12 -0
- package/src/pipeline/createMainPipeline.ts +118 -0
- package/src/pipeline/generatePipelineFiles.ts +100 -0
- package/src/pipeline/getPipelineStages.ts +23 -0
- package/src/pipeline/gitlab/createGitlabJobs.ts +398 -108
- package/src/pipeline/gitlab/createGitlabPipeline.ts +35 -0
- package/src/pipeline/gitlab/gitlabReleaseJobs.ts +23 -0
- package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
- package/src/pipeline/index.ts +2 -1
- package/src/pipeline/packageManager.ts +42 -18
- package/src/pipeline/yarn/yarnUtils.ts +15 -12
- package/src/rules/index.ts +41 -18
- package/src/runner/index.ts +0 -1
- package/src/types/config.ts +62 -23
- package/src/types/context.ts +167 -36
- package/src/types/environmentContext.ts +18 -13
- package/src/types/gitlab-ci-yml.ts +0 -1
- package/src/types/gitlab-types.ts +10 -7
- package/src/types/index.ts +2 -0
- package/src/types/jobDefinition.ts +34 -0
- package/src/types/jobs.ts +31 -15
- package/src/types/utils.ts +4 -4
- package/src/utils/gitlab.ts +20 -3
- package/src/utils/index.ts +6 -3
- package/src/utils/jsonParse.ts +7 -0
- package/src/utils/removeUndefined.ts +4 -0
- package/src/utils/writeFiles.ts +52 -0
- package/src/variables/VariableValue.ts +6 -0
- package/src/variables/VariableValueContainingReferences.ts +89 -0
- package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
- package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
- package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
- package/src/variables/__tests__/variableValue.test.ts +73 -0
- package/src/variables/resolveAllReferences.ts +46 -0
- package/src/variables/resolveAllReferencesOnce.ts +44 -0
- package/src/variables/resolveReferencesOnce.ts +29 -0
- package/bin/catladder-gitlab-dev.js +0 -3
- package/bin/catladder-gitlab.js +0 -3
- package/dist/bundles/catladder-gitlab/index.js +0 -34559
- package/dist/context/__tests__/resolveReferences.test.js +0 -336
- package/dist/context/resolveReferences.d.ts +0 -4
- package/dist/context/resolveReferences.js +0 -254
- package/dist/deploy/cloudRun/createJobs/variables.d.ts +0 -5
- package/dist/deploy/cloudRun/createJobs/variables.js +0 -19
- package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -84
- package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -31
- package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
- package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
- package/dist/pipeline/createChildPipeline.d.ts +0 -3
- package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +0 -1839
- package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +0 -1807
- package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +0 -1839
- package/examples/__snapshots__/cloud-run-non-public.ts.snap +0 -1839
- package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +0 -1849
- package/examples/__snapshots__/cloud-run-service-gen2.ts.snap +0 -1839
- package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +0 -3647
- package/examples/__snapshots__/cloud-run-with-sql.ts.snap +0 -3658
- package/examples/__snapshots__/cloud-run-with-worker.ts.snap +0 -1847
- package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +0 -1663
- package/examples/__snapshots__/custom-build-job.ts.snap +0 -1375
- package/examples/__snapshots__/custom-deploy.ts.snap +0 -1625
- package/examples/__snapshots__/custom-envs.ts.snap +0 -1127
- package/examples/__snapshots__/custom-sbom-java.ts.snap +0 -1383
- package/examples/__snapshots__/kubernetes-application-customization.ts.snap +0 -2573
- package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +0 -2533
- package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +0 -2545
- package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +0 -4660
- package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +0 -2737
- package/examples/__snapshots__/meteor-kubernetes.ts.snap +0 -2658
- package/examples/__snapshots__/native-app.ts.snap +0 -3007
- package/examples/__snapshots__/node-build-with-custom-image.ts.snap +0 -1839
- package/examples/__snapshots__/node-build-with-docker-additions.ts.snap +0 -1839
- package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +0 -4291
- package/examples/__snapshots__/wait-for-other-deploy.ts.snap +0 -2049
- package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -33
- package/scripts/bundle +0 -2
- package/src/context/__tests__/resolveReferences.test.ts +0 -143
- package/src/context/resolveReferences.ts +0 -70
- package/src/deploy/cloudRun/createJobs/variables.ts +0 -21
- package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -34
- package/src/pipeline/commitInfo/getBuildId.ts +0 -17
- package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
- package/src/pipeline/createChildPipeline.ts +0 -46
- /package/dist/{context/__tests__/resolveReferences.test.d.ts โ config/__tests__/getAllEnvs.test.d.ts} +0 -0
|
@@ -0,0 +1,3265 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`matches snapshot for kubernetes-with-jobs local pipeline YAML 1`] = `
|
|
4
|
+
"image: path/to/docker/jobs-default:the-version
|
|
5
|
+
stages:
|
|
6
|
+
- setup
|
|
7
|
+
- setup dev
|
|
8
|
+
- setup review
|
|
9
|
+
- setup stage
|
|
10
|
+
- setup prod
|
|
11
|
+
- test
|
|
12
|
+
- test dev
|
|
13
|
+
- test review
|
|
14
|
+
- test stage
|
|
15
|
+
- test prod
|
|
16
|
+
- build
|
|
17
|
+
- build dev
|
|
18
|
+
- build review
|
|
19
|
+
- build stage
|
|
20
|
+
- build prod
|
|
21
|
+
- deploy
|
|
22
|
+
- deploy dev
|
|
23
|
+
- deploy review
|
|
24
|
+
- deploy stage
|
|
25
|
+
- deploy prod
|
|
26
|
+
- verify
|
|
27
|
+
- verify dev
|
|
28
|
+
- verify review
|
|
29
|
+
- verify stage
|
|
30
|
+
- verify prod
|
|
31
|
+
- rollback
|
|
32
|
+
- rollback dev
|
|
33
|
+
- rollback review
|
|
34
|
+
- rollback stage
|
|
35
|
+
- rollback prod
|
|
36
|
+
- stop
|
|
37
|
+
- stop dev
|
|
38
|
+
- stop review
|
|
39
|
+
- stop stage
|
|
40
|
+
- stop prod
|
|
41
|
+
- release
|
|
42
|
+
variables:
|
|
43
|
+
FF_USE_FASTZIP: 'true'
|
|
44
|
+
ARTIFACT_COMPRESSION_LEVEL: fast
|
|
45
|
+
CACHE_COMPRESSION_LEVEL: fast
|
|
46
|
+
TRANSFER_METER_FREQUENCY: 5s
|
|
47
|
+
GIT_DEPTH: '1'
|
|
48
|
+
before_script:
|
|
49
|
+
- |-
|
|
50
|
+
function escapeForDotEnv () {
|
|
51
|
+
input="\${1:-$(cat)}"
|
|
52
|
+
input="\${input//$'\\n'/\\\\n}"
|
|
53
|
+
if [[ "$input" == *\\\\n* ]]; then
|
|
54
|
+
if [[ "$input" == *\\"* && "$input" == *\\'* && "$input" == *\\\`* ]]; then
|
|
55
|
+
printf "\\"%s\\"\\n" "$input"
|
|
56
|
+
elif [[ "$input" == *\\"* && "$input" == *\\'* ]]; then
|
|
57
|
+
printf "\`%s\`\\n" "$input"
|
|
58
|
+
elif [[ "$input" == *\\"* ]]; then
|
|
59
|
+
printf "'%s'\\n" "$input"
|
|
60
|
+
else
|
|
61
|
+
printf "\\"%s\\"\\n" "$input"
|
|
62
|
+
fi
|
|
63
|
+
else
|
|
64
|
+
printf "%s\\n" "$input"
|
|
65
|
+
fi
|
|
66
|
+
}
|
|
67
|
+
- |-
|
|
68
|
+
function collapseable_section_start () {
|
|
69
|
+
local section_title="\${1}"
|
|
70
|
+
local section_description="\${2:-$section_title}"
|
|
71
|
+
echo -e "section_start:\`date +%s\`:\${section_title}[collapsed=true]\\r\\e[0K\${section_description}"
|
|
72
|
+
}
|
|
73
|
+
- |-
|
|
74
|
+
function collapseable_section_end () {
|
|
75
|
+
local section_title="\${1}"
|
|
76
|
+
echo -e "section_end:\`date +%s\`:\${section_title}\\r\\e[0K"
|
|
77
|
+
}
|
|
78
|
+
api ๐ก audit:
|
|
79
|
+
stage: test
|
|
80
|
+
image: path/to/docker/jobs-default:the-version
|
|
81
|
+
variables:
|
|
82
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
83
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
84
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
85
|
+
script:
|
|
86
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
87
|
+
- export APP_PATH="api"
|
|
88
|
+
- collapseable_section_end "injectvars"
|
|
89
|
+
- cd api
|
|
90
|
+
- yarn npm audit --environment production
|
|
91
|
+
rules:
|
|
92
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
93
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
94
|
+
needs: []
|
|
95
|
+
retry: &a1
|
|
96
|
+
max: 2
|
|
97
|
+
when:
|
|
98
|
+
- runner_system_failure
|
|
99
|
+
- stuck_or_timeout_failure
|
|
100
|
+
interruptible: true
|
|
101
|
+
allow_failure: true
|
|
102
|
+
api ๐ฎ lint:
|
|
103
|
+
stage: test
|
|
104
|
+
image: path/to/docker/jobs-default:the-version
|
|
105
|
+
variables:
|
|
106
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
107
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
108
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
109
|
+
script:
|
|
110
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
111
|
+
- export APP_PATH="api"
|
|
112
|
+
- collapseable_section_end "injectvars"
|
|
113
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
114
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
115
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
116
|
+
- collapseable_section_end "nodeinstall"
|
|
117
|
+
- cd api
|
|
118
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
119
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
120
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
121
|
+
- collapseable_section_end "nodeinstall"
|
|
122
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
123
|
+
- yarn install --immutable
|
|
124
|
+
- collapseable_section_end "yarninstall"
|
|
125
|
+
- yarn lint
|
|
126
|
+
cache:
|
|
127
|
+
- key: api-yarn
|
|
128
|
+
policy: pull-push
|
|
129
|
+
paths:
|
|
130
|
+
- api/.yarn
|
|
131
|
+
- key: api-node-modules
|
|
132
|
+
policy: pull-push
|
|
133
|
+
paths:
|
|
134
|
+
- api/node_modules
|
|
135
|
+
rules:
|
|
136
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
137
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
138
|
+
needs: []
|
|
139
|
+
retry: *a1
|
|
140
|
+
interruptible: true
|
|
141
|
+
api ๐งช test:
|
|
142
|
+
stage: test
|
|
143
|
+
image: path/to/docker/jobs-testing-chrome:the-version
|
|
144
|
+
variables:
|
|
145
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
146
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
147
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
148
|
+
script:
|
|
149
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
150
|
+
- export APP_PATH="api"
|
|
151
|
+
- collapseable_section_end "injectvars"
|
|
152
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
153
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
154
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
155
|
+
- collapseable_section_end "nodeinstall"
|
|
156
|
+
- cd api
|
|
157
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
158
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
159
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
160
|
+
- collapseable_section_end "nodeinstall"
|
|
161
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
162
|
+
- yarn install --immutable
|
|
163
|
+
- collapseable_section_end "yarninstall"
|
|
164
|
+
- yarn test
|
|
165
|
+
cache:
|
|
166
|
+
- key: api-yarn
|
|
167
|
+
policy: pull-push
|
|
168
|
+
paths:
|
|
169
|
+
- api/.yarn
|
|
170
|
+
- key: api-node-modules
|
|
171
|
+
policy: pull-push
|
|
172
|
+
paths:
|
|
173
|
+
- api/node_modules
|
|
174
|
+
rules:
|
|
175
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
176
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
177
|
+
needs: []
|
|
178
|
+
retry: *a1
|
|
179
|
+
interruptible: true
|
|
180
|
+
'api ๐จ app | dev ':
|
|
181
|
+
stage: build
|
|
182
|
+
image: path/to/docker/jobs-default:the-version
|
|
183
|
+
variables:
|
|
184
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
185
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
186
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
187
|
+
script:
|
|
188
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
189
|
+
- export ENV_SHORT="dev"
|
|
190
|
+
- export APP_DIR="api"
|
|
191
|
+
- export ENV_TYPE="dev"
|
|
192
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
193
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
194
|
+
- 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")"
|
|
195
|
+
- export HOSTNAME="api.dev.test-app.pan.panter.cloud"
|
|
196
|
+
- export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
|
|
197
|
+
- export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
|
|
198
|
+
- export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
|
|
199
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
200
|
+
- export KUBE_APP_NAME="api"
|
|
201
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
202
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
203
|
+
- collapseable_section_end "injectvars"
|
|
204
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
|
|
205
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
206
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
207
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
208
|
+
- collapseable_section_end "nodeinstall"
|
|
209
|
+
- cd api
|
|
210
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
211
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
212
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
213
|
+
- collapseable_section_end "nodeinstall"
|
|
214
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
215
|
+
- yarn install --immutable
|
|
216
|
+
- collapseable_section_end "yarninstall"
|
|
217
|
+
- yarn build
|
|
218
|
+
cache:
|
|
219
|
+
- key: api-yarn
|
|
220
|
+
policy: pull-push
|
|
221
|
+
paths:
|
|
222
|
+
- api/.yarn
|
|
223
|
+
- key: api-node-modules
|
|
224
|
+
policy: pull-push
|
|
225
|
+
paths:
|
|
226
|
+
- api/node_modules
|
|
227
|
+
artifacts:
|
|
228
|
+
paths:
|
|
229
|
+
- api/__build_info.json
|
|
230
|
+
- api/.next
|
|
231
|
+
- api/dist
|
|
232
|
+
expire_in: 1 day
|
|
233
|
+
when: always
|
|
234
|
+
reports: {}
|
|
235
|
+
rules:
|
|
236
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
237
|
+
needs: []
|
|
238
|
+
retry: *a1
|
|
239
|
+
interruptible: true
|
|
240
|
+
'api ๐จ docker | dev ':
|
|
241
|
+
stage: build
|
|
242
|
+
image: path/to/docker/docker-build:the-version
|
|
243
|
+
services:
|
|
244
|
+
- name: docker:24.0.6-dind
|
|
245
|
+
command:
|
|
246
|
+
- --tls=false
|
|
247
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
248
|
+
variables:
|
|
249
|
+
DOCKER_HOST: tcp://docker:2375
|
|
250
|
+
DOCKER_TLS_CERTDIR: ''
|
|
251
|
+
DOCKER_DRIVER: overlay2
|
|
252
|
+
DOCKER_BUILDKIT: '1'
|
|
253
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
254
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
255
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
256
|
+
script:
|
|
257
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
258
|
+
- export APP_DIR="api"
|
|
259
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
260
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
261
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
262
|
+
- export DOCKER_IMAGE_NAME="dev/api"
|
|
263
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
264
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
265
|
+
- |-
|
|
266
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
267
|
+
RUN yarn plugin import workspace-tools
|
|
268
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
269
|
+
- |-
|
|
270
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
|
|
271
|
+
COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
|
|
272
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
273
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
274
|
+
- collapseable_section_end "injectvars"
|
|
275
|
+
- ensureNodeDockerfile
|
|
276
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
277
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
278
|
+
- collapseable_section_end "docker-login"
|
|
279
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
280
|
+
- 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
|
|
281
|
+
- collapseable_section_end "docker-build"
|
|
282
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
283
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
284
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
285
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
286
|
+
- collapseable_section_end "docker-push"
|
|
287
|
+
cache:
|
|
288
|
+
- key: api-yarn
|
|
289
|
+
policy: pull
|
|
290
|
+
paths:
|
|
291
|
+
- api/.yarn
|
|
292
|
+
rules:
|
|
293
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
294
|
+
needs:
|
|
295
|
+
- 'api ๐จ app | dev '
|
|
296
|
+
retry: *a1
|
|
297
|
+
interruptible: true
|
|
298
|
+
'api ๐งพ sbom | dev ':
|
|
299
|
+
stage: build
|
|
300
|
+
image:
|
|
301
|
+
name: aquasec/trivy:0.58.2
|
|
302
|
+
entrypoint:
|
|
303
|
+
- ''
|
|
304
|
+
variables: {}
|
|
305
|
+
script:
|
|
306
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
307
|
+
- collapseable_section_end "injectvars"
|
|
308
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" api
|
|
309
|
+
artifacts:
|
|
310
|
+
paths:
|
|
311
|
+
- __sbom.json
|
|
312
|
+
rules:
|
|
313
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
314
|
+
needs: []
|
|
315
|
+
retry: *a1
|
|
316
|
+
interruptible: true
|
|
317
|
+
allow_failure: true
|
|
318
|
+
'api ๐ Deploy | dev ':
|
|
319
|
+
stage: deploy dev
|
|
320
|
+
image: path/to/docker/kubernetes:the-version
|
|
321
|
+
variables:
|
|
322
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
323
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
324
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
325
|
+
script:
|
|
326
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
327
|
+
- export ENV_SHORT="dev"
|
|
328
|
+
- export APP_DIR="api"
|
|
329
|
+
- export ENV_TYPE="dev"
|
|
330
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
331
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
332
|
+
- 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")"
|
|
333
|
+
- export HOSTNAME="api.dev.test-app.pan.panter.cloud"
|
|
334
|
+
- export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
|
|
335
|
+
- export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
|
|
336
|
+
- export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
|
|
337
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
338
|
+
- export KUBE_APP_NAME="api"
|
|
339
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
340
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
341
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
342
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
343
|
+
- export DOCKER_IMAGE_NAME="dev/api"
|
|
344
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
345
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
346
|
+
- export RELEASE_NAME="pan-test-app-dev-api"
|
|
347
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
348
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
349
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
350
|
+
- export HELM_ARGS=""
|
|
351
|
+
- export COMPONENT_NAME="api"
|
|
352
|
+
- collapseable_section_end "injectvars"
|
|
353
|
+
- 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
|
|
354
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
|
|
355
|
+
- 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"
|
|
356
|
+
- kubectl config use-context "kube-pan-test-app-dev-api"
|
|
357
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
358
|
+
- |
|
|
359
|
+
cat > __all_values.yml <<EOF
|
|
360
|
+
env:
|
|
361
|
+
secret: {}
|
|
362
|
+
public:
|
|
363
|
+
ENV_SHORT: |-
|
|
364
|
+
dev
|
|
365
|
+
APP_DIR: |-
|
|
366
|
+
api
|
|
367
|
+
ENV_TYPE: |-
|
|
368
|
+
dev
|
|
369
|
+
BUILD_INFO_BUILD_ID: |-
|
|
370
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
371
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
372
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
373
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
374
|
+
$(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 '1!s/^/ /')
|
|
375
|
+
HOSTNAME: |-
|
|
376
|
+
api.dev.test-app.pan.panter.cloud
|
|
377
|
+
ROOT_URL: |-
|
|
378
|
+
https://api.dev.test-app.pan.panter.cloud
|
|
379
|
+
HOSTNAME_INTERNAL: |-
|
|
380
|
+
api.dev.test-app.pan.panter.cloud
|
|
381
|
+
ROOT_URL_INTERNAL: |-
|
|
382
|
+
https://api.dev.test-app.pan.panter.cloud
|
|
383
|
+
KUBE_NAMESPACE: |-
|
|
384
|
+
pan-test-app-dev
|
|
385
|
+
KUBE_APP_NAME: |-
|
|
386
|
+
api
|
|
387
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
388
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
389
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
390
|
+
application:
|
|
391
|
+
host: |-
|
|
392
|
+
api.dev.test-app.pan.panter.cloud
|
|
393
|
+
command: |-
|
|
394
|
+
yarn start
|
|
395
|
+
livenessProbe:
|
|
396
|
+
httpGet:
|
|
397
|
+
path: |-
|
|
398
|
+
__health
|
|
399
|
+
readinessProbe:
|
|
400
|
+
httpGet:
|
|
401
|
+
path: |-
|
|
402
|
+
__health
|
|
403
|
+
startupProbe:
|
|
404
|
+
httpGet:
|
|
405
|
+
path: |-
|
|
406
|
+
__health
|
|
407
|
+
jobs:
|
|
408
|
+
migration:
|
|
409
|
+
command: |-
|
|
410
|
+
yarn migrate
|
|
411
|
+
cronjobs:
|
|
412
|
+
send-emails:
|
|
413
|
+
command: |-
|
|
414
|
+
yarn send emails
|
|
415
|
+
schedule: |-
|
|
416
|
+
0 * * * *
|
|
417
|
+
|
|
418
|
+
EOF
|
|
419
|
+
- collapseable_section_end "writeallvalues"
|
|
420
|
+
- kubernetesCreateSecret
|
|
421
|
+
- kubernetesDeploy
|
|
422
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
423
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
424
|
+
- echo deployment successful ๐ป
|
|
425
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
426
|
+
environment:
|
|
427
|
+
name: dev/api
|
|
428
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
429
|
+
on_stop: 'api ๐ Stop โ ๏ธ | dev '
|
|
430
|
+
auto_stop_in: 4 weeks
|
|
431
|
+
artifacts:
|
|
432
|
+
reports:
|
|
433
|
+
dotenv: gitlab_environment.env
|
|
434
|
+
rules:
|
|
435
|
+
- when: on_success
|
|
436
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
437
|
+
needs:
|
|
438
|
+
- job: api ๐ฎ lint
|
|
439
|
+
artifacts: false
|
|
440
|
+
- job: 'api ๐จ app | dev '
|
|
441
|
+
artifacts: false
|
|
442
|
+
- job: 'api ๐จ docker | dev '
|
|
443
|
+
artifacts: false
|
|
444
|
+
- job: api ๐งช test
|
|
445
|
+
artifacts: false
|
|
446
|
+
- job: 'api ๐งพ sbom | dev '
|
|
447
|
+
artifacts: true
|
|
448
|
+
- job: api ๐ก audit
|
|
449
|
+
artifacts: false
|
|
450
|
+
retry: *a1
|
|
451
|
+
interruptible: true
|
|
452
|
+
allow_failure: false
|
|
453
|
+
'api ๐ Stop โ ๏ธ | dev ':
|
|
454
|
+
stage: stop dev
|
|
455
|
+
image: path/to/docker/kubernetes:the-version
|
|
456
|
+
variables:
|
|
457
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
458
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
459
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
460
|
+
GIT_STRATEGY: none
|
|
461
|
+
script:
|
|
462
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
463
|
+
- export ENV_SHORT="dev"
|
|
464
|
+
- export APP_DIR="api"
|
|
465
|
+
- export ENV_TYPE="dev"
|
|
466
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
467
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
468
|
+
- 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")"
|
|
469
|
+
- export HOSTNAME="api.dev.test-app.pan.panter.cloud"
|
|
470
|
+
- export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
|
|
471
|
+
- export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
|
|
472
|
+
- export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
|
|
473
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
474
|
+
- export KUBE_APP_NAME="api"
|
|
475
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
476
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
477
|
+
- export RELEASE_NAME="pan-test-app-dev-api"
|
|
478
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
479
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
480
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
481
|
+
- export HELM_ARGS=""
|
|
482
|
+
- export COMPONENT_NAME="api"
|
|
483
|
+
- collapseable_section_end "injectvars"
|
|
484
|
+
- 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
|
|
485
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
|
|
486
|
+
- 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"
|
|
487
|
+
- kubectl config use-context "kube-pan-test-app-dev-api"
|
|
488
|
+
- kubernetesDelete
|
|
489
|
+
- echo 'Disabling component in Dependency Track'
|
|
490
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
|
|
491
|
+
environment:
|
|
492
|
+
name: dev/api
|
|
493
|
+
action: stop
|
|
494
|
+
rules:
|
|
495
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
496
|
+
when: on_success
|
|
497
|
+
- when: manual
|
|
498
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
499
|
+
needs: []
|
|
500
|
+
retry: *a1
|
|
501
|
+
interruptible: true
|
|
502
|
+
allow_failure: true
|
|
503
|
+
'api โฉ๏ธ Rollback โ ๏ธ | dev ':
|
|
504
|
+
stage: rollback dev
|
|
505
|
+
image: path/to/docker/kubernetes:the-version
|
|
506
|
+
variables:
|
|
507
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
508
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
509
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
510
|
+
GIT_STRATEGY: none
|
|
511
|
+
script:
|
|
512
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
513
|
+
- export ENV_SHORT="dev"
|
|
514
|
+
- export APP_DIR="api"
|
|
515
|
+
- export ENV_TYPE="dev"
|
|
516
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
517
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
518
|
+
- 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")"
|
|
519
|
+
- export HOSTNAME="api.dev.test-app.pan.panter.cloud"
|
|
520
|
+
- export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
|
|
521
|
+
- export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
|
|
522
|
+
- export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
|
|
523
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
524
|
+
- export KUBE_APP_NAME="api"
|
|
525
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
526
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
527
|
+
- export RELEASE_NAME="pan-test-app-dev-api"
|
|
528
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
529
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
530
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
531
|
+
- export HELM_ARGS=""
|
|
532
|
+
- export COMPONENT_NAME="api"
|
|
533
|
+
- collapseable_section_end "injectvars"
|
|
534
|
+
- 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
|
|
535
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
|
|
536
|
+
- 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"
|
|
537
|
+
- kubectl config use-context "kube-pan-test-app-dev-api"
|
|
538
|
+
- kubernetesRollback
|
|
539
|
+
environment:
|
|
540
|
+
name: dev/api
|
|
541
|
+
action: access
|
|
542
|
+
rules:
|
|
543
|
+
- when: manual
|
|
544
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
545
|
+
needs: []
|
|
546
|
+
retry: *a1
|
|
547
|
+
interruptible: true
|
|
548
|
+
allow_failure: true
|
|
549
|
+
'api ๐จ app | review ':
|
|
550
|
+
stage: build
|
|
551
|
+
image: path/to/docker/jobs-default:the-version
|
|
552
|
+
variables:
|
|
553
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
554
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
555
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
556
|
+
script:
|
|
557
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
558
|
+
- export ENV_SHORT="review"
|
|
559
|
+
- export APP_DIR="api"
|
|
560
|
+
- export ENV_TYPE="review"
|
|
561
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
562
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
563
|
+
- 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")"
|
|
564
|
+
- export HOSTNAME="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"
|
|
565
|
+
- 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"
|
|
566
|
+
- export HOSTNAME_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"
|
|
567
|
+
- 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"
|
|
568
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
569
|
+
- 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"
|
|
570
|
+
- 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"; })-"
|
|
571
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
572
|
+
- collapseable_section_end "injectvars"
|
|
573
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
|
|
574
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
575
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
576
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
577
|
+
- collapseable_section_end "nodeinstall"
|
|
578
|
+
- cd api
|
|
579
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
580
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
581
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
582
|
+
- collapseable_section_end "nodeinstall"
|
|
583
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
584
|
+
- yarn install --immutable
|
|
585
|
+
- collapseable_section_end "yarninstall"
|
|
586
|
+
- yarn build
|
|
587
|
+
cache:
|
|
588
|
+
- key: api-yarn
|
|
589
|
+
policy: pull-push
|
|
590
|
+
paths:
|
|
591
|
+
- api/.yarn
|
|
592
|
+
- key: api-node-modules
|
|
593
|
+
policy: pull-push
|
|
594
|
+
paths:
|
|
595
|
+
- api/node_modules
|
|
596
|
+
artifacts:
|
|
597
|
+
paths:
|
|
598
|
+
- api/__build_info.json
|
|
599
|
+
- api/.next
|
|
600
|
+
- api/dist
|
|
601
|
+
expire_in: 1 day
|
|
602
|
+
when: always
|
|
603
|
+
reports: {}
|
|
604
|
+
rules:
|
|
605
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
606
|
+
needs: []
|
|
607
|
+
retry: *a1
|
|
608
|
+
interruptible: true
|
|
609
|
+
'api ๐จ docker | review ':
|
|
610
|
+
stage: build
|
|
611
|
+
image: path/to/docker/docker-build:the-version
|
|
612
|
+
services:
|
|
613
|
+
- name: docker:24.0.6-dind
|
|
614
|
+
command:
|
|
615
|
+
- --tls=false
|
|
616
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
617
|
+
variables:
|
|
618
|
+
DOCKER_HOST: tcp://docker:2375
|
|
619
|
+
DOCKER_TLS_CERTDIR: ''
|
|
620
|
+
DOCKER_DRIVER: overlay2
|
|
621
|
+
DOCKER_BUILDKIT: '1'
|
|
622
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
623
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
624
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
625
|
+
script:
|
|
626
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
627
|
+
- export APP_DIR="api"
|
|
628
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
629
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
630
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
631
|
+
- export DOCKER_IMAGE_NAME="review/api"
|
|
632
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
633
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
634
|
+
- |-
|
|
635
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
636
|
+
RUN yarn plugin import workspace-tools
|
|
637
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
638
|
+
- |-
|
|
639
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
|
|
640
|
+
COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
|
|
641
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
642
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
643
|
+
- collapseable_section_end "injectvars"
|
|
644
|
+
- ensureNodeDockerfile
|
|
645
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
646
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
647
|
+
- collapseable_section_end "docker-login"
|
|
648
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
649
|
+
- 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
|
|
650
|
+
- collapseable_section_end "docker-build"
|
|
651
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
652
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
653
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
654
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
655
|
+
- collapseable_section_end "docker-push"
|
|
656
|
+
cache:
|
|
657
|
+
- key: api-yarn
|
|
658
|
+
policy: pull
|
|
659
|
+
paths:
|
|
660
|
+
- api/.yarn
|
|
661
|
+
rules:
|
|
662
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
663
|
+
needs:
|
|
664
|
+
- 'api ๐จ app | review '
|
|
665
|
+
retry: *a1
|
|
666
|
+
interruptible: true
|
|
667
|
+
'api ๐งพ sbom | review ':
|
|
668
|
+
stage: build
|
|
669
|
+
image:
|
|
670
|
+
name: aquasec/trivy:0.58.2
|
|
671
|
+
entrypoint:
|
|
672
|
+
- ''
|
|
673
|
+
variables: {}
|
|
674
|
+
script:
|
|
675
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
676
|
+
- collapseable_section_end "injectvars"
|
|
677
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" api
|
|
678
|
+
artifacts:
|
|
679
|
+
paths:
|
|
680
|
+
- __sbom.json
|
|
681
|
+
rules:
|
|
682
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
683
|
+
needs: []
|
|
684
|
+
retry: *a1
|
|
685
|
+
interruptible: true
|
|
686
|
+
allow_failure: true
|
|
687
|
+
'api ๐ Deploy | review ':
|
|
688
|
+
stage: deploy review
|
|
689
|
+
image: path/to/docker/kubernetes:the-version
|
|
690
|
+
variables:
|
|
691
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
692
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
693
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
694
|
+
script:
|
|
695
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
696
|
+
- export ENV_SHORT="review"
|
|
697
|
+
- export APP_DIR="api"
|
|
698
|
+
- export ENV_TYPE="review"
|
|
699
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
700
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
701
|
+
- 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")"
|
|
702
|
+
- export HOSTNAME="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"
|
|
703
|
+
- 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"
|
|
704
|
+
- export HOSTNAME_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"
|
|
705
|
+
- 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"
|
|
706
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
707
|
+
- 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"
|
|
708
|
+
- 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"; })-"
|
|
709
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
710
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
711
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
712
|
+
- export DOCKER_IMAGE_NAME="review/api"
|
|
713
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
714
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
715
|
+
- 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"
|
|
716
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
717
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
718
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
719
|
+
- export HELM_ARGS=""
|
|
720
|
+
- export COMPONENT_NAME="api"
|
|
721
|
+
- collapseable_section_end "injectvars"
|
|
722
|
+
- 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
|
|
723
|
+
- 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"
|
|
724
|
+
- 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"
|
|
725
|
+
- 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"
|
|
726
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
727
|
+
- |
|
|
728
|
+
cat > __all_values.yml <<EOF
|
|
729
|
+
env:
|
|
730
|
+
secret: {}
|
|
731
|
+
public:
|
|
732
|
+
ENV_SHORT: |-
|
|
733
|
+
review
|
|
734
|
+
APP_DIR: |-
|
|
735
|
+
api
|
|
736
|
+
ENV_TYPE: |-
|
|
737
|
+
review
|
|
738
|
+
BUILD_INFO_BUILD_ID: |-
|
|
739
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
740
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
741
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
742
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
743
|
+
$(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 '1!s/^/ /')
|
|
744
|
+
HOSTNAME: |-
|
|
745
|
+
$(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 '1!s/^/ /')
|
|
746
|
+
ROOT_URL: |-
|
|
747
|
+
$(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 '1!s/^/ /')
|
|
748
|
+
HOSTNAME_INTERNAL: |-
|
|
749
|
+
$(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 '1!s/^/ /')
|
|
750
|
+
ROOT_URL_INTERNAL: |-
|
|
751
|
+
$(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 '1!s/^/ /')
|
|
752
|
+
KUBE_NAMESPACE: |-
|
|
753
|
+
pan-test-app-review
|
|
754
|
+
KUBE_APP_NAME: |-
|
|
755
|
+
$(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 '1!s/^/ /')
|
|
756
|
+
KUBE_APP_NAME_PREFIX: |-
|
|
757
|
+
$(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 '1!s/^/ /')
|
|
758
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
759
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
760
|
+
application:
|
|
761
|
+
host: |-
|
|
762
|
+
$(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 '1!s/^/ /')
|
|
763
|
+
command: |-
|
|
764
|
+
yarn start
|
|
765
|
+
livenessProbe:
|
|
766
|
+
httpGet:
|
|
767
|
+
path: |-
|
|
768
|
+
__health
|
|
769
|
+
readinessProbe:
|
|
770
|
+
httpGet:
|
|
771
|
+
path: |-
|
|
772
|
+
__health
|
|
773
|
+
startupProbe:
|
|
774
|
+
httpGet:
|
|
775
|
+
path: |-
|
|
776
|
+
__health
|
|
777
|
+
jobs:
|
|
778
|
+
migration:
|
|
779
|
+
command: |-
|
|
780
|
+
yarn migrate
|
|
781
|
+
cronjobs: {}
|
|
782
|
+
|
|
783
|
+
EOF
|
|
784
|
+
- collapseable_section_end "writeallvalues"
|
|
785
|
+
- kubernetesCreateSecret
|
|
786
|
+
- kubernetesDeploy
|
|
787
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
788
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
789
|
+
- echo deployment successful ๐ป
|
|
790
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
791
|
+
environment:
|
|
792
|
+
name: review/$CI_COMMIT_REF_NAME/api
|
|
793
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
794
|
+
on_stop: 'api ๐ Stop โ ๏ธ | review '
|
|
795
|
+
auto_stop_in: 1 week
|
|
796
|
+
artifacts:
|
|
797
|
+
reports:
|
|
798
|
+
dotenv: gitlab_environment.env
|
|
799
|
+
rules:
|
|
800
|
+
- when: on_success
|
|
801
|
+
if: $CI_MERGE_REQUEST_ID
|
|
802
|
+
needs:
|
|
803
|
+
- job: api ๐ฎ lint
|
|
804
|
+
artifacts: false
|
|
805
|
+
- job: 'api ๐จ app | review '
|
|
806
|
+
artifacts: false
|
|
807
|
+
- job: 'api ๐จ docker | review '
|
|
808
|
+
artifacts: false
|
|
809
|
+
- job: api ๐งช test
|
|
810
|
+
artifacts: false
|
|
811
|
+
- job: 'api ๐งพ sbom | review '
|
|
812
|
+
artifacts: true
|
|
813
|
+
- job: api ๐ก audit
|
|
814
|
+
artifacts: false
|
|
815
|
+
retry: *a1
|
|
816
|
+
interruptible: true
|
|
817
|
+
allow_failure: false
|
|
818
|
+
'api ๐ Stop โ ๏ธ | review ':
|
|
819
|
+
stage: stop review
|
|
820
|
+
image: path/to/docker/kubernetes:the-version
|
|
821
|
+
variables:
|
|
822
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
823
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
824
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
825
|
+
GIT_STRATEGY: none
|
|
826
|
+
script:
|
|
827
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
828
|
+
- export ENV_SHORT="review"
|
|
829
|
+
- export APP_DIR="api"
|
|
830
|
+
- export ENV_TYPE="review"
|
|
831
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
832
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
833
|
+
- 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")"
|
|
834
|
+
- export HOSTNAME="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"
|
|
835
|
+
- 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"
|
|
836
|
+
- export HOSTNAME_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"
|
|
837
|
+
- 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"
|
|
838
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
839
|
+
- 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"
|
|
840
|
+
- 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"; })-"
|
|
841
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
842
|
+
- 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"
|
|
843
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
844
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
845
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
846
|
+
- export HELM_ARGS=""
|
|
847
|
+
- export COMPONENT_NAME="api"
|
|
848
|
+
- collapseable_section_end "injectvars"
|
|
849
|
+
- 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
|
|
850
|
+
- 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"
|
|
851
|
+
- 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"
|
|
852
|
+
- 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"
|
|
853
|
+
- kubernetesDelete
|
|
854
|
+
- echo 'Disabling component in Dependency Track'
|
|
855
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
|
|
856
|
+
environment:
|
|
857
|
+
name: review/$CI_COMMIT_REF_NAME/api
|
|
858
|
+
action: stop
|
|
859
|
+
rules:
|
|
860
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
861
|
+
when: on_success
|
|
862
|
+
- when: manual
|
|
863
|
+
if: $CI_MERGE_REQUEST_ID
|
|
864
|
+
needs: []
|
|
865
|
+
retry: *a1
|
|
866
|
+
interruptible: true
|
|
867
|
+
allow_failure: true
|
|
868
|
+
'api โฉ๏ธ Rollback โ ๏ธ | review ':
|
|
869
|
+
stage: rollback review
|
|
870
|
+
image: path/to/docker/kubernetes:the-version
|
|
871
|
+
variables:
|
|
872
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
873
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
874
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
875
|
+
GIT_STRATEGY: none
|
|
876
|
+
script:
|
|
877
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
878
|
+
- export ENV_SHORT="review"
|
|
879
|
+
- export APP_DIR="api"
|
|
880
|
+
- export ENV_TYPE="review"
|
|
881
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
882
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
883
|
+
- 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")"
|
|
884
|
+
- export HOSTNAME="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"
|
|
885
|
+
- 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"
|
|
886
|
+
- export HOSTNAME_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"
|
|
887
|
+
- 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"
|
|
888
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
889
|
+
- 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"
|
|
890
|
+
- 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"; })-"
|
|
891
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
892
|
+
- 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"
|
|
893
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
894
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
895
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
896
|
+
- export HELM_ARGS=""
|
|
897
|
+
- export COMPONENT_NAME="api"
|
|
898
|
+
- collapseable_section_end "injectvars"
|
|
899
|
+
- 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
|
|
900
|
+
- 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"
|
|
901
|
+
- 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"
|
|
902
|
+
- 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"
|
|
903
|
+
- kubernetesRollback
|
|
904
|
+
environment:
|
|
905
|
+
name: review/$CI_COMMIT_REF_NAME/api
|
|
906
|
+
action: access
|
|
907
|
+
rules:
|
|
908
|
+
- when: manual
|
|
909
|
+
if: $CI_MERGE_REQUEST_ID
|
|
910
|
+
needs: []
|
|
911
|
+
retry: *a1
|
|
912
|
+
interruptible: true
|
|
913
|
+
allow_failure: true
|
|
914
|
+
'api ๐จ app | stage ':
|
|
915
|
+
stage: build
|
|
916
|
+
image: path/to/docker/jobs-default:the-version
|
|
917
|
+
variables:
|
|
918
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
919
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
920
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
921
|
+
script:
|
|
922
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
923
|
+
- export ENV_SHORT="stage"
|
|
924
|
+
- export APP_DIR="api"
|
|
925
|
+
- export ENV_TYPE="stage"
|
|
926
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
927
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
928
|
+
- 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")"
|
|
929
|
+
- export HOSTNAME="api.stage.test-app.pan.panter.cloud"
|
|
930
|
+
- export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
|
|
931
|
+
- export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
|
|
932
|
+
- export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
|
|
933
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
934
|
+
- export KUBE_APP_NAME="api"
|
|
935
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
936
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
937
|
+
- collapseable_section_end "injectvars"
|
|
938
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
|
|
939
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
940
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
941
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
942
|
+
- collapseable_section_end "nodeinstall"
|
|
943
|
+
- cd api
|
|
944
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
945
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
946
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
947
|
+
- collapseable_section_end "nodeinstall"
|
|
948
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
949
|
+
- yarn install --immutable
|
|
950
|
+
- collapseable_section_end "yarninstall"
|
|
951
|
+
- yarn build
|
|
952
|
+
cache:
|
|
953
|
+
- key: api-yarn
|
|
954
|
+
policy: pull-push
|
|
955
|
+
paths:
|
|
956
|
+
- api/.yarn
|
|
957
|
+
- key: api-node-modules
|
|
958
|
+
policy: pull-push
|
|
959
|
+
paths:
|
|
960
|
+
- api/node_modules
|
|
961
|
+
artifacts:
|
|
962
|
+
paths:
|
|
963
|
+
- api/__build_info.json
|
|
964
|
+
- api/.next
|
|
965
|
+
- api/dist
|
|
966
|
+
expire_in: 1 day
|
|
967
|
+
when: always
|
|
968
|
+
reports: {}
|
|
969
|
+
rules:
|
|
970
|
+
- if: $CI_COMMIT_TAG
|
|
971
|
+
needs: []
|
|
972
|
+
retry: *a1
|
|
973
|
+
interruptible: true
|
|
974
|
+
'api ๐จ docker | stage ':
|
|
975
|
+
stage: build
|
|
976
|
+
image: path/to/docker/docker-build:the-version
|
|
977
|
+
services:
|
|
978
|
+
- name: docker:24.0.6-dind
|
|
979
|
+
command:
|
|
980
|
+
- --tls=false
|
|
981
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
982
|
+
variables:
|
|
983
|
+
DOCKER_HOST: tcp://docker:2375
|
|
984
|
+
DOCKER_TLS_CERTDIR: ''
|
|
985
|
+
DOCKER_DRIVER: overlay2
|
|
986
|
+
DOCKER_BUILDKIT: '1'
|
|
987
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
988
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
989
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
990
|
+
script:
|
|
991
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
992
|
+
- export APP_DIR="api"
|
|
993
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
994
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
995
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
996
|
+
- export DOCKER_IMAGE_NAME="stage/api"
|
|
997
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
998
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
999
|
+
- |-
|
|
1000
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
1001
|
+
RUN yarn plugin import workspace-tools
|
|
1002
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
1003
|
+
- |-
|
|
1004
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
|
|
1005
|
+
COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
|
|
1006
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
1007
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
1008
|
+
- collapseable_section_end "injectvars"
|
|
1009
|
+
- ensureNodeDockerfile
|
|
1010
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
1011
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
1012
|
+
- collapseable_section_end "docker-login"
|
|
1013
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
1014
|
+
- 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
|
|
1015
|
+
- collapseable_section_end "docker-build"
|
|
1016
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
1017
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
1018
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
1019
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
1020
|
+
- collapseable_section_end "docker-push"
|
|
1021
|
+
cache:
|
|
1022
|
+
- key: api-yarn
|
|
1023
|
+
policy: pull
|
|
1024
|
+
paths:
|
|
1025
|
+
- api/.yarn
|
|
1026
|
+
rules:
|
|
1027
|
+
- if: $CI_COMMIT_TAG
|
|
1028
|
+
needs:
|
|
1029
|
+
- 'api ๐จ app | stage '
|
|
1030
|
+
retry: *a1
|
|
1031
|
+
interruptible: true
|
|
1032
|
+
'api ๐งพ sbom | stage ':
|
|
1033
|
+
stage: build
|
|
1034
|
+
image:
|
|
1035
|
+
name: aquasec/trivy:0.58.2
|
|
1036
|
+
entrypoint:
|
|
1037
|
+
- ''
|
|
1038
|
+
variables: {}
|
|
1039
|
+
script:
|
|
1040
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1041
|
+
- collapseable_section_end "injectvars"
|
|
1042
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" api
|
|
1043
|
+
artifacts:
|
|
1044
|
+
paths:
|
|
1045
|
+
- __sbom.json
|
|
1046
|
+
rules:
|
|
1047
|
+
- if: $CI_COMMIT_TAG
|
|
1048
|
+
needs: []
|
|
1049
|
+
retry: *a1
|
|
1050
|
+
interruptible: true
|
|
1051
|
+
allow_failure: true
|
|
1052
|
+
'api ๐ Deploy | stage ':
|
|
1053
|
+
stage: deploy stage
|
|
1054
|
+
image: path/to/docker/kubernetes:the-version
|
|
1055
|
+
variables:
|
|
1056
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1057
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1058
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1059
|
+
script:
|
|
1060
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1061
|
+
- export ENV_SHORT="stage"
|
|
1062
|
+
- export APP_DIR="api"
|
|
1063
|
+
- export ENV_TYPE="stage"
|
|
1064
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1065
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1066
|
+
- 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")"
|
|
1067
|
+
- export HOSTNAME="api.stage.test-app.pan.panter.cloud"
|
|
1068
|
+
- export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
|
|
1069
|
+
- export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
|
|
1070
|
+
- export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
|
|
1071
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
1072
|
+
- export KUBE_APP_NAME="api"
|
|
1073
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1074
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1075
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
1076
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
1077
|
+
- export DOCKER_IMAGE_NAME="stage/api"
|
|
1078
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
1079
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1080
|
+
- export RELEASE_NAME="pan-test-app-stage-api"
|
|
1081
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1082
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
1083
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1084
|
+
- export HELM_ARGS=""
|
|
1085
|
+
- export COMPONENT_NAME="api"
|
|
1086
|
+
- collapseable_section_end "injectvars"
|
|
1087
|
+
- 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
|
|
1088
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
|
|
1089
|
+
- 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"
|
|
1090
|
+
- kubectl config use-context "kube-pan-test-app-stage-api"
|
|
1091
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
1092
|
+
- |
|
|
1093
|
+
cat > __all_values.yml <<EOF
|
|
1094
|
+
env:
|
|
1095
|
+
secret: {}
|
|
1096
|
+
public:
|
|
1097
|
+
ENV_SHORT: |-
|
|
1098
|
+
stage
|
|
1099
|
+
APP_DIR: |-
|
|
1100
|
+
api
|
|
1101
|
+
ENV_TYPE: |-
|
|
1102
|
+
stage
|
|
1103
|
+
BUILD_INFO_BUILD_ID: |-
|
|
1104
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
1105
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
1106
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
1107
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
1108
|
+
$(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 '1!s/^/ /')
|
|
1109
|
+
HOSTNAME: |-
|
|
1110
|
+
api.stage.test-app.pan.panter.cloud
|
|
1111
|
+
ROOT_URL: |-
|
|
1112
|
+
https://api.stage.test-app.pan.panter.cloud
|
|
1113
|
+
HOSTNAME_INTERNAL: |-
|
|
1114
|
+
api.stage.test-app.pan.panter.cloud
|
|
1115
|
+
ROOT_URL_INTERNAL: |-
|
|
1116
|
+
https://api.stage.test-app.pan.panter.cloud
|
|
1117
|
+
KUBE_NAMESPACE: |-
|
|
1118
|
+
pan-test-app-stage
|
|
1119
|
+
KUBE_APP_NAME: |-
|
|
1120
|
+
api
|
|
1121
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
1122
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
1123
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
1124
|
+
application:
|
|
1125
|
+
host: |-
|
|
1126
|
+
api.stage.test-app.pan.panter.cloud
|
|
1127
|
+
command: |-
|
|
1128
|
+
yarn start
|
|
1129
|
+
livenessProbe:
|
|
1130
|
+
httpGet:
|
|
1131
|
+
path: |-
|
|
1132
|
+
__health
|
|
1133
|
+
readinessProbe:
|
|
1134
|
+
httpGet:
|
|
1135
|
+
path: |-
|
|
1136
|
+
__health
|
|
1137
|
+
startupProbe:
|
|
1138
|
+
httpGet:
|
|
1139
|
+
path: |-
|
|
1140
|
+
__health
|
|
1141
|
+
jobs:
|
|
1142
|
+
migration:
|
|
1143
|
+
command: |-
|
|
1144
|
+
yarn migrate
|
|
1145
|
+
cronjobs:
|
|
1146
|
+
send-emails:
|
|
1147
|
+
command: |-
|
|
1148
|
+
yarn send emails
|
|
1149
|
+
schedule: |-
|
|
1150
|
+
0 * * * *
|
|
1151
|
+
|
|
1152
|
+
EOF
|
|
1153
|
+
- collapseable_section_end "writeallvalues"
|
|
1154
|
+
- kubernetesCreateSecret
|
|
1155
|
+
- kubernetesDeploy
|
|
1156
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
1157
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
1158
|
+
- echo deployment successful ๐ป
|
|
1159
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
1160
|
+
environment:
|
|
1161
|
+
name: stage/api
|
|
1162
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1163
|
+
on_stop: 'api ๐ Stop โ ๏ธ | stage '
|
|
1164
|
+
artifacts:
|
|
1165
|
+
reports:
|
|
1166
|
+
dotenv: gitlab_environment.env
|
|
1167
|
+
rules:
|
|
1168
|
+
- when: on_success
|
|
1169
|
+
if: $CI_COMMIT_TAG
|
|
1170
|
+
needs:
|
|
1171
|
+
- job: 'api ๐จ app | stage '
|
|
1172
|
+
artifacts: false
|
|
1173
|
+
- job: 'api ๐จ docker | stage '
|
|
1174
|
+
artifacts: false
|
|
1175
|
+
- job: 'api ๐งพ sbom | stage '
|
|
1176
|
+
artifacts: true
|
|
1177
|
+
retry: *a1
|
|
1178
|
+
interruptible: true
|
|
1179
|
+
allow_failure: false
|
|
1180
|
+
'api ๐ Stop โ ๏ธ | stage ':
|
|
1181
|
+
stage: stop stage
|
|
1182
|
+
image: path/to/docker/kubernetes:the-version
|
|
1183
|
+
variables:
|
|
1184
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1185
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1186
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1187
|
+
GIT_STRATEGY: none
|
|
1188
|
+
script:
|
|
1189
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1190
|
+
- export ENV_SHORT="stage"
|
|
1191
|
+
- export APP_DIR="api"
|
|
1192
|
+
- export ENV_TYPE="stage"
|
|
1193
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1194
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1195
|
+
- 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")"
|
|
1196
|
+
- export HOSTNAME="api.stage.test-app.pan.panter.cloud"
|
|
1197
|
+
- export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
|
|
1198
|
+
- export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
|
|
1199
|
+
- export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
|
|
1200
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
1201
|
+
- export KUBE_APP_NAME="api"
|
|
1202
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1203
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1204
|
+
- export RELEASE_NAME="pan-test-app-stage-api"
|
|
1205
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1206
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
1207
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1208
|
+
- export HELM_ARGS=""
|
|
1209
|
+
- export COMPONENT_NAME="api"
|
|
1210
|
+
- collapseable_section_end "injectvars"
|
|
1211
|
+
- 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
|
|
1212
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
|
|
1213
|
+
- 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"
|
|
1214
|
+
- kubectl config use-context "kube-pan-test-app-stage-api"
|
|
1215
|
+
- kubernetesDelete
|
|
1216
|
+
- echo 'Disabling component in Dependency Track'
|
|
1217
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
|
|
1218
|
+
environment:
|
|
1219
|
+
name: stage/api
|
|
1220
|
+
action: stop
|
|
1221
|
+
rules:
|
|
1222
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
1223
|
+
when: on_success
|
|
1224
|
+
- when: manual
|
|
1225
|
+
if: $CI_COMMIT_TAG
|
|
1226
|
+
needs: []
|
|
1227
|
+
retry: *a1
|
|
1228
|
+
interruptible: true
|
|
1229
|
+
allow_failure: true
|
|
1230
|
+
'api โฉ๏ธ Rollback โ ๏ธ | stage ':
|
|
1231
|
+
stage: rollback stage
|
|
1232
|
+
image: path/to/docker/kubernetes:the-version
|
|
1233
|
+
variables:
|
|
1234
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1235
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1236
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1237
|
+
GIT_STRATEGY: none
|
|
1238
|
+
script:
|
|
1239
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1240
|
+
- export ENV_SHORT="stage"
|
|
1241
|
+
- export APP_DIR="api"
|
|
1242
|
+
- export ENV_TYPE="stage"
|
|
1243
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1244
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1245
|
+
- 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")"
|
|
1246
|
+
- export HOSTNAME="api.stage.test-app.pan.panter.cloud"
|
|
1247
|
+
- export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
|
|
1248
|
+
- export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
|
|
1249
|
+
- export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
|
|
1250
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
1251
|
+
- export KUBE_APP_NAME="api"
|
|
1252
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1253
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1254
|
+
- export RELEASE_NAME="pan-test-app-stage-api"
|
|
1255
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1256
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
1257
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1258
|
+
- export HELM_ARGS=""
|
|
1259
|
+
- export COMPONENT_NAME="api"
|
|
1260
|
+
- collapseable_section_end "injectvars"
|
|
1261
|
+
- 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
|
|
1262
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
|
|
1263
|
+
- 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"
|
|
1264
|
+
- kubectl config use-context "kube-pan-test-app-stage-api"
|
|
1265
|
+
- kubernetesRollback
|
|
1266
|
+
environment:
|
|
1267
|
+
name: stage/api
|
|
1268
|
+
action: access
|
|
1269
|
+
rules:
|
|
1270
|
+
- when: manual
|
|
1271
|
+
if: $CI_COMMIT_TAG
|
|
1272
|
+
needs: []
|
|
1273
|
+
retry: *a1
|
|
1274
|
+
interruptible: true
|
|
1275
|
+
allow_failure: true
|
|
1276
|
+
'api ๐จ app | prod ':
|
|
1277
|
+
stage: build
|
|
1278
|
+
image: path/to/docker/jobs-default:the-version
|
|
1279
|
+
variables:
|
|
1280
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1281
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1282
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1283
|
+
script:
|
|
1284
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1285
|
+
- export ENV_SHORT="prod"
|
|
1286
|
+
- export APP_DIR="api"
|
|
1287
|
+
- export ENV_TYPE="prod"
|
|
1288
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1289
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1290
|
+
- 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")"
|
|
1291
|
+
- export HOSTNAME="api.prod.test-app.pan.panter.cloud"
|
|
1292
|
+
- export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
|
|
1293
|
+
- export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
|
|
1294
|
+
- export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
|
|
1295
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
1296
|
+
- export KUBE_APP_NAME="api"
|
|
1297
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1298
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1299
|
+
- collapseable_section_end "injectvars"
|
|
1300
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
|
|
1301
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1302
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1303
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1304
|
+
- collapseable_section_end "nodeinstall"
|
|
1305
|
+
- cd api
|
|
1306
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1307
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1308
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1309
|
+
- collapseable_section_end "nodeinstall"
|
|
1310
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
1311
|
+
- yarn install --immutable
|
|
1312
|
+
- collapseable_section_end "yarninstall"
|
|
1313
|
+
- yarn build
|
|
1314
|
+
cache:
|
|
1315
|
+
- key: api-yarn
|
|
1316
|
+
policy: pull-push
|
|
1317
|
+
paths:
|
|
1318
|
+
- api/.yarn
|
|
1319
|
+
- key: api-node-modules
|
|
1320
|
+
policy: pull-push
|
|
1321
|
+
paths:
|
|
1322
|
+
- api/node_modules
|
|
1323
|
+
artifacts:
|
|
1324
|
+
paths:
|
|
1325
|
+
- api/__build_info.json
|
|
1326
|
+
- api/.next
|
|
1327
|
+
- api/dist
|
|
1328
|
+
expire_in: 1 day
|
|
1329
|
+
when: always
|
|
1330
|
+
reports: {}
|
|
1331
|
+
rules:
|
|
1332
|
+
- if: $CI_COMMIT_TAG
|
|
1333
|
+
needs: []
|
|
1334
|
+
retry: *a1
|
|
1335
|
+
interruptible: true
|
|
1336
|
+
'api ๐จ docker | prod ':
|
|
1337
|
+
stage: build
|
|
1338
|
+
image: path/to/docker/docker-build:the-version
|
|
1339
|
+
services:
|
|
1340
|
+
- name: docker:24.0.6-dind
|
|
1341
|
+
command:
|
|
1342
|
+
- --tls=false
|
|
1343
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
1344
|
+
variables:
|
|
1345
|
+
DOCKER_HOST: tcp://docker:2375
|
|
1346
|
+
DOCKER_TLS_CERTDIR: ''
|
|
1347
|
+
DOCKER_DRIVER: overlay2
|
|
1348
|
+
DOCKER_BUILDKIT: '1'
|
|
1349
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1350
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1351
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
1352
|
+
script:
|
|
1353
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1354
|
+
- export APP_DIR="api"
|
|
1355
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
1356
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
1357
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
1358
|
+
- export DOCKER_IMAGE_NAME="prod/api"
|
|
1359
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
1360
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1361
|
+
- |-
|
|
1362
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
1363
|
+
RUN yarn plugin import workspace-tools
|
|
1364
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
1365
|
+
- |-
|
|
1366
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
|
|
1367
|
+
COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
|
|
1368
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
1369
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
1370
|
+
- collapseable_section_end "injectvars"
|
|
1371
|
+
- ensureNodeDockerfile
|
|
1372
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
1373
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
1374
|
+
- collapseable_section_end "docker-login"
|
|
1375
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
1376
|
+
- 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
|
|
1377
|
+
- collapseable_section_end "docker-build"
|
|
1378
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
1379
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
1380
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
1381
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
1382
|
+
- collapseable_section_end "docker-push"
|
|
1383
|
+
cache:
|
|
1384
|
+
- key: api-yarn
|
|
1385
|
+
policy: pull
|
|
1386
|
+
paths:
|
|
1387
|
+
- api/.yarn
|
|
1388
|
+
rules:
|
|
1389
|
+
- if: $CI_COMMIT_TAG
|
|
1390
|
+
needs:
|
|
1391
|
+
- 'api ๐จ app | prod '
|
|
1392
|
+
retry: *a1
|
|
1393
|
+
interruptible: true
|
|
1394
|
+
'api ๐งพ sbom | prod ':
|
|
1395
|
+
stage: build
|
|
1396
|
+
image:
|
|
1397
|
+
name: aquasec/trivy:0.58.2
|
|
1398
|
+
entrypoint:
|
|
1399
|
+
- ''
|
|
1400
|
+
variables: {}
|
|
1401
|
+
script:
|
|
1402
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1403
|
+
- collapseable_section_end "injectvars"
|
|
1404
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" api
|
|
1405
|
+
artifacts:
|
|
1406
|
+
paths:
|
|
1407
|
+
- __sbom.json
|
|
1408
|
+
rules:
|
|
1409
|
+
- if: $CI_COMMIT_TAG
|
|
1410
|
+
needs: []
|
|
1411
|
+
retry: *a1
|
|
1412
|
+
interruptible: true
|
|
1413
|
+
allow_failure: true
|
|
1414
|
+
'api ๐ Deploy | prod ':
|
|
1415
|
+
stage: deploy prod
|
|
1416
|
+
image: path/to/docker/kubernetes:the-version
|
|
1417
|
+
variables:
|
|
1418
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1419
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1420
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1421
|
+
script:
|
|
1422
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1423
|
+
- export ENV_SHORT="prod"
|
|
1424
|
+
- export APP_DIR="api"
|
|
1425
|
+
- export ENV_TYPE="prod"
|
|
1426
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1427
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1428
|
+
- 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")"
|
|
1429
|
+
- export HOSTNAME="api.prod.test-app.pan.panter.cloud"
|
|
1430
|
+
- export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
|
|
1431
|
+
- export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
|
|
1432
|
+
- export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
|
|
1433
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
1434
|
+
- export KUBE_APP_NAME="api"
|
|
1435
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1436
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1437
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
1438
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
|
|
1439
|
+
- export DOCKER_IMAGE_NAME="prod/api"
|
|
1440
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
1441
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1442
|
+
- export RELEASE_NAME="pan-test-app-prod-api"
|
|
1443
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1444
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
1445
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1446
|
+
- export HELM_ARGS=""
|
|
1447
|
+
- export COMPONENT_NAME="api"
|
|
1448
|
+
- collapseable_section_end "injectvars"
|
|
1449
|
+
- 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
|
|
1450
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
|
|
1451
|
+
- 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"
|
|
1452
|
+
- kubectl config use-context "kube-pan-test-app-prod-api"
|
|
1453
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
1454
|
+
- |
|
|
1455
|
+
cat > __all_values.yml <<EOF
|
|
1456
|
+
env:
|
|
1457
|
+
secret: {}
|
|
1458
|
+
public:
|
|
1459
|
+
ENV_SHORT: |-
|
|
1460
|
+
prod
|
|
1461
|
+
APP_DIR: |-
|
|
1462
|
+
api
|
|
1463
|
+
ENV_TYPE: |-
|
|
1464
|
+
prod
|
|
1465
|
+
BUILD_INFO_BUILD_ID: |-
|
|
1466
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
1467
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
1468
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
1469
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
1470
|
+
$(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 '1!s/^/ /')
|
|
1471
|
+
HOSTNAME: |-
|
|
1472
|
+
api.prod.test-app.pan.panter.cloud
|
|
1473
|
+
ROOT_URL: |-
|
|
1474
|
+
https://api.prod.test-app.pan.panter.cloud
|
|
1475
|
+
HOSTNAME_INTERNAL: |-
|
|
1476
|
+
api.prod.test-app.pan.panter.cloud
|
|
1477
|
+
ROOT_URL_INTERNAL: |-
|
|
1478
|
+
https://api.prod.test-app.pan.panter.cloud
|
|
1479
|
+
KUBE_NAMESPACE: |-
|
|
1480
|
+
pan-test-app-prod
|
|
1481
|
+
KUBE_APP_NAME: |-
|
|
1482
|
+
api
|
|
1483
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
1484
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
1485
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
1486
|
+
application:
|
|
1487
|
+
host: |-
|
|
1488
|
+
api.prod.test-app.pan.panter.cloud
|
|
1489
|
+
command: |-
|
|
1490
|
+
yarn start
|
|
1491
|
+
livenessProbe:
|
|
1492
|
+
httpGet:
|
|
1493
|
+
path: |-
|
|
1494
|
+
__health
|
|
1495
|
+
readinessProbe:
|
|
1496
|
+
httpGet:
|
|
1497
|
+
path: |-
|
|
1498
|
+
__health
|
|
1499
|
+
startupProbe:
|
|
1500
|
+
httpGet:
|
|
1501
|
+
path: |-
|
|
1502
|
+
__health
|
|
1503
|
+
jobs:
|
|
1504
|
+
migration:
|
|
1505
|
+
command: |-
|
|
1506
|
+
yarn migrate
|
|
1507
|
+
cronjobs:
|
|
1508
|
+
send-emails:
|
|
1509
|
+
command: |-
|
|
1510
|
+
yarn send emails
|
|
1511
|
+
schedule: |-
|
|
1512
|
+
0 * * * *
|
|
1513
|
+
|
|
1514
|
+
EOF
|
|
1515
|
+
- collapseable_section_end "writeallvalues"
|
|
1516
|
+
- kubernetesCreateSecret
|
|
1517
|
+
- kubernetesDeploy
|
|
1518
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
1519
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
1520
|
+
- echo deployment successful ๐ป
|
|
1521
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
1522
|
+
environment:
|
|
1523
|
+
name: prod/api
|
|
1524
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1525
|
+
on_stop: 'api ๐ Stop โ ๏ธ | prod '
|
|
1526
|
+
artifacts:
|
|
1527
|
+
reports:
|
|
1528
|
+
dotenv: gitlab_environment.env
|
|
1529
|
+
rules:
|
|
1530
|
+
- when: manual
|
|
1531
|
+
if: $CI_COMMIT_TAG
|
|
1532
|
+
needs:
|
|
1533
|
+
- job: 'api ๐จ app | prod '
|
|
1534
|
+
artifacts: false
|
|
1535
|
+
- job: 'api ๐จ docker | prod '
|
|
1536
|
+
artifacts: false
|
|
1537
|
+
- job: 'api ๐งพ sbom | prod '
|
|
1538
|
+
artifacts: true
|
|
1539
|
+
retry: *a1
|
|
1540
|
+
interruptible: true
|
|
1541
|
+
allow_failure: true
|
|
1542
|
+
'api ๐ Stop โ ๏ธ | prod ':
|
|
1543
|
+
stage: stop prod
|
|
1544
|
+
image: path/to/docker/kubernetes:the-version
|
|
1545
|
+
variables:
|
|
1546
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1547
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1548
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1549
|
+
GIT_STRATEGY: none
|
|
1550
|
+
script:
|
|
1551
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1552
|
+
- export ENV_SHORT="prod"
|
|
1553
|
+
- export APP_DIR="api"
|
|
1554
|
+
- export ENV_TYPE="prod"
|
|
1555
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1556
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1557
|
+
- 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")"
|
|
1558
|
+
- export HOSTNAME="api.prod.test-app.pan.panter.cloud"
|
|
1559
|
+
- export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
|
|
1560
|
+
- export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
|
|
1561
|
+
- export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
|
|
1562
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
1563
|
+
- export KUBE_APP_NAME="api"
|
|
1564
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1565
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1566
|
+
- export RELEASE_NAME="pan-test-app-prod-api"
|
|
1567
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1568
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
1569
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1570
|
+
- export HELM_ARGS=""
|
|
1571
|
+
- export COMPONENT_NAME="api"
|
|
1572
|
+
- collapseable_section_end "injectvars"
|
|
1573
|
+
- 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
|
|
1574
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
|
|
1575
|
+
- 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"
|
|
1576
|
+
- kubectl config use-context "kube-pan-test-app-prod-api"
|
|
1577
|
+
- kubernetesDelete
|
|
1578
|
+
- echo 'Disabling component in Dependency Track'
|
|
1579
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
|
|
1580
|
+
environment:
|
|
1581
|
+
name: prod/api
|
|
1582
|
+
action: stop
|
|
1583
|
+
rules:
|
|
1584
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
1585
|
+
when: on_success
|
|
1586
|
+
- when: manual
|
|
1587
|
+
if: $CI_COMMIT_TAG
|
|
1588
|
+
needs: []
|
|
1589
|
+
retry: *a1
|
|
1590
|
+
interruptible: true
|
|
1591
|
+
allow_failure: true
|
|
1592
|
+
'api โฉ๏ธ Rollback โ ๏ธ | prod ':
|
|
1593
|
+
stage: rollback prod
|
|
1594
|
+
image: path/to/docker/kubernetes:the-version
|
|
1595
|
+
variables:
|
|
1596
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1597
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1598
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1599
|
+
GIT_STRATEGY: none
|
|
1600
|
+
script:
|
|
1601
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1602
|
+
- export ENV_SHORT="prod"
|
|
1603
|
+
- export APP_DIR="api"
|
|
1604
|
+
- export ENV_TYPE="prod"
|
|
1605
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1606
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1607
|
+
- 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")"
|
|
1608
|
+
- export HOSTNAME="api.prod.test-app.pan.panter.cloud"
|
|
1609
|
+
- export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
|
|
1610
|
+
- export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
|
|
1611
|
+
- export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
|
|
1612
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
1613
|
+
- export KUBE_APP_NAME="api"
|
|
1614
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1615
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1616
|
+
- export RELEASE_NAME="pan-test-app-prod-api"
|
|
1617
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1618
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
|
|
1619
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1620
|
+
- export HELM_ARGS=""
|
|
1621
|
+
- export COMPONENT_NAME="api"
|
|
1622
|
+
- collapseable_section_end "injectvars"
|
|
1623
|
+
- 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
|
|
1624
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
|
|
1625
|
+
- 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"
|
|
1626
|
+
- kubectl config use-context "kube-pan-test-app-prod-api"
|
|
1627
|
+
- kubernetesRollback
|
|
1628
|
+
environment:
|
|
1629
|
+
name: prod/api
|
|
1630
|
+
action: access
|
|
1631
|
+
rules:
|
|
1632
|
+
- when: manual
|
|
1633
|
+
if: $CI_COMMIT_TAG
|
|
1634
|
+
needs: []
|
|
1635
|
+
retry: *a1
|
|
1636
|
+
interruptible: true
|
|
1637
|
+
allow_failure: true
|
|
1638
|
+
www ๐ก audit:
|
|
1639
|
+
stage: test
|
|
1640
|
+
image: path/to/docker/jobs-default:the-version
|
|
1641
|
+
variables:
|
|
1642
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1643
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1644
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1645
|
+
script:
|
|
1646
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1647
|
+
- export APP_PATH="www"
|
|
1648
|
+
- collapseable_section_end "injectvars"
|
|
1649
|
+
- cd www
|
|
1650
|
+
- yarn npm audit --environment production
|
|
1651
|
+
rules:
|
|
1652
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
1653
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1654
|
+
needs: []
|
|
1655
|
+
retry: *a1
|
|
1656
|
+
interruptible: true
|
|
1657
|
+
allow_failure: true
|
|
1658
|
+
www ๐ฎ lint:
|
|
1659
|
+
stage: test
|
|
1660
|
+
image: path/to/docker/jobs-default:the-version
|
|
1661
|
+
variables:
|
|
1662
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1663
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1664
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1665
|
+
script:
|
|
1666
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1667
|
+
- export APP_PATH="www"
|
|
1668
|
+
- collapseable_section_end "injectvars"
|
|
1669
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1670
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1671
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1672
|
+
- collapseable_section_end "nodeinstall"
|
|
1673
|
+
- cd www
|
|
1674
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1675
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1676
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1677
|
+
- collapseable_section_end "nodeinstall"
|
|
1678
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
1679
|
+
- yarn install --immutable
|
|
1680
|
+
- collapseable_section_end "yarninstall"
|
|
1681
|
+
- yarn lint
|
|
1682
|
+
cache:
|
|
1683
|
+
- key: www-yarn
|
|
1684
|
+
policy: pull-push
|
|
1685
|
+
paths:
|
|
1686
|
+
- www/.yarn
|
|
1687
|
+
- key: www-node-modules
|
|
1688
|
+
policy: pull-push
|
|
1689
|
+
paths:
|
|
1690
|
+
- www/node_modules
|
|
1691
|
+
rules:
|
|
1692
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
1693
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1694
|
+
needs: []
|
|
1695
|
+
retry: *a1
|
|
1696
|
+
interruptible: true
|
|
1697
|
+
www ๐งช test:
|
|
1698
|
+
stage: test
|
|
1699
|
+
image: path/to/docker/jobs-testing-chrome:the-version
|
|
1700
|
+
variables:
|
|
1701
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1702
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1703
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1704
|
+
script:
|
|
1705
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1706
|
+
- export APP_PATH="www"
|
|
1707
|
+
- collapseable_section_end "injectvars"
|
|
1708
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1709
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1710
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1711
|
+
- collapseable_section_end "nodeinstall"
|
|
1712
|
+
- cd www
|
|
1713
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1714
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1715
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1716
|
+
- collapseable_section_end "nodeinstall"
|
|
1717
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
1718
|
+
- yarn install --immutable
|
|
1719
|
+
- collapseable_section_end "yarninstall"
|
|
1720
|
+
- yarn test
|
|
1721
|
+
cache:
|
|
1722
|
+
- key: www-yarn
|
|
1723
|
+
policy: pull-push
|
|
1724
|
+
paths:
|
|
1725
|
+
- www/.yarn
|
|
1726
|
+
- key: www-node-modules
|
|
1727
|
+
policy: pull-push
|
|
1728
|
+
paths:
|
|
1729
|
+
- www/node_modules
|
|
1730
|
+
rules:
|
|
1731
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
1732
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1733
|
+
needs: []
|
|
1734
|
+
retry: *a1
|
|
1735
|
+
interruptible: true
|
|
1736
|
+
'www ๐จ app | dev ':
|
|
1737
|
+
stage: build
|
|
1738
|
+
image: path/to/docker/jobs-default:the-version
|
|
1739
|
+
variables:
|
|
1740
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1741
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1742
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1743
|
+
script:
|
|
1744
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1745
|
+
- export ENV_SHORT="dev"
|
|
1746
|
+
- export APP_DIR="www"
|
|
1747
|
+
- export ENV_TYPE="dev"
|
|
1748
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1749
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1750
|
+
- 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")"
|
|
1751
|
+
- export HOSTNAME="www.dev.test-app.pan.panter.cloud"
|
|
1752
|
+
- export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
|
|
1753
|
+
- export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
|
|
1754
|
+
- export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
|
|
1755
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
1756
|
+
- export KUBE_APP_NAME="www"
|
|
1757
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1758
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1759
|
+
- collapseable_section_end "injectvars"
|
|
1760
|
+
- collapseable_section_start "write-dotenv-www" "write dot env for www"
|
|
1761
|
+
- |-
|
|
1762
|
+
cat <<EOF > www/.env
|
|
1763
|
+
ENV_SHORT=dev
|
|
1764
|
+
APP_DIR=www
|
|
1765
|
+
ENV_TYPE=dev
|
|
1766
|
+
HOSTNAME=www.dev.test-app.pan.panter.cloud
|
|
1767
|
+
ROOT_URL=https://www.dev.test-app.pan.panter.cloud
|
|
1768
|
+
HOSTNAME_INTERNAL=www.dev.test-app.pan.panter.cloud
|
|
1769
|
+
ROOT_URL_INTERNAL=https://www.dev.test-app.pan.panter.cloud
|
|
1770
|
+
KUBE_NAMESPACE=pan-test-app-dev
|
|
1771
|
+
KUBE_APP_NAME=www
|
|
1772
|
+
KUBE_APP_NAME_PREFIX=
|
|
1773
|
+
_ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
1774
|
+
EOF
|
|
1775
|
+
- collapseable_section_end "write-dotenv-www"
|
|
1776
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
|
|
1777
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1778
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1779
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1780
|
+
- collapseable_section_end "nodeinstall"
|
|
1781
|
+
- cd www
|
|
1782
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
1783
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1784
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1785
|
+
- collapseable_section_end "nodeinstall"
|
|
1786
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
1787
|
+
- yarn install --immutable
|
|
1788
|
+
- collapseable_section_end "yarninstall"
|
|
1789
|
+
- yarn build
|
|
1790
|
+
cache:
|
|
1791
|
+
- key: www-yarn
|
|
1792
|
+
policy: pull-push
|
|
1793
|
+
paths:
|
|
1794
|
+
- www/.yarn
|
|
1795
|
+
- key: www-node-modules
|
|
1796
|
+
policy: pull-push
|
|
1797
|
+
paths:
|
|
1798
|
+
- www/node_modules
|
|
1799
|
+
artifacts:
|
|
1800
|
+
paths:
|
|
1801
|
+
- www/__build_info.json
|
|
1802
|
+
- www/.next
|
|
1803
|
+
- www/dist
|
|
1804
|
+
exclude:
|
|
1805
|
+
- www/.env
|
|
1806
|
+
expire_in: 1 day
|
|
1807
|
+
when: always
|
|
1808
|
+
reports: {}
|
|
1809
|
+
rules:
|
|
1810
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
1811
|
+
needs: []
|
|
1812
|
+
retry: *a1
|
|
1813
|
+
interruptible: true
|
|
1814
|
+
'www ๐จ docker | dev ':
|
|
1815
|
+
stage: build
|
|
1816
|
+
image: path/to/docker/docker-build:the-version
|
|
1817
|
+
services:
|
|
1818
|
+
- name: docker:24.0.6-dind
|
|
1819
|
+
command:
|
|
1820
|
+
- --tls=false
|
|
1821
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
1822
|
+
variables:
|
|
1823
|
+
DOCKER_HOST: tcp://docker:2375
|
|
1824
|
+
DOCKER_TLS_CERTDIR: ''
|
|
1825
|
+
DOCKER_DRIVER: overlay2
|
|
1826
|
+
DOCKER_BUILDKIT: '1'
|
|
1827
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1828
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1829
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
1830
|
+
script:
|
|
1831
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1832
|
+
- export APP_DIR="www"
|
|
1833
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
1834
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
1835
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
1836
|
+
- export DOCKER_IMAGE_NAME="dev/www"
|
|
1837
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
1838
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1839
|
+
- |-
|
|
1840
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
1841
|
+
RUN yarn plugin import workspace-tools
|
|
1842
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
1843
|
+
- |-
|
|
1844
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
|
|
1845
|
+
COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
|
|
1846
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
1847
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
1848
|
+
- collapseable_section_end "injectvars"
|
|
1849
|
+
- ensureNodeDockerfile
|
|
1850
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
1851
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
1852
|
+
- collapseable_section_end "docker-login"
|
|
1853
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
1854
|
+
- 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
|
|
1855
|
+
- collapseable_section_end "docker-build"
|
|
1856
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
1857
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
1858
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
1859
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
1860
|
+
- collapseable_section_end "docker-push"
|
|
1861
|
+
cache:
|
|
1862
|
+
- key: www-yarn
|
|
1863
|
+
policy: pull
|
|
1864
|
+
paths:
|
|
1865
|
+
- www/.yarn
|
|
1866
|
+
rules:
|
|
1867
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
1868
|
+
needs:
|
|
1869
|
+
- 'www ๐จ app | dev '
|
|
1870
|
+
retry: *a1
|
|
1871
|
+
interruptible: true
|
|
1872
|
+
'www ๐งพ sbom | dev ':
|
|
1873
|
+
stage: build
|
|
1874
|
+
image:
|
|
1875
|
+
name: aquasec/trivy:0.58.2
|
|
1876
|
+
entrypoint:
|
|
1877
|
+
- ''
|
|
1878
|
+
variables: {}
|
|
1879
|
+
script:
|
|
1880
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1881
|
+
- collapseable_section_end "injectvars"
|
|
1882
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" www
|
|
1883
|
+
artifacts:
|
|
1884
|
+
paths:
|
|
1885
|
+
- __sbom.json
|
|
1886
|
+
rules:
|
|
1887
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
1888
|
+
needs: []
|
|
1889
|
+
retry: *a1
|
|
1890
|
+
interruptible: true
|
|
1891
|
+
allow_failure: true
|
|
1892
|
+
'www ๐ Deploy | dev ':
|
|
1893
|
+
stage: deploy dev
|
|
1894
|
+
image: path/to/docker/kubernetes:the-version
|
|
1895
|
+
variables:
|
|
1896
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1897
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1898
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1899
|
+
script:
|
|
1900
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1901
|
+
- export ENV_SHORT="dev"
|
|
1902
|
+
- export APP_DIR="www"
|
|
1903
|
+
- export ENV_TYPE="dev"
|
|
1904
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1905
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1906
|
+
- 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")"
|
|
1907
|
+
- export HOSTNAME="www.dev.test-app.pan.panter.cloud"
|
|
1908
|
+
- export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
|
|
1909
|
+
- export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
|
|
1910
|
+
- export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
|
|
1911
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
1912
|
+
- export KUBE_APP_NAME="www"
|
|
1913
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1914
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
1915
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
1916
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
1917
|
+
- export DOCKER_IMAGE_NAME="dev/www"
|
|
1918
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
1919
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1920
|
+
- export RELEASE_NAME="pan-test-app-dev-www"
|
|
1921
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1922
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
1923
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1924
|
+
- export HELM_ARGS=""
|
|
1925
|
+
- export COMPONENT_NAME="www"
|
|
1926
|
+
- collapseable_section_end "injectvars"
|
|
1927
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-www" --server="$CL_dev_www_KUBE_URL" --certificate-authority <(echo $CL_dev_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
1928
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-www" --token="$CL_dev_www_KUBE_TOKEN"
|
|
1929
|
+
- kubectl config set-context "kube-pan-test-app-dev-www" --cluster="kube-pan-test-app-dev-www" --user="kube-pan-test-app-dev-www" --namespace="pan-test-app-dev"
|
|
1930
|
+
- kubectl config use-context "kube-pan-test-app-dev-www"
|
|
1931
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
1932
|
+
- |
|
|
1933
|
+
cat > __all_values.yml <<EOF
|
|
1934
|
+
env:
|
|
1935
|
+
secret: {}
|
|
1936
|
+
public:
|
|
1937
|
+
ENV_SHORT: |-
|
|
1938
|
+
dev
|
|
1939
|
+
APP_DIR: |-
|
|
1940
|
+
www
|
|
1941
|
+
ENV_TYPE: |-
|
|
1942
|
+
dev
|
|
1943
|
+
BUILD_INFO_BUILD_ID: |-
|
|
1944
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
1945
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
1946
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
1947
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
1948
|
+
$(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 '1!s/^/ /')
|
|
1949
|
+
HOSTNAME: |-
|
|
1950
|
+
www.dev.test-app.pan.panter.cloud
|
|
1951
|
+
ROOT_URL: |-
|
|
1952
|
+
https://www.dev.test-app.pan.panter.cloud
|
|
1953
|
+
HOSTNAME_INTERNAL: |-
|
|
1954
|
+
www.dev.test-app.pan.panter.cloud
|
|
1955
|
+
ROOT_URL_INTERNAL: |-
|
|
1956
|
+
https://www.dev.test-app.pan.panter.cloud
|
|
1957
|
+
KUBE_NAMESPACE: |-
|
|
1958
|
+
pan-test-app-dev
|
|
1959
|
+
KUBE_APP_NAME: |-
|
|
1960
|
+
www
|
|
1961
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
1962
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
1963
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
1964
|
+
application:
|
|
1965
|
+
host: |-
|
|
1966
|
+
www.dev.test-app.pan.panter.cloud
|
|
1967
|
+
command: |-
|
|
1968
|
+
yarn start
|
|
1969
|
+
livenessProbe:
|
|
1970
|
+
httpGet:
|
|
1971
|
+
path: |-
|
|
1972
|
+
__health
|
|
1973
|
+
readinessProbe:
|
|
1974
|
+
httpGet:
|
|
1975
|
+
path: |-
|
|
1976
|
+
__health
|
|
1977
|
+
startupProbe:
|
|
1978
|
+
httpGet:
|
|
1979
|
+
path: |-
|
|
1980
|
+
__health
|
|
1981
|
+
|
|
1982
|
+
EOF
|
|
1983
|
+
- collapseable_section_end "writeallvalues"
|
|
1984
|
+
- kubernetesCreateSecret
|
|
1985
|
+
- kubernetesDeploy
|
|
1986
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
1987
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
1988
|
+
- echo deployment successful ๐ป
|
|
1989
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
1990
|
+
environment:
|
|
1991
|
+
name: dev/www
|
|
1992
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1993
|
+
on_stop: 'www ๐ Stop โ ๏ธ | dev '
|
|
1994
|
+
auto_stop_in: 4 weeks
|
|
1995
|
+
artifacts:
|
|
1996
|
+
reports:
|
|
1997
|
+
dotenv: gitlab_environment.env
|
|
1998
|
+
rules:
|
|
1999
|
+
- when: on_success
|
|
2000
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
2001
|
+
needs:
|
|
2002
|
+
- job: www ๐ฎ lint
|
|
2003
|
+
artifacts: false
|
|
2004
|
+
- job: 'www ๐จ app | dev '
|
|
2005
|
+
artifacts: false
|
|
2006
|
+
- job: 'www ๐จ docker | dev '
|
|
2007
|
+
artifacts: false
|
|
2008
|
+
- job: www ๐งช test
|
|
2009
|
+
artifacts: false
|
|
2010
|
+
- job: 'www ๐งพ sbom | dev '
|
|
2011
|
+
artifacts: true
|
|
2012
|
+
- job: www ๐ก audit
|
|
2013
|
+
artifacts: false
|
|
2014
|
+
retry: *a1
|
|
2015
|
+
interruptible: true
|
|
2016
|
+
allow_failure: false
|
|
2017
|
+
'www ๐ Stop โ ๏ธ | dev ':
|
|
2018
|
+
stage: stop dev
|
|
2019
|
+
image: path/to/docker/kubernetes:the-version
|
|
2020
|
+
variables:
|
|
2021
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2022
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2023
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2024
|
+
GIT_STRATEGY: none
|
|
2025
|
+
script:
|
|
2026
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2027
|
+
- export ENV_SHORT="dev"
|
|
2028
|
+
- export APP_DIR="www"
|
|
2029
|
+
- export ENV_TYPE="dev"
|
|
2030
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2031
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2032
|
+
- 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")"
|
|
2033
|
+
- export HOSTNAME="www.dev.test-app.pan.panter.cloud"
|
|
2034
|
+
- export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
|
|
2035
|
+
- export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
|
|
2036
|
+
- export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
|
|
2037
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
2038
|
+
- export KUBE_APP_NAME="www"
|
|
2039
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2040
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2041
|
+
- export RELEASE_NAME="pan-test-app-dev-www"
|
|
2042
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2043
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2044
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2045
|
+
- export HELM_ARGS=""
|
|
2046
|
+
- export COMPONENT_NAME="www"
|
|
2047
|
+
- collapseable_section_end "injectvars"
|
|
2048
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-www" --server="$CL_dev_www_KUBE_URL" --certificate-authority <(echo $CL_dev_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2049
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-www" --token="$CL_dev_www_KUBE_TOKEN"
|
|
2050
|
+
- kubectl config set-context "kube-pan-test-app-dev-www" --cluster="kube-pan-test-app-dev-www" --user="kube-pan-test-app-dev-www" --namespace="pan-test-app-dev"
|
|
2051
|
+
- kubectl config use-context "kube-pan-test-app-dev-www"
|
|
2052
|
+
- kubernetesDelete
|
|
2053
|
+
- echo 'Disabling component in Dependency Track'
|
|
2054
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
|
|
2055
|
+
environment:
|
|
2056
|
+
name: dev/www
|
|
2057
|
+
action: stop
|
|
2058
|
+
rules:
|
|
2059
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
2060
|
+
when: on_success
|
|
2061
|
+
- when: manual
|
|
2062
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
2063
|
+
needs: []
|
|
2064
|
+
retry: *a1
|
|
2065
|
+
interruptible: true
|
|
2066
|
+
allow_failure: true
|
|
2067
|
+
'www โฉ๏ธ Rollback โ ๏ธ | dev ':
|
|
2068
|
+
stage: rollback dev
|
|
2069
|
+
image: path/to/docker/kubernetes:the-version
|
|
2070
|
+
variables:
|
|
2071
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2072
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2073
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2074
|
+
GIT_STRATEGY: none
|
|
2075
|
+
script:
|
|
2076
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2077
|
+
- export ENV_SHORT="dev"
|
|
2078
|
+
- export APP_DIR="www"
|
|
2079
|
+
- export ENV_TYPE="dev"
|
|
2080
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2081
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2082
|
+
- 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")"
|
|
2083
|
+
- export HOSTNAME="www.dev.test-app.pan.panter.cloud"
|
|
2084
|
+
- export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
|
|
2085
|
+
- export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
|
|
2086
|
+
- export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
|
|
2087
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
2088
|
+
- export KUBE_APP_NAME="www"
|
|
2089
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2090
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2091
|
+
- export RELEASE_NAME="pan-test-app-dev-www"
|
|
2092
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2093
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2094
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2095
|
+
- export HELM_ARGS=""
|
|
2096
|
+
- export COMPONENT_NAME="www"
|
|
2097
|
+
- collapseable_section_end "injectvars"
|
|
2098
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-www" --server="$CL_dev_www_KUBE_URL" --certificate-authority <(echo $CL_dev_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2099
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-www" --token="$CL_dev_www_KUBE_TOKEN"
|
|
2100
|
+
- kubectl config set-context "kube-pan-test-app-dev-www" --cluster="kube-pan-test-app-dev-www" --user="kube-pan-test-app-dev-www" --namespace="pan-test-app-dev"
|
|
2101
|
+
- kubectl config use-context "kube-pan-test-app-dev-www"
|
|
2102
|
+
- kubernetesRollback
|
|
2103
|
+
environment:
|
|
2104
|
+
name: dev/www
|
|
2105
|
+
action: access
|
|
2106
|
+
rules:
|
|
2107
|
+
- when: manual
|
|
2108
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
2109
|
+
needs: []
|
|
2110
|
+
retry: *a1
|
|
2111
|
+
interruptible: true
|
|
2112
|
+
allow_failure: true
|
|
2113
|
+
'www ๐จ app | review ':
|
|
2114
|
+
stage: build
|
|
2115
|
+
image: path/to/docker/jobs-default:the-version
|
|
2116
|
+
variables:
|
|
2117
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2118
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2119
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2120
|
+
script:
|
|
2121
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2122
|
+
- export ENV_SHORT="review"
|
|
2123
|
+
- export APP_DIR="www"
|
|
2124
|
+
- export ENV_TYPE="review"
|
|
2125
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2126
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2127
|
+
- 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")"
|
|
2128
|
+
- export HOSTNAME="www.$([ -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"
|
|
2129
|
+
- export ROOT_URL="https://www.$([ -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"
|
|
2130
|
+
- export HOSTNAME_INTERNAL="www.$([ -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"
|
|
2131
|
+
- export ROOT_URL_INTERNAL="https://www.$([ -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"
|
|
2132
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
2133
|
+
- 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"; })-www"
|
|
2134
|
+
- 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"; })-"
|
|
2135
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2136
|
+
- collapseable_section_end "injectvars"
|
|
2137
|
+
- collapseable_section_start "write-dotenv-www" "write dot env for www"
|
|
2138
|
+
- |-
|
|
2139
|
+
cat <<EOF > www/.env
|
|
2140
|
+
ENV_SHORT=review
|
|
2141
|
+
APP_DIR=www
|
|
2142
|
+
ENV_TYPE=review
|
|
2143
|
+
HOSTNAME=$(printf %s "www.$([ -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" | escapeForDotEnv)
|
|
2144
|
+
ROOT_URL=$(printf %s "https://www.$([ -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" | escapeForDotEnv)
|
|
2145
|
+
HOSTNAME_INTERNAL=$(printf %s "www.$([ -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" | escapeForDotEnv)
|
|
2146
|
+
ROOT_URL_INTERNAL=$(printf %s "https://www.$([ -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" | escapeForDotEnv)
|
|
2147
|
+
KUBE_NAMESPACE=pan-test-app-review
|
|
2148
|
+
KUBE_APP_NAME=$(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"; })-www" | escapeForDotEnv)
|
|
2149
|
+
KUBE_APP_NAME_PREFIX=$(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"; })-" | escapeForDotEnv)
|
|
2150
|
+
_ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
2151
|
+
EOF
|
|
2152
|
+
- collapseable_section_end "write-dotenv-www"
|
|
2153
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
|
|
2154
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
2155
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2156
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2157
|
+
- collapseable_section_end "nodeinstall"
|
|
2158
|
+
- cd www
|
|
2159
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
2160
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2161
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2162
|
+
- collapseable_section_end "nodeinstall"
|
|
2163
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
2164
|
+
- yarn install --immutable
|
|
2165
|
+
- collapseable_section_end "yarninstall"
|
|
2166
|
+
- yarn build
|
|
2167
|
+
cache:
|
|
2168
|
+
- key: www-yarn
|
|
2169
|
+
policy: pull-push
|
|
2170
|
+
paths:
|
|
2171
|
+
- www/.yarn
|
|
2172
|
+
- key: www-node-modules
|
|
2173
|
+
policy: pull-push
|
|
2174
|
+
paths:
|
|
2175
|
+
- www/node_modules
|
|
2176
|
+
artifacts:
|
|
2177
|
+
paths:
|
|
2178
|
+
- www/__build_info.json
|
|
2179
|
+
- www/.next
|
|
2180
|
+
- www/dist
|
|
2181
|
+
exclude:
|
|
2182
|
+
- www/.env
|
|
2183
|
+
expire_in: 1 day
|
|
2184
|
+
when: always
|
|
2185
|
+
reports: {}
|
|
2186
|
+
rules:
|
|
2187
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
2188
|
+
needs: []
|
|
2189
|
+
retry: *a1
|
|
2190
|
+
interruptible: true
|
|
2191
|
+
'www ๐จ docker | review ':
|
|
2192
|
+
stage: build
|
|
2193
|
+
image: path/to/docker/docker-build:the-version
|
|
2194
|
+
services:
|
|
2195
|
+
- name: docker:24.0.6-dind
|
|
2196
|
+
command:
|
|
2197
|
+
- --tls=false
|
|
2198
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
2199
|
+
variables:
|
|
2200
|
+
DOCKER_HOST: tcp://docker:2375
|
|
2201
|
+
DOCKER_TLS_CERTDIR: ''
|
|
2202
|
+
DOCKER_DRIVER: overlay2
|
|
2203
|
+
DOCKER_BUILDKIT: '1'
|
|
2204
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2205
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2206
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
2207
|
+
script:
|
|
2208
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2209
|
+
- export APP_DIR="www"
|
|
2210
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
2211
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
2212
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
2213
|
+
- export DOCKER_IMAGE_NAME="review/www"
|
|
2214
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
2215
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2216
|
+
- |-
|
|
2217
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
2218
|
+
RUN yarn plugin import workspace-tools
|
|
2219
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
2220
|
+
- |-
|
|
2221
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
|
|
2222
|
+
COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
|
|
2223
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
2224
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
2225
|
+
- collapseable_section_end "injectvars"
|
|
2226
|
+
- ensureNodeDockerfile
|
|
2227
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
2228
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
2229
|
+
- collapseable_section_end "docker-login"
|
|
2230
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
2231
|
+
- 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
|
|
2232
|
+
- collapseable_section_end "docker-build"
|
|
2233
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
2234
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
2235
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
2236
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
2237
|
+
- collapseable_section_end "docker-push"
|
|
2238
|
+
cache:
|
|
2239
|
+
- key: www-yarn
|
|
2240
|
+
policy: pull
|
|
2241
|
+
paths:
|
|
2242
|
+
- www/.yarn
|
|
2243
|
+
rules:
|
|
2244
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
2245
|
+
needs:
|
|
2246
|
+
- 'www ๐จ app | review '
|
|
2247
|
+
retry: *a1
|
|
2248
|
+
interruptible: true
|
|
2249
|
+
'www ๐งพ sbom | review ':
|
|
2250
|
+
stage: build
|
|
2251
|
+
image:
|
|
2252
|
+
name: aquasec/trivy:0.58.2
|
|
2253
|
+
entrypoint:
|
|
2254
|
+
- ''
|
|
2255
|
+
variables: {}
|
|
2256
|
+
script:
|
|
2257
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2258
|
+
- collapseable_section_end "injectvars"
|
|
2259
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" www
|
|
2260
|
+
artifacts:
|
|
2261
|
+
paths:
|
|
2262
|
+
- __sbom.json
|
|
2263
|
+
rules:
|
|
2264
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
2265
|
+
needs: []
|
|
2266
|
+
retry: *a1
|
|
2267
|
+
interruptible: true
|
|
2268
|
+
allow_failure: true
|
|
2269
|
+
'www ๐ Deploy | review ':
|
|
2270
|
+
stage: deploy review
|
|
2271
|
+
image: path/to/docker/kubernetes:the-version
|
|
2272
|
+
variables:
|
|
2273
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2274
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2275
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2276
|
+
script:
|
|
2277
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2278
|
+
- export ENV_SHORT="review"
|
|
2279
|
+
- export APP_DIR="www"
|
|
2280
|
+
- export ENV_TYPE="review"
|
|
2281
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2282
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2283
|
+
- 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")"
|
|
2284
|
+
- export HOSTNAME="www.$([ -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"
|
|
2285
|
+
- export ROOT_URL="https://www.$([ -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"
|
|
2286
|
+
- export HOSTNAME_INTERNAL="www.$([ -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"
|
|
2287
|
+
- export ROOT_URL_INTERNAL="https://www.$([ -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"
|
|
2288
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
2289
|
+
- 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"; })-www"
|
|
2290
|
+
- 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"; })-"
|
|
2291
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2292
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
2293
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
2294
|
+
- export DOCKER_IMAGE_NAME="review/www"
|
|
2295
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
2296
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2297
|
+
- 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"; })-www"
|
|
2298
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2299
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2300
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2301
|
+
- export HELM_ARGS=""
|
|
2302
|
+
- export COMPONENT_NAME="www"
|
|
2303
|
+
- collapseable_section_end "injectvars"
|
|
2304
|
+
- 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"; })-www" --server="$CL_review_www_KUBE_URL" --certificate-authority <(echo $CL_review_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2305
|
+
- 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"; })-www" --token="$CL_review_www_KUBE_TOKEN"
|
|
2306
|
+
- 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"; })-www" --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"; })-www" --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"; })-www" --namespace="pan-test-app-review"
|
|
2307
|
+
- 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"; })-www"
|
|
2308
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
2309
|
+
- |
|
|
2310
|
+
cat > __all_values.yml <<EOF
|
|
2311
|
+
env:
|
|
2312
|
+
secret: {}
|
|
2313
|
+
public:
|
|
2314
|
+
ENV_SHORT: |-
|
|
2315
|
+
review
|
|
2316
|
+
APP_DIR: |-
|
|
2317
|
+
www
|
|
2318
|
+
ENV_TYPE: |-
|
|
2319
|
+
review
|
|
2320
|
+
BUILD_INFO_BUILD_ID: |-
|
|
2321
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
2322
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
2323
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
2324
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
2325
|
+
$(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 '1!s/^/ /')
|
|
2326
|
+
HOSTNAME: |-
|
|
2327
|
+
$(printf %s "www.$([ -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 '1!s/^/ /')
|
|
2328
|
+
ROOT_URL: |-
|
|
2329
|
+
$(printf %s "https://www.$([ -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 '1!s/^/ /')
|
|
2330
|
+
HOSTNAME_INTERNAL: |-
|
|
2331
|
+
$(printf %s "www.$([ -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 '1!s/^/ /')
|
|
2332
|
+
ROOT_URL_INTERNAL: |-
|
|
2333
|
+
$(printf %s "https://www.$([ -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 '1!s/^/ /')
|
|
2334
|
+
KUBE_NAMESPACE: |-
|
|
2335
|
+
pan-test-app-review
|
|
2336
|
+
KUBE_APP_NAME: |-
|
|
2337
|
+
$(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"; })-www" | sed '1!s/^/ /')
|
|
2338
|
+
KUBE_APP_NAME_PREFIX: |-
|
|
2339
|
+
$(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 '1!s/^/ /')
|
|
2340
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
2341
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
2342
|
+
application:
|
|
2343
|
+
host: |-
|
|
2344
|
+
$(printf %s "www.$([ -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 '1!s/^/ /')
|
|
2345
|
+
command: |-
|
|
2346
|
+
yarn start
|
|
2347
|
+
livenessProbe:
|
|
2348
|
+
httpGet:
|
|
2349
|
+
path: |-
|
|
2350
|
+
__health
|
|
2351
|
+
readinessProbe:
|
|
2352
|
+
httpGet:
|
|
2353
|
+
path: |-
|
|
2354
|
+
__health
|
|
2355
|
+
startupProbe:
|
|
2356
|
+
httpGet:
|
|
2357
|
+
path: |-
|
|
2358
|
+
__health
|
|
2359
|
+
|
|
2360
|
+
EOF
|
|
2361
|
+
- collapseable_section_end "writeallvalues"
|
|
2362
|
+
- kubernetesCreateSecret
|
|
2363
|
+
- kubernetesDeploy
|
|
2364
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
2365
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
2366
|
+
- echo deployment successful ๐ป
|
|
2367
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
2368
|
+
environment:
|
|
2369
|
+
name: review/$CI_COMMIT_REF_NAME/www
|
|
2370
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2371
|
+
on_stop: 'www ๐ Stop โ ๏ธ | review '
|
|
2372
|
+
auto_stop_in: 1 week
|
|
2373
|
+
artifacts:
|
|
2374
|
+
reports:
|
|
2375
|
+
dotenv: gitlab_environment.env
|
|
2376
|
+
rules:
|
|
2377
|
+
- when: on_success
|
|
2378
|
+
if: $CI_MERGE_REQUEST_ID
|
|
2379
|
+
needs:
|
|
2380
|
+
- job: www ๐ฎ lint
|
|
2381
|
+
artifacts: false
|
|
2382
|
+
- job: 'www ๐จ app | review '
|
|
2383
|
+
artifacts: false
|
|
2384
|
+
- job: 'www ๐จ docker | review '
|
|
2385
|
+
artifacts: false
|
|
2386
|
+
- job: www ๐งช test
|
|
2387
|
+
artifacts: false
|
|
2388
|
+
- job: 'www ๐งพ sbom | review '
|
|
2389
|
+
artifacts: true
|
|
2390
|
+
- job: www ๐ก audit
|
|
2391
|
+
artifacts: false
|
|
2392
|
+
retry: *a1
|
|
2393
|
+
interruptible: true
|
|
2394
|
+
allow_failure: false
|
|
2395
|
+
'www ๐ Stop โ ๏ธ | review ':
|
|
2396
|
+
stage: stop review
|
|
2397
|
+
image: path/to/docker/kubernetes:the-version
|
|
2398
|
+
variables:
|
|
2399
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2400
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2401
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2402
|
+
GIT_STRATEGY: none
|
|
2403
|
+
script:
|
|
2404
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2405
|
+
- export ENV_SHORT="review"
|
|
2406
|
+
- export APP_DIR="www"
|
|
2407
|
+
- export ENV_TYPE="review"
|
|
2408
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2409
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2410
|
+
- 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")"
|
|
2411
|
+
- export HOSTNAME="www.$([ -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"
|
|
2412
|
+
- export ROOT_URL="https://www.$([ -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"
|
|
2413
|
+
- export HOSTNAME_INTERNAL="www.$([ -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"
|
|
2414
|
+
- export ROOT_URL_INTERNAL="https://www.$([ -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"
|
|
2415
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
2416
|
+
- 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"; })-www"
|
|
2417
|
+
- 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"; })-"
|
|
2418
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2419
|
+
- 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"; })-www"
|
|
2420
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2421
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2422
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2423
|
+
- export HELM_ARGS=""
|
|
2424
|
+
- export COMPONENT_NAME="www"
|
|
2425
|
+
- collapseable_section_end "injectvars"
|
|
2426
|
+
- 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"; })-www" --server="$CL_review_www_KUBE_URL" --certificate-authority <(echo $CL_review_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2427
|
+
- 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"; })-www" --token="$CL_review_www_KUBE_TOKEN"
|
|
2428
|
+
- 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"; })-www" --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"; })-www" --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"; })-www" --namespace="pan-test-app-review"
|
|
2429
|
+
- 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"; })-www"
|
|
2430
|
+
- kubernetesDelete
|
|
2431
|
+
- echo 'Disabling component in Dependency Track'
|
|
2432
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
|
|
2433
|
+
environment:
|
|
2434
|
+
name: review/$CI_COMMIT_REF_NAME/www
|
|
2435
|
+
action: stop
|
|
2436
|
+
rules:
|
|
2437
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
2438
|
+
when: on_success
|
|
2439
|
+
- when: manual
|
|
2440
|
+
if: $CI_MERGE_REQUEST_ID
|
|
2441
|
+
needs: []
|
|
2442
|
+
retry: *a1
|
|
2443
|
+
interruptible: true
|
|
2444
|
+
allow_failure: true
|
|
2445
|
+
'www โฉ๏ธ Rollback โ ๏ธ | review ':
|
|
2446
|
+
stage: rollback review
|
|
2447
|
+
image: path/to/docker/kubernetes:the-version
|
|
2448
|
+
variables:
|
|
2449
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2450
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2451
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2452
|
+
GIT_STRATEGY: none
|
|
2453
|
+
script:
|
|
2454
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2455
|
+
- export ENV_SHORT="review"
|
|
2456
|
+
- export APP_DIR="www"
|
|
2457
|
+
- export ENV_TYPE="review"
|
|
2458
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2459
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2460
|
+
- 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")"
|
|
2461
|
+
- export HOSTNAME="www.$([ -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"
|
|
2462
|
+
- export ROOT_URL="https://www.$([ -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"
|
|
2463
|
+
- export HOSTNAME_INTERNAL="www.$([ -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"
|
|
2464
|
+
- export ROOT_URL_INTERNAL="https://www.$([ -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"
|
|
2465
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
2466
|
+
- 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"; })-www"
|
|
2467
|
+
- 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"; })-"
|
|
2468
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2469
|
+
- 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"; })-www"
|
|
2470
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2471
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2472
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2473
|
+
- export HELM_ARGS=""
|
|
2474
|
+
- export COMPONENT_NAME="www"
|
|
2475
|
+
- collapseable_section_end "injectvars"
|
|
2476
|
+
- 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"; })-www" --server="$CL_review_www_KUBE_URL" --certificate-authority <(echo $CL_review_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2477
|
+
- 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"; })-www" --token="$CL_review_www_KUBE_TOKEN"
|
|
2478
|
+
- 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"; })-www" --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"; })-www" --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"; })-www" --namespace="pan-test-app-review"
|
|
2479
|
+
- 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"; })-www"
|
|
2480
|
+
- kubernetesRollback
|
|
2481
|
+
environment:
|
|
2482
|
+
name: review/$CI_COMMIT_REF_NAME/www
|
|
2483
|
+
action: access
|
|
2484
|
+
rules:
|
|
2485
|
+
- when: manual
|
|
2486
|
+
if: $CI_MERGE_REQUEST_ID
|
|
2487
|
+
needs: []
|
|
2488
|
+
retry: *a1
|
|
2489
|
+
interruptible: true
|
|
2490
|
+
allow_failure: true
|
|
2491
|
+
'www ๐จ app | stage ':
|
|
2492
|
+
stage: build
|
|
2493
|
+
image: path/to/docker/jobs-default:the-version
|
|
2494
|
+
variables:
|
|
2495
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2496
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2497
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2498
|
+
script:
|
|
2499
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2500
|
+
- export ENV_SHORT="stage"
|
|
2501
|
+
- export APP_DIR="www"
|
|
2502
|
+
- export ENV_TYPE="stage"
|
|
2503
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2504
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2505
|
+
- 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")"
|
|
2506
|
+
- export HOSTNAME="www.stage.test-app.pan.panter.cloud"
|
|
2507
|
+
- export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
|
|
2508
|
+
- export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
|
|
2509
|
+
- export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
|
|
2510
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
2511
|
+
- export KUBE_APP_NAME="www"
|
|
2512
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2513
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2514
|
+
- collapseable_section_end "injectvars"
|
|
2515
|
+
- collapseable_section_start "write-dotenv-www" "write dot env for www"
|
|
2516
|
+
- |-
|
|
2517
|
+
cat <<EOF > www/.env
|
|
2518
|
+
ENV_SHORT=stage
|
|
2519
|
+
APP_DIR=www
|
|
2520
|
+
ENV_TYPE=stage
|
|
2521
|
+
HOSTNAME=www.stage.test-app.pan.panter.cloud
|
|
2522
|
+
ROOT_URL=https://www.stage.test-app.pan.panter.cloud
|
|
2523
|
+
HOSTNAME_INTERNAL=www.stage.test-app.pan.panter.cloud
|
|
2524
|
+
ROOT_URL_INTERNAL=https://www.stage.test-app.pan.panter.cloud
|
|
2525
|
+
KUBE_NAMESPACE=pan-test-app-stage
|
|
2526
|
+
KUBE_APP_NAME=www
|
|
2527
|
+
KUBE_APP_NAME_PREFIX=
|
|
2528
|
+
_ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
2529
|
+
EOF
|
|
2530
|
+
- collapseable_section_end "write-dotenv-www"
|
|
2531
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
|
|
2532
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
2533
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2534
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2535
|
+
- collapseable_section_end "nodeinstall"
|
|
2536
|
+
- cd www
|
|
2537
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
2538
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2539
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2540
|
+
- collapseable_section_end "nodeinstall"
|
|
2541
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
2542
|
+
- yarn install --immutable
|
|
2543
|
+
- collapseable_section_end "yarninstall"
|
|
2544
|
+
- yarn build
|
|
2545
|
+
cache:
|
|
2546
|
+
- key: www-yarn
|
|
2547
|
+
policy: pull-push
|
|
2548
|
+
paths:
|
|
2549
|
+
- www/.yarn
|
|
2550
|
+
- key: www-node-modules
|
|
2551
|
+
policy: pull-push
|
|
2552
|
+
paths:
|
|
2553
|
+
- www/node_modules
|
|
2554
|
+
artifacts:
|
|
2555
|
+
paths:
|
|
2556
|
+
- www/__build_info.json
|
|
2557
|
+
- www/.next
|
|
2558
|
+
- www/dist
|
|
2559
|
+
exclude:
|
|
2560
|
+
- www/.env
|
|
2561
|
+
expire_in: 1 day
|
|
2562
|
+
when: always
|
|
2563
|
+
reports: {}
|
|
2564
|
+
rules:
|
|
2565
|
+
- if: $CI_COMMIT_TAG
|
|
2566
|
+
needs: []
|
|
2567
|
+
retry: *a1
|
|
2568
|
+
interruptible: true
|
|
2569
|
+
'www ๐จ docker | stage ':
|
|
2570
|
+
stage: build
|
|
2571
|
+
image: path/to/docker/docker-build:the-version
|
|
2572
|
+
services:
|
|
2573
|
+
- name: docker:24.0.6-dind
|
|
2574
|
+
command:
|
|
2575
|
+
- --tls=false
|
|
2576
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
2577
|
+
variables:
|
|
2578
|
+
DOCKER_HOST: tcp://docker:2375
|
|
2579
|
+
DOCKER_TLS_CERTDIR: ''
|
|
2580
|
+
DOCKER_DRIVER: overlay2
|
|
2581
|
+
DOCKER_BUILDKIT: '1'
|
|
2582
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2583
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2584
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
2585
|
+
script:
|
|
2586
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2587
|
+
- export APP_DIR="www"
|
|
2588
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
2589
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
2590
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
2591
|
+
- export DOCKER_IMAGE_NAME="stage/www"
|
|
2592
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
2593
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2594
|
+
- |-
|
|
2595
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
2596
|
+
RUN yarn plugin import workspace-tools
|
|
2597
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
2598
|
+
- |-
|
|
2599
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
|
|
2600
|
+
COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
|
|
2601
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
2602
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
2603
|
+
- collapseable_section_end "injectvars"
|
|
2604
|
+
- ensureNodeDockerfile
|
|
2605
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
2606
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
2607
|
+
- collapseable_section_end "docker-login"
|
|
2608
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
2609
|
+
- 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
|
|
2610
|
+
- collapseable_section_end "docker-build"
|
|
2611
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
2612
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
2613
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
2614
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
2615
|
+
- collapseable_section_end "docker-push"
|
|
2616
|
+
cache:
|
|
2617
|
+
- key: www-yarn
|
|
2618
|
+
policy: pull
|
|
2619
|
+
paths:
|
|
2620
|
+
- www/.yarn
|
|
2621
|
+
rules:
|
|
2622
|
+
- if: $CI_COMMIT_TAG
|
|
2623
|
+
needs:
|
|
2624
|
+
- 'www ๐จ app | stage '
|
|
2625
|
+
retry: *a1
|
|
2626
|
+
interruptible: true
|
|
2627
|
+
'www ๐งพ sbom | stage ':
|
|
2628
|
+
stage: build
|
|
2629
|
+
image:
|
|
2630
|
+
name: aquasec/trivy:0.58.2
|
|
2631
|
+
entrypoint:
|
|
2632
|
+
- ''
|
|
2633
|
+
variables: {}
|
|
2634
|
+
script:
|
|
2635
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2636
|
+
- collapseable_section_end "injectvars"
|
|
2637
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" www
|
|
2638
|
+
artifacts:
|
|
2639
|
+
paths:
|
|
2640
|
+
- __sbom.json
|
|
2641
|
+
rules:
|
|
2642
|
+
- if: $CI_COMMIT_TAG
|
|
2643
|
+
needs: []
|
|
2644
|
+
retry: *a1
|
|
2645
|
+
interruptible: true
|
|
2646
|
+
allow_failure: true
|
|
2647
|
+
'www ๐ Deploy | stage ':
|
|
2648
|
+
stage: deploy stage
|
|
2649
|
+
image: path/to/docker/kubernetes:the-version
|
|
2650
|
+
variables:
|
|
2651
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2652
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2653
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2654
|
+
script:
|
|
2655
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2656
|
+
- export ENV_SHORT="stage"
|
|
2657
|
+
- export APP_DIR="www"
|
|
2658
|
+
- export ENV_TYPE="stage"
|
|
2659
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2660
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2661
|
+
- 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")"
|
|
2662
|
+
- export HOSTNAME="www.stage.test-app.pan.panter.cloud"
|
|
2663
|
+
- export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
|
|
2664
|
+
- export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
|
|
2665
|
+
- export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
|
|
2666
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
2667
|
+
- export KUBE_APP_NAME="www"
|
|
2668
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2669
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2670
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
2671
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
2672
|
+
- export DOCKER_IMAGE_NAME="stage/www"
|
|
2673
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
2674
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2675
|
+
- export RELEASE_NAME="pan-test-app-stage-www"
|
|
2676
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2677
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2678
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2679
|
+
- export HELM_ARGS=""
|
|
2680
|
+
- export COMPONENT_NAME="www"
|
|
2681
|
+
- collapseable_section_end "injectvars"
|
|
2682
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-www" --server="$CL_stage_www_KUBE_URL" --certificate-authority <(echo $CL_stage_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2683
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-www" --token="$CL_stage_www_KUBE_TOKEN"
|
|
2684
|
+
- kubectl config set-context "kube-pan-test-app-stage-www" --cluster="kube-pan-test-app-stage-www" --user="kube-pan-test-app-stage-www" --namespace="pan-test-app-stage"
|
|
2685
|
+
- kubectl config use-context "kube-pan-test-app-stage-www"
|
|
2686
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
2687
|
+
- |
|
|
2688
|
+
cat > __all_values.yml <<EOF
|
|
2689
|
+
env:
|
|
2690
|
+
secret: {}
|
|
2691
|
+
public:
|
|
2692
|
+
ENV_SHORT: |-
|
|
2693
|
+
stage
|
|
2694
|
+
APP_DIR: |-
|
|
2695
|
+
www
|
|
2696
|
+
ENV_TYPE: |-
|
|
2697
|
+
stage
|
|
2698
|
+
BUILD_INFO_BUILD_ID: |-
|
|
2699
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
2700
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
2701
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
2702
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
2703
|
+
$(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 '1!s/^/ /')
|
|
2704
|
+
HOSTNAME: |-
|
|
2705
|
+
www.stage.test-app.pan.panter.cloud
|
|
2706
|
+
ROOT_URL: |-
|
|
2707
|
+
https://www.stage.test-app.pan.panter.cloud
|
|
2708
|
+
HOSTNAME_INTERNAL: |-
|
|
2709
|
+
www.stage.test-app.pan.panter.cloud
|
|
2710
|
+
ROOT_URL_INTERNAL: |-
|
|
2711
|
+
https://www.stage.test-app.pan.panter.cloud
|
|
2712
|
+
KUBE_NAMESPACE: |-
|
|
2713
|
+
pan-test-app-stage
|
|
2714
|
+
KUBE_APP_NAME: |-
|
|
2715
|
+
www
|
|
2716
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
2717
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
2718
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
2719
|
+
application:
|
|
2720
|
+
host: |-
|
|
2721
|
+
www.stage.test-app.pan.panter.cloud
|
|
2722
|
+
command: |-
|
|
2723
|
+
yarn start
|
|
2724
|
+
livenessProbe:
|
|
2725
|
+
httpGet:
|
|
2726
|
+
path: |-
|
|
2727
|
+
__health
|
|
2728
|
+
readinessProbe:
|
|
2729
|
+
httpGet:
|
|
2730
|
+
path: |-
|
|
2731
|
+
__health
|
|
2732
|
+
startupProbe:
|
|
2733
|
+
httpGet:
|
|
2734
|
+
path: |-
|
|
2735
|
+
__health
|
|
2736
|
+
|
|
2737
|
+
EOF
|
|
2738
|
+
- collapseable_section_end "writeallvalues"
|
|
2739
|
+
- kubernetesCreateSecret
|
|
2740
|
+
- kubernetesDeploy
|
|
2741
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
2742
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
2743
|
+
- echo deployment successful ๐ป
|
|
2744
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
2745
|
+
environment:
|
|
2746
|
+
name: stage/www
|
|
2747
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2748
|
+
on_stop: 'www ๐ Stop โ ๏ธ | stage '
|
|
2749
|
+
artifacts:
|
|
2750
|
+
reports:
|
|
2751
|
+
dotenv: gitlab_environment.env
|
|
2752
|
+
rules:
|
|
2753
|
+
- when: on_success
|
|
2754
|
+
if: $CI_COMMIT_TAG
|
|
2755
|
+
needs:
|
|
2756
|
+
- job: 'www ๐จ app | stage '
|
|
2757
|
+
artifacts: false
|
|
2758
|
+
- job: 'www ๐จ docker | stage '
|
|
2759
|
+
artifacts: false
|
|
2760
|
+
- job: 'www ๐งพ sbom | stage '
|
|
2761
|
+
artifacts: true
|
|
2762
|
+
retry: *a1
|
|
2763
|
+
interruptible: true
|
|
2764
|
+
allow_failure: false
|
|
2765
|
+
'www ๐ Stop โ ๏ธ | stage ':
|
|
2766
|
+
stage: stop stage
|
|
2767
|
+
image: path/to/docker/kubernetes:the-version
|
|
2768
|
+
variables:
|
|
2769
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2770
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2771
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2772
|
+
GIT_STRATEGY: none
|
|
2773
|
+
script:
|
|
2774
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2775
|
+
- export ENV_SHORT="stage"
|
|
2776
|
+
- export APP_DIR="www"
|
|
2777
|
+
- export ENV_TYPE="stage"
|
|
2778
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2779
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2780
|
+
- 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")"
|
|
2781
|
+
- export HOSTNAME="www.stage.test-app.pan.panter.cloud"
|
|
2782
|
+
- export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
|
|
2783
|
+
- export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
|
|
2784
|
+
- export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
|
|
2785
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
2786
|
+
- export KUBE_APP_NAME="www"
|
|
2787
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2788
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2789
|
+
- export RELEASE_NAME="pan-test-app-stage-www"
|
|
2790
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2791
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2792
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2793
|
+
- export HELM_ARGS=""
|
|
2794
|
+
- export COMPONENT_NAME="www"
|
|
2795
|
+
- collapseable_section_end "injectvars"
|
|
2796
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-www" --server="$CL_stage_www_KUBE_URL" --certificate-authority <(echo $CL_stage_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2797
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-www" --token="$CL_stage_www_KUBE_TOKEN"
|
|
2798
|
+
- kubectl config set-context "kube-pan-test-app-stage-www" --cluster="kube-pan-test-app-stage-www" --user="kube-pan-test-app-stage-www" --namespace="pan-test-app-stage"
|
|
2799
|
+
- kubectl config use-context "kube-pan-test-app-stage-www"
|
|
2800
|
+
- kubernetesDelete
|
|
2801
|
+
- echo 'Disabling component in Dependency Track'
|
|
2802
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
|
|
2803
|
+
environment:
|
|
2804
|
+
name: stage/www
|
|
2805
|
+
action: stop
|
|
2806
|
+
rules:
|
|
2807
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
2808
|
+
when: on_success
|
|
2809
|
+
- when: manual
|
|
2810
|
+
if: $CI_COMMIT_TAG
|
|
2811
|
+
needs: []
|
|
2812
|
+
retry: *a1
|
|
2813
|
+
interruptible: true
|
|
2814
|
+
allow_failure: true
|
|
2815
|
+
'www โฉ๏ธ Rollback โ ๏ธ | stage ':
|
|
2816
|
+
stage: rollback stage
|
|
2817
|
+
image: path/to/docker/kubernetes:the-version
|
|
2818
|
+
variables:
|
|
2819
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2820
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2821
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2822
|
+
GIT_STRATEGY: none
|
|
2823
|
+
script:
|
|
2824
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2825
|
+
- export ENV_SHORT="stage"
|
|
2826
|
+
- export APP_DIR="www"
|
|
2827
|
+
- export ENV_TYPE="stage"
|
|
2828
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2829
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2830
|
+
- 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")"
|
|
2831
|
+
- export HOSTNAME="www.stage.test-app.pan.panter.cloud"
|
|
2832
|
+
- export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
|
|
2833
|
+
- export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
|
|
2834
|
+
- export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
|
|
2835
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
2836
|
+
- export KUBE_APP_NAME="www"
|
|
2837
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2838
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2839
|
+
- export RELEASE_NAME="pan-test-app-stage-www"
|
|
2840
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
2841
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
2842
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
2843
|
+
- export HELM_ARGS=""
|
|
2844
|
+
- export COMPONENT_NAME="www"
|
|
2845
|
+
- collapseable_section_end "injectvars"
|
|
2846
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-www" --server="$CL_stage_www_KUBE_URL" --certificate-authority <(echo $CL_stage_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
2847
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-www" --token="$CL_stage_www_KUBE_TOKEN"
|
|
2848
|
+
- kubectl config set-context "kube-pan-test-app-stage-www" --cluster="kube-pan-test-app-stage-www" --user="kube-pan-test-app-stage-www" --namespace="pan-test-app-stage"
|
|
2849
|
+
- kubectl config use-context "kube-pan-test-app-stage-www"
|
|
2850
|
+
- kubernetesRollback
|
|
2851
|
+
environment:
|
|
2852
|
+
name: stage/www
|
|
2853
|
+
action: access
|
|
2854
|
+
rules:
|
|
2855
|
+
- when: manual
|
|
2856
|
+
if: $CI_COMMIT_TAG
|
|
2857
|
+
needs: []
|
|
2858
|
+
retry: *a1
|
|
2859
|
+
interruptible: true
|
|
2860
|
+
allow_failure: true
|
|
2861
|
+
'www ๐จ app | prod ':
|
|
2862
|
+
stage: build
|
|
2863
|
+
image: path/to/docker/jobs-default:the-version
|
|
2864
|
+
variables:
|
|
2865
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2866
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2867
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2868
|
+
script:
|
|
2869
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2870
|
+
- export ENV_SHORT="prod"
|
|
2871
|
+
- export APP_DIR="www"
|
|
2872
|
+
- export ENV_TYPE="prod"
|
|
2873
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2874
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2875
|
+
- 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")"
|
|
2876
|
+
- export HOSTNAME="www.prod.test-app.pan.panter.cloud"
|
|
2877
|
+
- export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
|
|
2878
|
+
- export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
|
|
2879
|
+
- export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
|
|
2880
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
2881
|
+
- export KUBE_APP_NAME="www"
|
|
2882
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2883
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
2884
|
+
- collapseable_section_end "injectvars"
|
|
2885
|
+
- collapseable_section_start "write-dotenv-www" "write dot env for www"
|
|
2886
|
+
- |-
|
|
2887
|
+
cat <<EOF > www/.env
|
|
2888
|
+
ENV_SHORT=prod
|
|
2889
|
+
APP_DIR=www
|
|
2890
|
+
ENV_TYPE=prod
|
|
2891
|
+
HOSTNAME=www.prod.test-app.pan.panter.cloud
|
|
2892
|
+
ROOT_URL=https://www.prod.test-app.pan.panter.cloud
|
|
2893
|
+
HOSTNAME_INTERNAL=www.prod.test-app.pan.panter.cloud
|
|
2894
|
+
ROOT_URL_INTERNAL=https://www.prod.test-app.pan.panter.cloud
|
|
2895
|
+
KUBE_NAMESPACE=pan-test-app-prod
|
|
2896
|
+
KUBE_APP_NAME=www
|
|
2897
|
+
KUBE_APP_NAME_PREFIX=
|
|
2898
|
+
_ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
2899
|
+
EOF
|
|
2900
|
+
- collapseable_section_end "write-dotenv-www"
|
|
2901
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
|
|
2902
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
2903
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2904
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2905
|
+
- collapseable_section_end "nodeinstall"
|
|
2906
|
+
- cd www
|
|
2907
|
+
- collapseable_section_start "nodeinstall" "Ensure node version"
|
|
2908
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2909
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2910
|
+
- collapseable_section_end "nodeinstall"
|
|
2911
|
+
- collapseable_section_start "yarninstall" "Yarn install"
|
|
2912
|
+
- yarn install --immutable
|
|
2913
|
+
- collapseable_section_end "yarninstall"
|
|
2914
|
+
- yarn build
|
|
2915
|
+
cache:
|
|
2916
|
+
- key: www-yarn
|
|
2917
|
+
policy: pull-push
|
|
2918
|
+
paths:
|
|
2919
|
+
- www/.yarn
|
|
2920
|
+
- key: www-node-modules
|
|
2921
|
+
policy: pull-push
|
|
2922
|
+
paths:
|
|
2923
|
+
- www/node_modules
|
|
2924
|
+
artifacts:
|
|
2925
|
+
paths:
|
|
2926
|
+
- www/__build_info.json
|
|
2927
|
+
- www/.next
|
|
2928
|
+
- www/dist
|
|
2929
|
+
exclude:
|
|
2930
|
+
- www/.env
|
|
2931
|
+
expire_in: 1 day
|
|
2932
|
+
when: always
|
|
2933
|
+
reports: {}
|
|
2934
|
+
rules:
|
|
2935
|
+
- if: $CI_COMMIT_TAG
|
|
2936
|
+
needs: []
|
|
2937
|
+
retry: *a1
|
|
2938
|
+
interruptible: true
|
|
2939
|
+
'www ๐จ docker | prod ':
|
|
2940
|
+
stage: build
|
|
2941
|
+
image: path/to/docker/docker-build:the-version
|
|
2942
|
+
services:
|
|
2943
|
+
- name: docker:24.0.6-dind
|
|
2944
|
+
command:
|
|
2945
|
+
- --tls=false
|
|
2946
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
2947
|
+
variables:
|
|
2948
|
+
DOCKER_HOST: tcp://docker:2375
|
|
2949
|
+
DOCKER_TLS_CERTDIR: ''
|
|
2950
|
+
DOCKER_DRIVER: overlay2
|
|
2951
|
+
DOCKER_BUILDKIT: '1'
|
|
2952
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2953
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2954
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
2955
|
+
script:
|
|
2956
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
2957
|
+
- export APP_DIR="www"
|
|
2958
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
2959
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
2960
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
2961
|
+
- export DOCKER_IMAGE_NAME="prod/www"
|
|
2962
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
2963
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2964
|
+
- |-
|
|
2965
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
2966
|
+
RUN yarn plugin import workspace-tools
|
|
2967
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
2968
|
+
- |-
|
|
2969
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
|
|
2970
|
+
COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
|
|
2971
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
2972
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
2973
|
+
- collapseable_section_end "injectvars"
|
|
2974
|
+
- ensureNodeDockerfile
|
|
2975
|
+
- collapseable_section_start "docker-login" "Docker Login"
|
|
2976
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
2977
|
+
- collapseable_section_end "docker-login"
|
|
2978
|
+
- collapseable_section_start "docker-build" "Docker build"
|
|
2979
|
+
- 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
|
|
2980
|
+
- collapseable_section_end "docker-build"
|
|
2981
|
+
- collapseable_section_start "docker-push" "Docker push and tag"
|
|
2982
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
2983
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
2984
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
2985
|
+
- collapseable_section_end "docker-push"
|
|
2986
|
+
cache:
|
|
2987
|
+
- key: www-yarn
|
|
2988
|
+
policy: pull
|
|
2989
|
+
paths:
|
|
2990
|
+
- www/.yarn
|
|
2991
|
+
rules:
|
|
2992
|
+
- if: $CI_COMMIT_TAG
|
|
2993
|
+
needs:
|
|
2994
|
+
- 'www ๐จ app | prod '
|
|
2995
|
+
retry: *a1
|
|
2996
|
+
interruptible: true
|
|
2997
|
+
'www ๐งพ sbom | prod ':
|
|
2998
|
+
stage: build
|
|
2999
|
+
image:
|
|
3000
|
+
name: aquasec/trivy:0.58.2
|
|
3001
|
+
entrypoint:
|
|
3002
|
+
- ''
|
|
3003
|
+
variables: {}
|
|
3004
|
+
script:
|
|
3005
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
3006
|
+
- collapseable_section_end "injectvars"
|
|
3007
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" www
|
|
3008
|
+
artifacts:
|
|
3009
|
+
paths:
|
|
3010
|
+
- __sbom.json
|
|
3011
|
+
rules:
|
|
3012
|
+
- if: $CI_COMMIT_TAG
|
|
3013
|
+
needs: []
|
|
3014
|
+
retry: *a1
|
|
3015
|
+
interruptible: true
|
|
3016
|
+
allow_failure: true
|
|
3017
|
+
'www ๐ Deploy | prod ':
|
|
3018
|
+
stage: deploy prod
|
|
3019
|
+
image: path/to/docker/kubernetes:the-version
|
|
3020
|
+
variables:
|
|
3021
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3022
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3023
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3024
|
+
script:
|
|
3025
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
3026
|
+
- export ENV_SHORT="prod"
|
|
3027
|
+
- export APP_DIR="www"
|
|
3028
|
+
- export ENV_TYPE="prod"
|
|
3029
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3030
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3031
|
+
- 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")"
|
|
3032
|
+
- export HOSTNAME="www.prod.test-app.pan.panter.cloud"
|
|
3033
|
+
- export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
|
|
3034
|
+
- export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
|
|
3035
|
+
- export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
|
|
3036
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
3037
|
+
- export KUBE_APP_NAME="www"
|
|
3038
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3039
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
3040
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
3041
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
|
|
3042
|
+
- export DOCKER_IMAGE_NAME="prod/www"
|
|
3043
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
3044
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
3045
|
+
- export RELEASE_NAME="pan-test-app-prod-www"
|
|
3046
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3047
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
3048
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3049
|
+
- export HELM_ARGS=""
|
|
3050
|
+
- export COMPONENT_NAME="www"
|
|
3051
|
+
- collapseable_section_end "injectvars"
|
|
3052
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-www" --server="$CL_prod_www_KUBE_URL" --certificate-authority <(echo $CL_prod_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3053
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-www" --token="$CL_prod_www_KUBE_TOKEN"
|
|
3054
|
+
- kubectl config set-context "kube-pan-test-app-prod-www" --cluster="kube-pan-test-app-prod-www" --user="kube-pan-test-app-prod-www" --namespace="pan-test-app-prod"
|
|
3055
|
+
- kubectl config use-context "kube-pan-test-app-prod-www"
|
|
3056
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
3057
|
+
- |
|
|
3058
|
+
cat > __all_values.yml <<EOF
|
|
3059
|
+
env:
|
|
3060
|
+
secret: {}
|
|
3061
|
+
public:
|
|
3062
|
+
ENV_SHORT: |-
|
|
3063
|
+
prod
|
|
3064
|
+
APP_DIR: |-
|
|
3065
|
+
www
|
|
3066
|
+
ENV_TYPE: |-
|
|
3067
|
+
prod
|
|
3068
|
+
BUILD_INFO_BUILD_ID: |-
|
|
3069
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
3070
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
3071
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
3072
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
3073
|
+
$(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 '1!s/^/ /')
|
|
3074
|
+
HOSTNAME: |-
|
|
3075
|
+
www.prod.test-app.pan.panter.cloud
|
|
3076
|
+
ROOT_URL: |-
|
|
3077
|
+
https://www.prod.test-app.pan.panter.cloud
|
|
3078
|
+
HOSTNAME_INTERNAL: |-
|
|
3079
|
+
www.prod.test-app.pan.panter.cloud
|
|
3080
|
+
ROOT_URL_INTERNAL: |-
|
|
3081
|
+
https://www.prod.test-app.pan.panter.cloud
|
|
3082
|
+
KUBE_NAMESPACE: |-
|
|
3083
|
+
pan-test-app-prod
|
|
3084
|
+
KUBE_APP_NAME: |-
|
|
3085
|
+
www
|
|
3086
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
3087
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
3088
|
+
["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
|
|
3089
|
+
application:
|
|
3090
|
+
host: |-
|
|
3091
|
+
www.prod.test-app.pan.panter.cloud
|
|
3092
|
+
command: |-
|
|
3093
|
+
yarn start
|
|
3094
|
+
livenessProbe:
|
|
3095
|
+
httpGet:
|
|
3096
|
+
path: |-
|
|
3097
|
+
__health
|
|
3098
|
+
readinessProbe:
|
|
3099
|
+
httpGet:
|
|
3100
|
+
path: |-
|
|
3101
|
+
__health
|
|
3102
|
+
startupProbe:
|
|
3103
|
+
httpGet:
|
|
3104
|
+
path: |-
|
|
3105
|
+
__health
|
|
3106
|
+
|
|
3107
|
+
EOF
|
|
3108
|
+
- collapseable_section_end "writeallvalues"
|
|
3109
|
+
- kubernetesCreateSecret
|
|
3110
|
+
- kubernetesDeploy
|
|
3111
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
3112
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
3113
|
+
- echo deployment successful ๐ป
|
|
3114
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
3115
|
+
environment:
|
|
3116
|
+
name: prod/www
|
|
3117
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3118
|
+
on_stop: 'www ๐ Stop โ ๏ธ | prod '
|
|
3119
|
+
artifacts:
|
|
3120
|
+
reports:
|
|
3121
|
+
dotenv: gitlab_environment.env
|
|
3122
|
+
rules:
|
|
3123
|
+
- when: manual
|
|
3124
|
+
if: $CI_COMMIT_TAG
|
|
3125
|
+
needs:
|
|
3126
|
+
- job: 'www ๐จ app | prod '
|
|
3127
|
+
artifacts: false
|
|
3128
|
+
- job: 'www ๐จ docker | prod '
|
|
3129
|
+
artifacts: false
|
|
3130
|
+
- job: 'www ๐งพ sbom | prod '
|
|
3131
|
+
artifacts: true
|
|
3132
|
+
retry: *a1
|
|
3133
|
+
interruptible: true
|
|
3134
|
+
allow_failure: true
|
|
3135
|
+
'www ๐ Stop โ ๏ธ | prod ':
|
|
3136
|
+
stage: stop prod
|
|
3137
|
+
image: path/to/docker/kubernetes:the-version
|
|
3138
|
+
variables:
|
|
3139
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3140
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3141
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3142
|
+
GIT_STRATEGY: none
|
|
3143
|
+
script:
|
|
3144
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
3145
|
+
- export ENV_SHORT="prod"
|
|
3146
|
+
- export APP_DIR="www"
|
|
3147
|
+
- export ENV_TYPE="prod"
|
|
3148
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3149
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3150
|
+
- 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")"
|
|
3151
|
+
- export HOSTNAME="www.prod.test-app.pan.panter.cloud"
|
|
3152
|
+
- export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
|
|
3153
|
+
- export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
|
|
3154
|
+
- export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
|
|
3155
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
3156
|
+
- export KUBE_APP_NAME="www"
|
|
3157
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3158
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
3159
|
+
- export RELEASE_NAME="pan-test-app-prod-www"
|
|
3160
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3161
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
3162
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3163
|
+
- export HELM_ARGS=""
|
|
3164
|
+
- export COMPONENT_NAME="www"
|
|
3165
|
+
- collapseable_section_end "injectvars"
|
|
3166
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-www" --server="$CL_prod_www_KUBE_URL" --certificate-authority <(echo $CL_prod_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3167
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-www" --token="$CL_prod_www_KUBE_TOKEN"
|
|
3168
|
+
- kubectl config set-context "kube-pan-test-app-prod-www" --cluster="kube-pan-test-app-prod-www" --user="kube-pan-test-app-prod-www" --namespace="pan-test-app-prod"
|
|
3169
|
+
- kubectl config use-context "kube-pan-test-app-prod-www"
|
|
3170
|
+
- kubernetesDelete
|
|
3171
|
+
- echo 'Disabling component in Dependency Track'
|
|
3172
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
|
|
3173
|
+
environment:
|
|
3174
|
+
name: prod/www
|
|
3175
|
+
action: stop
|
|
3176
|
+
rules:
|
|
3177
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
3178
|
+
when: on_success
|
|
3179
|
+
- when: manual
|
|
3180
|
+
if: $CI_COMMIT_TAG
|
|
3181
|
+
needs: []
|
|
3182
|
+
retry: *a1
|
|
3183
|
+
interruptible: true
|
|
3184
|
+
allow_failure: true
|
|
3185
|
+
'www โฉ๏ธ Rollback โ ๏ธ | prod ':
|
|
3186
|
+
stage: rollback prod
|
|
3187
|
+
image: path/to/docker/kubernetes:the-version
|
|
3188
|
+
variables:
|
|
3189
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3190
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3191
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3192
|
+
GIT_STRATEGY: none
|
|
3193
|
+
script:
|
|
3194
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
3195
|
+
- export ENV_SHORT="prod"
|
|
3196
|
+
- export APP_DIR="www"
|
|
3197
|
+
- export ENV_TYPE="prod"
|
|
3198
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3199
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3200
|
+
- 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")"
|
|
3201
|
+
- export HOSTNAME="www.prod.test-app.pan.panter.cloud"
|
|
3202
|
+
- export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
|
|
3203
|
+
- export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
|
|
3204
|
+
- export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
|
|
3205
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
3206
|
+
- export KUBE_APP_NAME="www"
|
|
3207
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3208
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
|
|
3209
|
+
- export RELEASE_NAME="pan-test-app-prod-www"
|
|
3210
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3211
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
|
|
3212
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3213
|
+
- export HELM_ARGS=""
|
|
3214
|
+
- export COMPONENT_NAME="www"
|
|
3215
|
+
- collapseable_section_end "injectvars"
|
|
3216
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-www" --server="$CL_prod_www_KUBE_URL" --certificate-authority <(echo $CL_prod_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3217
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-www" --token="$CL_prod_www_KUBE_TOKEN"
|
|
3218
|
+
- kubectl config set-context "kube-pan-test-app-prod-www" --cluster="kube-pan-test-app-prod-www" --user="kube-pan-test-app-prod-www" --namespace="pan-test-app-prod"
|
|
3219
|
+
- kubectl config use-context "kube-pan-test-app-prod-www"
|
|
3220
|
+
- kubernetesRollback
|
|
3221
|
+
environment:
|
|
3222
|
+
name: prod/www
|
|
3223
|
+
action: access
|
|
3224
|
+
rules:
|
|
3225
|
+
- when: manual
|
|
3226
|
+
if: $CI_COMMIT_TAG
|
|
3227
|
+
needs: []
|
|
3228
|
+
retry: *a1
|
|
3229
|
+
interruptible: true
|
|
3230
|
+
allow_failure: true
|
|
3231
|
+
create release:
|
|
3232
|
+
stage: release
|
|
3233
|
+
image: path/to/docker/semantic-release:the-version
|
|
3234
|
+
script:
|
|
3235
|
+
- semanticRelease
|
|
3236
|
+
- echo '๐ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
|
|
3237
|
+
rules:
|
|
3238
|
+
- &a2
|
|
3239
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
3240
|
+
when: never
|
|
3241
|
+
- &a3
|
|
3242
|
+
if: $CI_PIPELINE_SOURCE == "schedule"
|
|
3243
|
+
when: never
|
|
3244
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
|
|
3245
|
+
when: on_success
|
|
3246
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
3247
|
+
when: manual
|
|
3248
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
|
|
3249
|
+
when: manual
|
|
3250
|
+
โ ๏ธ force create release:
|
|
3251
|
+
stage: release
|
|
3252
|
+
image: path/to/docker/semantic-release:the-version
|
|
3253
|
+
script:
|
|
3254
|
+
- semanticRelease
|
|
3255
|
+
- echo '๐ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
|
|
3256
|
+
rules:
|
|
3257
|
+
- *a2
|
|
3258
|
+
- *a3
|
|
3259
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
3260
|
+
when: manual
|
|
3261
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
|
|
3262
|
+
when: manual
|
|
3263
|
+
needs: []
|
|
3264
|
+
"
|
|
3265
|
+
`;
|