@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,1444 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`matches snapshot for rails-k8s-with-worker 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
|
+
app đĄ audit:
|
|
79
|
+
stage: test
|
|
80
|
+
image: ruby:3.2.1
|
|
81
|
+
variables: {}
|
|
82
|
+
script:
|
|
83
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
84
|
+
- collapseable_section_end "injectvars"
|
|
85
|
+
- cd .
|
|
86
|
+
- gem install bundler-audit
|
|
87
|
+
- bundle audit check
|
|
88
|
+
rules:
|
|
89
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
90
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
91
|
+
needs: []
|
|
92
|
+
retry: &a1
|
|
93
|
+
max: 2
|
|
94
|
+
when:
|
|
95
|
+
- runner_system_failure
|
|
96
|
+
- stuck_or_timeout_failure
|
|
97
|
+
interruptible: true
|
|
98
|
+
allow_failure: true
|
|
99
|
+
app đŽ lint:
|
|
100
|
+
stage: test
|
|
101
|
+
image: ruby:3.2.1
|
|
102
|
+
variables: {}
|
|
103
|
+
script:
|
|
104
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
105
|
+
- collapseable_section_end "injectvars"
|
|
106
|
+
- cd .
|
|
107
|
+
- bundle config set path 'tmp/cache'
|
|
108
|
+
- bundle install -j $(nproc)
|
|
109
|
+
- bundle exec rubocop
|
|
110
|
+
cache: &a2
|
|
111
|
+
key:
|
|
112
|
+
files:
|
|
113
|
+
- Gemfile.lock
|
|
114
|
+
prefix: $CI_JOB_IMAGE
|
|
115
|
+
paths:
|
|
116
|
+
- tmp/cache
|
|
117
|
+
rules:
|
|
118
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
119
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
120
|
+
needs: []
|
|
121
|
+
retry: *a1
|
|
122
|
+
interruptible: true
|
|
123
|
+
app đ§Ē test:
|
|
124
|
+
stage: test
|
|
125
|
+
image: ruby:3.2.1
|
|
126
|
+
services:
|
|
127
|
+
- name: docker.io/postgres:latest
|
|
128
|
+
alias: database
|
|
129
|
+
variables:
|
|
130
|
+
POSTGRES_HOST_AUTH_METHOD: trust
|
|
131
|
+
variables:
|
|
132
|
+
RAILS_ENV: test
|
|
133
|
+
DATABASE_URL: postgresql://postgres@database
|
|
134
|
+
script:
|
|
135
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
136
|
+
- collapseable_section_end "injectvars"
|
|
137
|
+
- cd .
|
|
138
|
+
- bundle config set path 'tmp/cache'
|
|
139
|
+
- bundle install -j $(nproc)
|
|
140
|
+
- bundle exec rake db:test:prepare
|
|
141
|
+
- bundle exec rake assets:precompile assets:clean
|
|
142
|
+
- bundle exec rspec
|
|
143
|
+
cache: *a2
|
|
144
|
+
rules:
|
|
145
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
146
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
147
|
+
needs: []
|
|
148
|
+
retry: *a1
|
|
149
|
+
interruptible: true
|
|
150
|
+
'app đ¨ docker | dev ':
|
|
151
|
+
stage: build
|
|
152
|
+
image: path/to/docker/docker-build:the-version
|
|
153
|
+
services:
|
|
154
|
+
- name: docker:24.0.6-dind
|
|
155
|
+
command:
|
|
156
|
+
- --tls=false
|
|
157
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
158
|
+
variables:
|
|
159
|
+
DOCKER_HOST: tcp://docker:2375
|
|
160
|
+
DOCKER_TLS_CERTDIR: ''
|
|
161
|
+
DOCKER_DRIVER: overlay2
|
|
162
|
+
DOCKER_BUILDKIT: '1'
|
|
163
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
164
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
165
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
166
|
+
script:
|
|
167
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
168
|
+
- export APP_DIR="."
|
|
169
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
170
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
171
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
172
|
+
- export DOCKER_IMAGE_NAME="dev/app"
|
|
173
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
174
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
175
|
+
- collapseable_section_end "injectvars"
|
|
176
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
177
|
+
- cd .
|
|
178
|
+
- wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.36.4/pack-v0.36.4-linux.tgz | tar -zx --directory /usr/local/bin pack
|
|
179
|
+
- chmod +x /usr/local/bin/pack
|
|
180
|
+
- sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
|
|
181
|
+
- 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:24'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
|
|
182
|
+
rules:
|
|
183
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
184
|
+
needs: []
|
|
185
|
+
retry: *a1
|
|
186
|
+
interruptible: true
|
|
187
|
+
'app đ§ž sbom | dev ':
|
|
188
|
+
stage: build
|
|
189
|
+
image:
|
|
190
|
+
name: aquasec/trivy:0.58.2
|
|
191
|
+
entrypoint:
|
|
192
|
+
- ''
|
|
193
|
+
variables: {}
|
|
194
|
+
script:
|
|
195
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
196
|
+
- collapseable_section_end "injectvars"
|
|
197
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" .
|
|
198
|
+
artifacts:
|
|
199
|
+
paths:
|
|
200
|
+
- __sbom.json
|
|
201
|
+
rules:
|
|
202
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
203
|
+
needs: []
|
|
204
|
+
retry: *a1
|
|
205
|
+
interruptible: true
|
|
206
|
+
allow_failure: true
|
|
207
|
+
'app đ Deploy | dev ':
|
|
208
|
+
stage: deploy dev
|
|
209
|
+
image: path/to/docker/kubernetes:the-version
|
|
210
|
+
variables:
|
|
211
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
212
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
213
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
214
|
+
script:
|
|
215
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
216
|
+
- export ENV_SHORT="dev"
|
|
217
|
+
- export APP_DIR="."
|
|
218
|
+
- export ENV_TYPE="dev"
|
|
219
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
220
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
221
|
+
- 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")"
|
|
222
|
+
- export HOSTNAME="app.dev.test-app.pan.panter.cloud"
|
|
223
|
+
- export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
|
|
224
|
+
- export HOSTNAME_INTERNAL="app.dev.test-app.pan.panter.cloud"
|
|
225
|
+
- export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
|
|
226
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
227
|
+
- export KUBE_APP_NAME="app"
|
|
228
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
229
|
+
- export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
|
|
230
|
+
- export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
|
|
231
|
+
- export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
|
|
232
|
+
- export RAILS_ENV="production"
|
|
233
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
234
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
235
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
236
|
+
- export DOCKER_IMAGE_NAME="dev/app"
|
|
237
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
238
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
239
|
+
- export RELEASE_NAME="pan-test-app-dev-app"
|
|
240
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
241
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
242
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
243
|
+
- export HELM_ARGS=""
|
|
244
|
+
- export COMPONENT_NAME="app"
|
|
245
|
+
- collapseable_section_end "injectvars"
|
|
246
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
247
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
|
|
248
|
+
- kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
|
|
249
|
+
- kubectl config use-context "kube-pan-test-app-dev-app"
|
|
250
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
251
|
+
- |
|
|
252
|
+
cat > __all_values.yml <<EOF
|
|
253
|
+
env:
|
|
254
|
+
secret:
|
|
255
|
+
SECRET_KEY_BASE: |-
|
|
256
|
+
$(printf %s "$CL_dev_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
|
|
257
|
+
POSTGRESQL_PASSWORD: |-
|
|
258
|
+
$(printf %s "$CL_dev_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
|
|
259
|
+
cloudsqlProxyCredentials: |-
|
|
260
|
+
$(printf %s "$CL_dev_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
|
|
261
|
+
public:
|
|
262
|
+
ENV_SHORT: |-
|
|
263
|
+
dev
|
|
264
|
+
APP_DIR: |-
|
|
265
|
+
.
|
|
266
|
+
ENV_TYPE: |-
|
|
267
|
+
dev
|
|
268
|
+
BUILD_INFO_BUILD_ID: |-
|
|
269
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
270
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
271
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
272
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
273
|
+
$(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/^/ /')
|
|
274
|
+
HOSTNAME: |-
|
|
275
|
+
app.dev.test-app.pan.panter.cloud
|
|
276
|
+
ROOT_URL: |-
|
|
277
|
+
https://app.dev.test-app.pan.panter.cloud
|
|
278
|
+
HOSTNAME_INTERNAL: |-
|
|
279
|
+
app.dev.test-app.pan.panter.cloud
|
|
280
|
+
ROOT_URL_INTERNAL: |-
|
|
281
|
+
https://app.dev.test-app.pan.panter.cloud
|
|
282
|
+
KUBE_NAMESPACE: |-
|
|
283
|
+
pan-test-app-dev
|
|
284
|
+
KUBE_APP_NAME: |-
|
|
285
|
+
app
|
|
286
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
287
|
+
RAILS_ENV: |-
|
|
288
|
+
production
|
|
289
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
290
|
+
["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
|
|
291
|
+
application:
|
|
292
|
+
host: |-
|
|
293
|
+
app.dev.test-app.pan.panter.cloud
|
|
294
|
+
livenessProbe:
|
|
295
|
+
httpGet:
|
|
296
|
+
path: |-
|
|
297
|
+
__health
|
|
298
|
+
readinessProbe:
|
|
299
|
+
httpGet:
|
|
300
|
+
path: |-
|
|
301
|
+
__health
|
|
302
|
+
startupProbe:
|
|
303
|
+
httpGet:
|
|
304
|
+
path: |-
|
|
305
|
+
__health
|
|
306
|
+
worker:
|
|
307
|
+
enabled: true
|
|
308
|
+
command: |-
|
|
309
|
+
launcher bundle exec rake jobs:work
|
|
310
|
+
livenessProbe: false
|
|
311
|
+
cloudsql:
|
|
312
|
+
enabled: true
|
|
313
|
+
dbUser: |-
|
|
314
|
+
postgres
|
|
315
|
+
instanceConnectionName: |-
|
|
316
|
+
myproject:europe-west6:instance-name
|
|
317
|
+
proxyCredentials: |-
|
|
318
|
+
$CL_dev_app_cloudsqlProxyCredentials
|
|
319
|
+
fullDbName: |-
|
|
320
|
+
pan-test-app-dev-app
|
|
321
|
+
type: |-
|
|
322
|
+
unmanaged
|
|
323
|
+
jobs:
|
|
324
|
+
db-migrate:
|
|
325
|
+
hook: |-
|
|
326
|
+
post-install,post-upgrade
|
|
327
|
+
command: |-
|
|
328
|
+
launcher bundle exec rake db:migrate
|
|
329
|
+
|
|
330
|
+
EOF
|
|
331
|
+
- collapseable_section_end "writeallvalues"
|
|
332
|
+
- kubernetesCreateSecret
|
|
333
|
+
- kubernetesDeploy
|
|
334
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
335
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
336
|
+
- echo deployment successful đģ
|
|
337
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
338
|
+
environment:
|
|
339
|
+
name: dev/app
|
|
340
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
341
|
+
on_stop: 'app đ Stop â ī¸ | dev '
|
|
342
|
+
auto_stop_in: 4 weeks
|
|
343
|
+
artifacts:
|
|
344
|
+
reports:
|
|
345
|
+
dotenv: gitlab_environment.env
|
|
346
|
+
rules:
|
|
347
|
+
- when: on_success
|
|
348
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
349
|
+
needs:
|
|
350
|
+
- job: app đŽ lint
|
|
351
|
+
artifacts: false
|
|
352
|
+
- job: 'app đ¨ docker | dev '
|
|
353
|
+
artifacts: false
|
|
354
|
+
- job: app đ§Ē test
|
|
355
|
+
artifacts: false
|
|
356
|
+
- job: 'app đ§ž sbom | dev '
|
|
357
|
+
artifacts: true
|
|
358
|
+
- job: app đĄ audit
|
|
359
|
+
artifacts: false
|
|
360
|
+
retry: *a1
|
|
361
|
+
interruptible: true
|
|
362
|
+
allow_failure: false
|
|
363
|
+
'app đ Stop â ī¸ | dev ':
|
|
364
|
+
stage: stop dev
|
|
365
|
+
image: path/to/docker/kubernetes:the-version
|
|
366
|
+
variables:
|
|
367
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
368
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
369
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
370
|
+
GIT_STRATEGY: none
|
|
371
|
+
script:
|
|
372
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
373
|
+
- export ENV_SHORT="dev"
|
|
374
|
+
- export APP_DIR="."
|
|
375
|
+
- export ENV_TYPE="dev"
|
|
376
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
377
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
378
|
+
- 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")"
|
|
379
|
+
- export HOSTNAME="app.dev.test-app.pan.panter.cloud"
|
|
380
|
+
- export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
|
|
381
|
+
- export HOSTNAME_INTERNAL="app.dev.test-app.pan.panter.cloud"
|
|
382
|
+
- export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
|
|
383
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
384
|
+
- export KUBE_APP_NAME="app"
|
|
385
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
386
|
+
- export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
|
|
387
|
+
- export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
|
|
388
|
+
- export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
|
|
389
|
+
- export RAILS_ENV="production"
|
|
390
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
391
|
+
- export RELEASE_NAME="pan-test-app-dev-app"
|
|
392
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
393
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
394
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
395
|
+
- export HELM_ARGS=""
|
|
396
|
+
- export COMPONENT_NAME="app"
|
|
397
|
+
- collapseable_section_end "injectvars"
|
|
398
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
399
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
|
|
400
|
+
- kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
|
|
401
|
+
- kubectl config use-context "kube-pan-test-app-dev-app"
|
|
402
|
+
- kubernetesDelete
|
|
403
|
+
- echo 'Disabling component in Dependency Track'
|
|
404
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
|
|
405
|
+
environment:
|
|
406
|
+
name: dev/app
|
|
407
|
+
action: stop
|
|
408
|
+
rules:
|
|
409
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
410
|
+
when: on_success
|
|
411
|
+
- when: manual
|
|
412
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
413
|
+
needs: []
|
|
414
|
+
retry: *a1
|
|
415
|
+
interruptible: true
|
|
416
|
+
allow_failure: true
|
|
417
|
+
'app âŠī¸ Rollback â ī¸ | dev ':
|
|
418
|
+
stage: rollback dev
|
|
419
|
+
image: path/to/docker/kubernetes:the-version
|
|
420
|
+
variables:
|
|
421
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
422
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
423
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
424
|
+
GIT_STRATEGY: none
|
|
425
|
+
script:
|
|
426
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
427
|
+
- export ENV_SHORT="dev"
|
|
428
|
+
- export APP_DIR="."
|
|
429
|
+
- export ENV_TYPE="dev"
|
|
430
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
431
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
432
|
+
- 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")"
|
|
433
|
+
- export HOSTNAME="app.dev.test-app.pan.panter.cloud"
|
|
434
|
+
- export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
|
|
435
|
+
- export HOSTNAME_INTERNAL="app.dev.test-app.pan.panter.cloud"
|
|
436
|
+
- export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
|
|
437
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
438
|
+
- export KUBE_APP_NAME="app"
|
|
439
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
440
|
+
- export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
|
|
441
|
+
- export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
|
|
442
|
+
- export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
|
|
443
|
+
- export RAILS_ENV="production"
|
|
444
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
445
|
+
- export RELEASE_NAME="pan-test-app-dev-app"
|
|
446
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
447
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
448
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
449
|
+
- export HELM_ARGS=""
|
|
450
|
+
- export COMPONENT_NAME="app"
|
|
451
|
+
- collapseable_section_end "injectvars"
|
|
452
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
453
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
|
|
454
|
+
- kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
|
|
455
|
+
- kubectl config use-context "kube-pan-test-app-dev-app"
|
|
456
|
+
- kubernetesRollback
|
|
457
|
+
environment:
|
|
458
|
+
name: dev/app
|
|
459
|
+
action: access
|
|
460
|
+
rules:
|
|
461
|
+
- when: manual
|
|
462
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
|
|
463
|
+
needs: []
|
|
464
|
+
retry: *a1
|
|
465
|
+
interruptible: true
|
|
466
|
+
allow_failure: true
|
|
467
|
+
'app đ¨ docker | review ':
|
|
468
|
+
stage: build
|
|
469
|
+
image: path/to/docker/docker-build:the-version
|
|
470
|
+
services:
|
|
471
|
+
- name: docker:24.0.6-dind
|
|
472
|
+
command:
|
|
473
|
+
- --tls=false
|
|
474
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
475
|
+
variables:
|
|
476
|
+
DOCKER_HOST: tcp://docker:2375
|
|
477
|
+
DOCKER_TLS_CERTDIR: ''
|
|
478
|
+
DOCKER_DRIVER: overlay2
|
|
479
|
+
DOCKER_BUILDKIT: '1'
|
|
480
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
481
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
482
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
483
|
+
script:
|
|
484
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
485
|
+
- export APP_DIR="."
|
|
486
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
487
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
488
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
489
|
+
- export DOCKER_IMAGE_NAME="review/app"
|
|
490
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
491
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
492
|
+
- collapseable_section_end "injectvars"
|
|
493
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
494
|
+
- cd .
|
|
495
|
+
- wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.36.4/pack-v0.36.4-linux.tgz | tar -zx --directory /usr/local/bin pack
|
|
496
|
+
- chmod +x /usr/local/bin/pack
|
|
497
|
+
- sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
|
|
498
|
+
- 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:24'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
|
|
499
|
+
rules:
|
|
500
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
501
|
+
needs: []
|
|
502
|
+
retry: *a1
|
|
503
|
+
interruptible: true
|
|
504
|
+
'app đ§ž sbom | review ':
|
|
505
|
+
stage: build
|
|
506
|
+
image:
|
|
507
|
+
name: aquasec/trivy:0.58.2
|
|
508
|
+
entrypoint:
|
|
509
|
+
- ''
|
|
510
|
+
variables: {}
|
|
511
|
+
script:
|
|
512
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
513
|
+
- collapseable_section_end "injectvars"
|
|
514
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" .
|
|
515
|
+
artifacts:
|
|
516
|
+
paths:
|
|
517
|
+
- __sbom.json
|
|
518
|
+
rules:
|
|
519
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
520
|
+
needs: []
|
|
521
|
+
retry: *a1
|
|
522
|
+
interruptible: true
|
|
523
|
+
allow_failure: true
|
|
524
|
+
'app đ Deploy | review ':
|
|
525
|
+
stage: deploy review
|
|
526
|
+
image: path/to/docker/kubernetes:the-version
|
|
527
|
+
variables:
|
|
528
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
529
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
530
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
531
|
+
script:
|
|
532
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
533
|
+
- export ENV_SHORT="review"
|
|
534
|
+
- export APP_DIR="."
|
|
535
|
+
- export ENV_TYPE="review"
|
|
536
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
537
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
538
|
+
- 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")"
|
|
539
|
+
- export HOSTNAME="app.$([ -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"
|
|
540
|
+
- export ROOT_URL="https://app.$([ -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"
|
|
541
|
+
- export HOSTNAME_INTERNAL="app.$([ -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"
|
|
542
|
+
- export ROOT_URL_INTERNAL="https://app.$([ -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"
|
|
543
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
544
|
+
- 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"; })-app"
|
|
545
|
+
- 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"; })-"
|
|
546
|
+
- export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
|
|
547
|
+
- export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
|
|
548
|
+
- export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
|
|
549
|
+
- export RAILS_ENV="production"
|
|
550
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
551
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
552
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
553
|
+
- export DOCKER_IMAGE_NAME="review/app"
|
|
554
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
555
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
556
|
+
- 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"; })-app"
|
|
557
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
558
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
559
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
560
|
+
- export HELM_ARGS=""
|
|
561
|
+
- export COMPONENT_NAME="app"
|
|
562
|
+
- collapseable_section_end "injectvars"
|
|
563
|
+
- 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
564
|
+
- 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
|
|
565
|
+
- 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
|
|
566
|
+
- 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"; })-app"
|
|
567
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
568
|
+
- |
|
|
569
|
+
cat > __all_values.yml <<EOF
|
|
570
|
+
env:
|
|
571
|
+
secret:
|
|
572
|
+
SECRET_KEY_BASE: |-
|
|
573
|
+
$(printf %s "$CL_review_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
|
|
574
|
+
POSTGRESQL_PASSWORD: |-
|
|
575
|
+
$(printf %s "$CL_review_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
|
|
576
|
+
cloudsqlProxyCredentials: |-
|
|
577
|
+
$(printf %s "$CL_review_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
|
|
578
|
+
public:
|
|
579
|
+
ENV_SHORT: |-
|
|
580
|
+
review
|
|
581
|
+
APP_DIR: |-
|
|
582
|
+
.
|
|
583
|
+
ENV_TYPE: |-
|
|
584
|
+
review
|
|
585
|
+
BUILD_INFO_BUILD_ID: |-
|
|
586
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
587
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
588
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
589
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
590
|
+
$(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/^/ /')
|
|
591
|
+
HOSTNAME: |-
|
|
592
|
+
$(printf %s "app.$([ -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/^/ /')
|
|
593
|
+
ROOT_URL: |-
|
|
594
|
+
$(printf %s "https://app.$([ -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/^/ /')
|
|
595
|
+
HOSTNAME_INTERNAL: |-
|
|
596
|
+
$(printf %s "app.$([ -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/^/ /')
|
|
597
|
+
ROOT_URL_INTERNAL: |-
|
|
598
|
+
$(printf %s "https://app.$([ -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/^/ /')
|
|
599
|
+
KUBE_NAMESPACE: |-
|
|
600
|
+
pan-test-app-review
|
|
601
|
+
KUBE_APP_NAME: |-
|
|
602
|
+
$(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"; })-app" | sed '1!s/^/ /')
|
|
603
|
+
KUBE_APP_NAME_PREFIX: |-
|
|
604
|
+
$(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/^/ /')
|
|
605
|
+
RAILS_ENV: |-
|
|
606
|
+
production
|
|
607
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
608
|
+
["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
|
|
609
|
+
application:
|
|
610
|
+
host: |-
|
|
611
|
+
$(printf %s "app.$([ -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/^/ /')
|
|
612
|
+
livenessProbe:
|
|
613
|
+
httpGet:
|
|
614
|
+
path: |-
|
|
615
|
+
__health
|
|
616
|
+
readinessProbe:
|
|
617
|
+
httpGet:
|
|
618
|
+
path: |-
|
|
619
|
+
__health
|
|
620
|
+
startupProbe:
|
|
621
|
+
httpGet:
|
|
622
|
+
path: |-
|
|
623
|
+
__health
|
|
624
|
+
worker:
|
|
625
|
+
enabled: true
|
|
626
|
+
command: |-
|
|
627
|
+
launcher bundle exec rake jobs:work
|
|
628
|
+
livenessProbe: false
|
|
629
|
+
cloudsql:
|
|
630
|
+
enabled: true
|
|
631
|
+
dbUser: |-
|
|
632
|
+
postgres
|
|
633
|
+
instanceConnectionName: |-
|
|
634
|
+
myproject:europe-west6:instance-name
|
|
635
|
+
proxyCredentials: |-
|
|
636
|
+
$CL_review_app_cloudsqlProxyCredentials
|
|
637
|
+
fullDbName: |-
|
|
638
|
+
$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app" | sed '1!s/^/ /')
|
|
639
|
+
type: |-
|
|
640
|
+
unmanaged
|
|
641
|
+
jobs:
|
|
642
|
+
db-migrate:
|
|
643
|
+
hook: |-
|
|
644
|
+
post-upgrade
|
|
645
|
+
command: |-
|
|
646
|
+
launcher bundle exec rake db:migrate
|
|
647
|
+
db-prepare-seed:
|
|
648
|
+
hook: |-
|
|
649
|
+
post-install
|
|
650
|
+
command: |-
|
|
651
|
+
launcher bundle exec rake db:prepare db:seed
|
|
652
|
+
|
|
653
|
+
EOF
|
|
654
|
+
- collapseable_section_end "writeallvalues"
|
|
655
|
+
- kubernetesCreateSecret
|
|
656
|
+
- kubernetesDeploy
|
|
657
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
658
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
659
|
+
- echo deployment successful đģ
|
|
660
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
661
|
+
environment:
|
|
662
|
+
name: review/$CI_COMMIT_REF_NAME/app
|
|
663
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
664
|
+
on_stop: 'app đ Stop â ī¸ | review '
|
|
665
|
+
auto_stop_in: 1 week
|
|
666
|
+
artifacts:
|
|
667
|
+
reports:
|
|
668
|
+
dotenv: gitlab_environment.env
|
|
669
|
+
rules:
|
|
670
|
+
- when: on_success
|
|
671
|
+
if: $CI_MERGE_REQUEST_ID
|
|
672
|
+
needs:
|
|
673
|
+
- job: app đŽ lint
|
|
674
|
+
artifacts: false
|
|
675
|
+
- job: 'app đ¨ docker | review '
|
|
676
|
+
artifacts: false
|
|
677
|
+
- job: app đ§Ē test
|
|
678
|
+
artifacts: false
|
|
679
|
+
- job: 'app đ§ž sbom | review '
|
|
680
|
+
artifacts: true
|
|
681
|
+
- job: app đĄ audit
|
|
682
|
+
artifacts: false
|
|
683
|
+
retry: *a1
|
|
684
|
+
interruptible: true
|
|
685
|
+
allow_failure: false
|
|
686
|
+
'app đ Stop â ī¸ | review ':
|
|
687
|
+
stage: stop review
|
|
688
|
+
image: path/to/docker/kubernetes:the-version
|
|
689
|
+
variables:
|
|
690
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
691
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
692
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
693
|
+
GIT_STRATEGY: none
|
|
694
|
+
script:
|
|
695
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
696
|
+
- export ENV_SHORT="review"
|
|
697
|
+
- export APP_DIR="."
|
|
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="app.$([ -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://app.$([ -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="app.$([ -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://app.$([ -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"; })-app"
|
|
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 SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
|
|
710
|
+
- export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
|
|
711
|
+
- export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
|
|
712
|
+
- export RAILS_ENV="production"
|
|
713
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
714
|
+
- 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"; })-app"
|
|
715
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
716
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
717
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
718
|
+
- export HELM_ARGS=""
|
|
719
|
+
- export COMPONENT_NAME="app"
|
|
720
|
+
- collapseable_section_end "injectvars"
|
|
721
|
+
- 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
722
|
+
- 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
|
|
723
|
+
- 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
|
|
724
|
+
- 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"; })-app"
|
|
725
|
+
- kubernetesDelete
|
|
726
|
+
- echo 'Disabling component in Dependency Track'
|
|
727
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
|
|
728
|
+
environment:
|
|
729
|
+
name: review/$CI_COMMIT_REF_NAME/app
|
|
730
|
+
action: stop
|
|
731
|
+
rules:
|
|
732
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
733
|
+
when: on_success
|
|
734
|
+
- when: manual
|
|
735
|
+
if: $CI_MERGE_REQUEST_ID
|
|
736
|
+
needs: []
|
|
737
|
+
retry: *a1
|
|
738
|
+
interruptible: true
|
|
739
|
+
allow_failure: true
|
|
740
|
+
'app âŠī¸ Rollback â ī¸ | review ':
|
|
741
|
+
stage: rollback review
|
|
742
|
+
image: path/to/docker/kubernetes:the-version
|
|
743
|
+
variables:
|
|
744
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
745
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
746
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
747
|
+
GIT_STRATEGY: none
|
|
748
|
+
script:
|
|
749
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
750
|
+
- export ENV_SHORT="review"
|
|
751
|
+
- export APP_DIR="."
|
|
752
|
+
- export ENV_TYPE="review"
|
|
753
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
754
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
755
|
+
- 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")"
|
|
756
|
+
- export HOSTNAME="app.$([ -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"
|
|
757
|
+
- export ROOT_URL="https://app.$([ -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"
|
|
758
|
+
- export HOSTNAME_INTERNAL="app.$([ -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"
|
|
759
|
+
- export ROOT_URL_INTERNAL="https://app.$([ -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"
|
|
760
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
761
|
+
- 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"; })-app"
|
|
762
|
+
- 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"; })-"
|
|
763
|
+
- export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
|
|
764
|
+
- export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
|
|
765
|
+
- export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
|
|
766
|
+
- export RAILS_ENV="production"
|
|
767
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
768
|
+
- 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"; })-app"
|
|
769
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
770
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
771
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
772
|
+
- export HELM_ARGS=""
|
|
773
|
+
- export COMPONENT_NAME="app"
|
|
774
|
+
- collapseable_section_end "injectvars"
|
|
775
|
+
- 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
776
|
+
- 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
|
|
777
|
+
- 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
|
|
778
|
+
- 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"; })-app"
|
|
779
|
+
- kubernetesRollback
|
|
780
|
+
environment:
|
|
781
|
+
name: review/$CI_COMMIT_REF_NAME/app
|
|
782
|
+
action: access
|
|
783
|
+
rules:
|
|
784
|
+
- when: manual
|
|
785
|
+
if: $CI_MERGE_REQUEST_ID
|
|
786
|
+
needs: []
|
|
787
|
+
retry: *a1
|
|
788
|
+
interruptible: true
|
|
789
|
+
allow_failure: true
|
|
790
|
+
'app đ¨ docker | stage ':
|
|
791
|
+
stage: build
|
|
792
|
+
image: path/to/docker/docker-build:the-version
|
|
793
|
+
services:
|
|
794
|
+
- name: docker:24.0.6-dind
|
|
795
|
+
command:
|
|
796
|
+
- --tls=false
|
|
797
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
798
|
+
variables:
|
|
799
|
+
DOCKER_HOST: tcp://docker:2375
|
|
800
|
+
DOCKER_TLS_CERTDIR: ''
|
|
801
|
+
DOCKER_DRIVER: overlay2
|
|
802
|
+
DOCKER_BUILDKIT: '1'
|
|
803
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
804
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
805
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
806
|
+
script:
|
|
807
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
808
|
+
- export APP_DIR="."
|
|
809
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
810
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
811
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
812
|
+
- export DOCKER_IMAGE_NAME="stage/app"
|
|
813
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
814
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
815
|
+
- collapseable_section_end "injectvars"
|
|
816
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
817
|
+
- cd .
|
|
818
|
+
- wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.36.4/pack-v0.36.4-linux.tgz | tar -zx --directory /usr/local/bin pack
|
|
819
|
+
- chmod +x /usr/local/bin/pack
|
|
820
|
+
- sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
|
|
821
|
+
- 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:24'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
|
|
822
|
+
rules:
|
|
823
|
+
- if: $CI_COMMIT_TAG
|
|
824
|
+
needs: []
|
|
825
|
+
retry: *a1
|
|
826
|
+
interruptible: true
|
|
827
|
+
'app đ§ž sbom | stage ':
|
|
828
|
+
stage: build
|
|
829
|
+
image:
|
|
830
|
+
name: aquasec/trivy:0.58.2
|
|
831
|
+
entrypoint:
|
|
832
|
+
- ''
|
|
833
|
+
variables: {}
|
|
834
|
+
script:
|
|
835
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
836
|
+
- collapseable_section_end "injectvars"
|
|
837
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" .
|
|
838
|
+
artifacts:
|
|
839
|
+
paths:
|
|
840
|
+
- __sbom.json
|
|
841
|
+
rules:
|
|
842
|
+
- if: $CI_COMMIT_TAG
|
|
843
|
+
needs: []
|
|
844
|
+
retry: *a1
|
|
845
|
+
interruptible: true
|
|
846
|
+
allow_failure: true
|
|
847
|
+
'app đ Deploy | stage ':
|
|
848
|
+
stage: deploy stage
|
|
849
|
+
image: path/to/docker/kubernetes:the-version
|
|
850
|
+
variables:
|
|
851
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
852
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
853
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
854
|
+
script:
|
|
855
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
856
|
+
- export ENV_SHORT="stage"
|
|
857
|
+
- export APP_DIR="."
|
|
858
|
+
- export ENV_TYPE="stage"
|
|
859
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
860
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
861
|
+
- 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")"
|
|
862
|
+
- export HOSTNAME="app.stage.test-app.pan.panter.cloud"
|
|
863
|
+
- export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
|
|
864
|
+
- export HOSTNAME_INTERNAL="app.stage.test-app.pan.panter.cloud"
|
|
865
|
+
- export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
|
|
866
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
867
|
+
- export KUBE_APP_NAME="app"
|
|
868
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
869
|
+
- export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
|
|
870
|
+
- export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
|
|
871
|
+
- export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
|
|
872
|
+
- export RAILS_ENV="production"
|
|
873
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
874
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
875
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
876
|
+
- export DOCKER_IMAGE_NAME="stage/app"
|
|
877
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
878
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
879
|
+
- export RELEASE_NAME="pan-test-app-stage-app"
|
|
880
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
881
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
882
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
883
|
+
- export HELM_ARGS=""
|
|
884
|
+
- export COMPONENT_NAME="app"
|
|
885
|
+
- collapseable_section_end "injectvars"
|
|
886
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
887
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
|
|
888
|
+
- kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
|
|
889
|
+
- kubectl config use-context "kube-pan-test-app-stage-app"
|
|
890
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
891
|
+
- |
|
|
892
|
+
cat > __all_values.yml <<EOF
|
|
893
|
+
env:
|
|
894
|
+
secret:
|
|
895
|
+
SECRET_KEY_BASE: |-
|
|
896
|
+
$(printf %s "$CL_stage_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
|
|
897
|
+
POSTGRESQL_PASSWORD: |-
|
|
898
|
+
$(printf %s "$CL_stage_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
|
|
899
|
+
cloudsqlProxyCredentials: |-
|
|
900
|
+
$(printf %s "$CL_stage_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
|
|
901
|
+
public:
|
|
902
|
+
ENV_SHORT: |-
|
|
903
|
+
stage
|
|
904
|
+
APP_DIR: |-
|
|
905
|
+
.
|
|
906
|
+
ENV_TYPE: |-
|
|
907
|
+
stage
|
|
908
|
+
BUILD_INFO_BUILD_ID: |-
|
|
909
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
910
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
911
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
912
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
913
|
+
$(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/^/ /')
|
|
914
|
+
HOSTNAME: |-
|
|
915
|
+
app.stage.test-app.pan.panter.cloud
|
|
916
|
+
ROOT_URL: |-
|
|
917
|
+
https://app.stage.test-app.pan.panter.cloud
|
|
918
|
+
HOSTNAME_INTERNAL: |-
|
|
919
|
+
app.stage.test-app.pan.panter.cloud
|
|
920
|
+
ROOT_URL_INTERNAL: |-
|
|
921
|
+
https://app.stage.test-app.pan.panter.cloud
|
|
922
|
+
KUBE_NAMESPACE: |-
|
|
923
|
+
pan-test-app-stage
|
|
924
|
+
KUBE_APP_NAME: |-
|
|
925
|
+
app
|
|
926
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
927
|
+
RAILS_ENV: |-
|
|
928
|
+
production
|
|
929
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
930
|
+
["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
|
|
931
|
+
application:
|
|
932
|
+
host: |-
|
|
933
|
+
app.stage.test-app.pan.panter.cloud
|
|
934
|
+
livenessProbe:
|
|
935
|
+
httpGet:
|
|
936
|
+
path: |-
|
|
937
|
+
__health
|
|
938
|
+
readinessProbe:
|
|
939
|
+
httpGet:
|
|
940
|
+
path: |-
|
|
941
|
+
__health
|
|
942
|
+
startupProbe:
|
|
943
|
+
httpGet:
|
|
944
|
+
path: |-
|
|
945
|
+
__health
|
|
946
|
+
worker:
|
|
947
|
+
enabled: true
|
|
948
|
+
command: |-
|
|
949
|
+
launcher bundle exec rake jobs:work
|
|
950
|
+
livenessProbe: false
|
|
951
|
+
cloudsql:
|
|
952
|
+
enabled: true
|
|
953
|
+
dbUser: |-
|
|
954
|
+
postgres
|
|
955
|
+
instanceConnectionName: |-
|
|
956
|
+
myproject:europe-west6:instance-name
|
|
957
|
+
proxyCredentials: |-
|
|
958
|
+
$CL_stage_app_cloudsqlProxyCredentials
|
|
959
|
+
fullDbName: |-
|
|
960
|
+
pan-test-app-stage-app
|
|
961
|
+
type: |-
|
|
962
|
+
unmanaged
|
|
963
|
+
jobs:
|
|
964
|
+
db-migrate:
|
|
965
|
+
hook: |-
|
|
966
|
+
post-install,post-upgrade
|
|
967
|
+
command: |-
|
|
968
|
+
launcher bundle exec rake db:migrate
|
|
969
|
+
|
|
970
|
+
EOF
|
|
971
|
+
- collapseable_section_end "writeallvalues"
|
|
972
|
+
- kubernetesCreateSecret
|
|
973
|
+
- kubernetesDeploy
|
|
974
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
975
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
976
|
+
- echo deployment successful đģ
|
|
977
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
978
|
+
environment:
|
|
979
|
+
name: stage/app
|
|
980
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
981
|
+
on_stop: 'app đ Stop â ī¸ | stage '
|
|
982
|
+
artifacts:
|
|
983
|
+
reports:
|
|
984
|
+
dotenv: gitlab_environment.env
|
|
985
|
+
rules:
|
|
986
|
+
- when: on_success
|
|
987
|
+
if: $CI_COMMIT_TAG
|
|
988
|
+
needs:
|
|
989
|
+
- job: 'app đ¨ docker | stage '
|
|
990
|
+
artifacts: false
|
|
991
|
+
- job: 'app đ§ž sbom | stage '
|
|
992
|
+
artifacts: true
|
|
993
|
+
retry: *a1
|
|
994
|
+
interruptible: true
|
|
995
|
+
allow_failure: false
|
|
996
|
+
'app đ Stop â ī¸ | stage ':
|
|
997
|
+
stage: stop stage
|
|
998
|
+
image: path/to/docker/kubernetes:the-version
|
|
999
|
+
variables:
|
|
1000
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1001
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1002
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1003
|
+
GIT_STRATEGY: none
|
|
1004
|
+
script:
|
|
1005
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1006
|
+
- export ENV_SHORT="stage"
|
|
1007
|
+
- export APP_DIR="."
|
|
1008
|
+
- export ENV_TYPE="stage"
|
|
1009
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1010
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1011
|
+
- 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")"
|
|
1012
|
+
- export HOSTNAME="app.stage.test-app.pan.panter.cloud"
|
|
1013
|
+
- export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
|
|
1014
|
+
- export HOSTNAME_INTERNAL="app.stage.test-app.pan.panter.cloud"
|
|
1015
|
+
- export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
|
|
1016
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
1017
|
+
- export KUBE_APP_NAME="app"
|
|
1018
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1019
|
+
- export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
|
|
1020
|
+
- export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
|
|
1021
|
+
- export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
|
|
1022
|
+
- export RAILS_ENV="production"
|
|
1023
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
1024
|
+
- export RELEASE_NAME="pan-test-app-stage-app"
|
|
1025
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1026
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
1027
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1028
|
+
- export HELM_ARGS=""
|
|
1029
|
+
- export COMPONENT_NAME="app"
|
|
1030
|
+
- collapseable_section_end "injectvars"
|
|
1031
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
1032
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
|
|
1033
|
+
- kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
|
|
1034
|
+
- kubectl config use-context "kube-pan-test-app-stage-app"
|
|
1035
|
+
- kubernetesDelete
|
|
1036
|
+
- echo 'Disabling component in Dependency Track'
|
|
1037
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
|
|
1038
|
+
environment:
|
|
1039
|
+
name: stage/app
|
|
1040
|
+
action: stop
|
|
1041
|
+
rules:
|
|
1042
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
1043
|
+
when: on_success
|
|
1044
|
+
- when: manual
|
|
1045
|
+
if: $CI_COMMIT_TAG
|
|
1046
|
+
needs: []
|
|
1047
|
+
retry: *a1
|
|
1048
|
+
interruptible: true
|
|
1049
|
+
allow_failure: true
|
|
1050
|
+
'app âŠī¸ Rollback â ī¸ | stage ':
|
|
1051
|
+
stage: rollback stage
|
|
1052
|
+
image: path/to/docker/kubernetes:the-version
|
|
1053
|
+
variables:
|
|
1054
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1055
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1056
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1057
|
+
GIT_STRATEGY: none
|
|
1058
|
+
script:
|
|
1059
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1060
|
+
- export ENV_SHORT="stage"
|
|
1061
|
+
- export APP_DIR="."
|
|
1062
|
+
- export ENV_TYPE="stage"
|
|
1063
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1064
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1065
|
+
- 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")"
|
|
1066
|
+
- export HOSTNAME="app.stage.test-app.pan.panter.cloud"
|
|
1067
|
+
- export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
|
|
1068
|
+
- export HOSTNAME_INTERNAL="app.stage.test-app.pan.panter.cloud"
|
|
1069
|
+
- export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
|
|
1070
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
1071
|
+
- export KUBE_APP_NAME="app"
|
|
1072
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1073
|
+
- export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
|
|
1074
|
+
- export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
|
|
1075
|
+
- export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
|
|
1076
|
+
- export RAILS_ENV="production"
|
|
1077
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
1078
|
+
- export RELEASE_NAME="pan-test-app-stage-app"
|
|
1079
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1080
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
1081
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1082
|
+
- export HELM_ARGS=""
|
|
1083
|
+
- export COMPONENT_NAME="app"
|
|
1084
|
+
- collapseable_section_end "injectvars"
|
|
1085
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
1086
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
|
|
1087
|
+
- kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
|
|
1088
|
+
- kubectl config use-context "kube-pan-test-app-stage-app"
|
|
1089
|
+
- kubernetesRollback
|
|
1090
|
+
environment:
|
|
1091
|
+
name: stage/app
|
|
1092
|
+
action: access
|
|
1093
|
+
rules:
|
|
1094
|
+
- when: manual
|
|
1095
|
+
if: $CI_COMMIT_TAG
|
|
1096
|
+
needs: []
|
|
1097
|
+
retry: *a1
|
|
1098
|
+
interruptible: true
|
|
1099
|
+
allow_failure: true
|
|
1100
|
+
'app đ¨ docker | prod ':
|
|
1101
|
+
stage: build
|
|
1102
|
+
image: path/to/docker/docker-build:the-version
|
|
1103
|
+
services:
|
|
1104
|
+
- name: docker:24.0.6-dind
|
|
1105
|
+
command:
|
|
1106
|
+
- --tls=false
|
|
1107
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
1108
|
+
variables:
|
|
1109
|
+
DOCKER_HOST: tcp://docker:2375
|
|
1110
|
+
DOCKER_TLS_CERTDIR: ''
|
|
1111
|
+
DOCKER_DRIVER: overlay2
|
|
1112
|
+
DOCKER_BUILDKIT: '1'
|
|
1113
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1114
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1115
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
1116
|
+
script:
|
|
1117
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1118
|
+
- export APP_DIR="."
|
|
1119
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
1120
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
1121
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
1122
|
+
- export DOCKER_IMAGE_NAME="prod/app"
|
|
1123
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
1124
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1125
|
+
- collapseable_section_end "injectvars"
|
|
1126
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
1127
|
+
- cd .
|
|
1128
|
+
- wget --output-document=- https://github.com/buildpacks/pack/releases/download/v0.36.4/pack-v0.36.4-linux.tgz | tar -zx --directory /usr/local/bin pack
|
|
1129
|
+
- chmod +x /usr/local/bin/pack
|
|
1130
|
+
- sed --in-place 's|git@\\([^:]*\\):|https://\\1/|g' Gemfile Gemfile.lock
|
|
1131
|
+
- 'pack build "$DOCKER_IMAGE:$DOCKER_IMAGE_TAG" --builder ''heroku/builder:24'' --publish --cache-image "$DOCKER_CACHE_IMAGE" --env ''SECRET_KEY_BASE=dummy-value'' '
|
|
1132
|
+
rules:
|
|
1133
|
+
- if: $CI_COMMIT_TAG
|
|
1134
|
+
needs: []
|
|
1135
|
+
retry: *a1
|
|
1136
|
+
interruptible: true
|
|
1137
|
+
'app đ§ž sbom | prod ':
|
|
1138
|
+
stage: build
|
|
1139
|
+
image:
|
|
1140
|
+
name: aquasec/trivy:0.58.2
|
|
1141
|
+
entrypoint:
|
|
1142
|
+
- ''
|
|
1143
|
+
variables: {}
|
|
1144
|
+
script:
|
|
1145
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1146
|
+
- collapseable_section_end "injectvars"
|
|
1147
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" .
|
|
1148
|
+
artifacts:
|
|
1149
|
+
paths:
|
|
1150
|
+
- __sbom.json
|
|
1151
|
+
rules:
|
|
1152
|
+
- if: $CI_COMMIT_TAG
|
|
1153
|
+
needs: []
|
|
1154
|
+
retry: *a1
|
|
1155
|
+
interruptible: true
|
|
1156
|
+
allow_failure: true
|
|
1157
|
+
'app đ Deploy | prod ':
|
|
1158
|
+
stage: deploy prod
|
|
1159
|
+
image: path/to/docker/kubernetes:the-version
|
|
1160
|
+
variables:
|
|
1161
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1162
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1163
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1164
|
+
script:
|
|
1165
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1166
|
+
- export ENV_SHORT="prod"
|
|
1167
|
+
- export APP_DIR="."
|
|
1168
|
+
- export ENV_TYPE="prod"
|
|
1169
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1170
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1171
|
+
- 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")"
|
|
1172
|
+
- export HOSTNAME="my-fancy-website.com"
|
|
1173
|
+
- export ROOT_URL="https://my-fancy-website.com"
|
|
1174
|
+
- export HOSTNAME_INTERNAL="app.prod.test-app.pan.panter.cloud"
|
|
1175
|
+
- export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
|
|
1176
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
1177
|
+
- export KUBE_APP_NAME="app"
|
|
1178
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1179
|
+
- export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
|
|
1180
|
+
- export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
|
|
1181
|
+
- export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
|
|
1182
|
+
- export RAILS_ENV="production"
|
|
1183
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
1184
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
1185
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
|
|
1186
|
+
- export DOCKER_IMAGE_NAME="prod/app"
|
|
1187
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
1188
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1189
|
+
- export RELEASE_NAME="pan-test-app-prod-app"
|
|
1190
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1191
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
1192
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1193
|
+
- export HELM_ARGS=""
|
|
1194
|
+
- export COMPONENT_NAME="app"
|
|
1195
|
+
- collapseable_section_end "injectvars"
|
|
1196
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
1197
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
|
|
1198
|
+
- kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
|
|
1199
|
+
- kubectl config use-context "kube-pan-test-app-prod-app"
|
|
1200
|
+
- collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
|
|
1201
|
+
- |
|
|
1202
|
+
cat > __all_values.yml <<EOF
|
|
1203
|
+
env:
|
|
1204
|
+
secret:
|
|
1205
|
+
SECRET_KEY_BASE: |-
|
|
1206
|
+
$(printf %s "$CL_prod_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
|
|
1207
|
+
POSTGRESQL_PASSWORD: |-
|
|
1208
|
+
$(printf %s "$CL_prod_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
|
|
1209
|
+
cloudsqlProxyCredentials: |-
|
|
1210
|
+
$(printf %s "$CL_prod_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
|
|
1211
|
+
public:
|
|
1212
|
+
ENV_SHORT: |-
|
|
1213
|
+
prod
|
|
1214
|
+
APP_DIR: |-
|
|
1215
|
+
.
|
|
1216
|
+
ENV_TYPE: |-
|
|
1217
|
+
prod
|
|
1218
|
+
BUILD_INFO_BUILD_ID: |-
|
|
1219
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
|
|
1220
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
1221
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
|
|
1222
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
1223
|
+
$(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/^/ /')
|
|
1224
|
+
HOSTNAME: |-
|
|
1225
|
+
my-fancy-website.com
|
|
1226
|
+
ROOT_URL: |-
|
|
1227
|
+
https://my-fancy-website.com
|
|
1228
|
+
HOSTNAME_INTERNAL: |-
|
|
1229
|
+
app.prod.test-app.pan.panter.cloud
|
|
1230
|
+
ROOT_URL_INTERNAL: |-
|
|
1231
|
+
https://app.prod.test-app.pan.panter.cloud
|
|
1232
|
+
KUBE_NAMESPACE: |-
|
|
1233
|
+
pan-test-app-prod
|
|
1234
|
+
KUBE_APP_NAME: |-
|
|
1235
|
+
app
|
|
1236
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
1237
|
+
RAILS_ENV: |-
|
|
1238
|
+
production
|
|
1239
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
1240
|
+
["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
|
|
1241
|
+
application:
|
|
1242
|
+
host: |-
|
|
1243
|
+
my-fancy-website.com
|
|
1244
|
+
livenessProbe:
|
|
1245
|
+
httpGet:
|
|
1246
|
+
path: |-
|
|
1247
|
+
__health
|
|
1248
|
+
readinessProbe:
|
|
1249
|
+
httpGet:
|
|
1250
|
+
path: |-
|
|
1251
|
+
__health
|
|
1252
|
+
startupProbe:
|
|
1253
|
+
httpGet:
|
|
1254
|
+
path: |-
|
|
1255
|
+
__health
|
|
1256
|
+
worker:
|
|
1257
|
+
enabled: true
|
|
1258
|
+
command: |-
|
|
1259
|
+
launcher bundle exec rake jobs:work
|
|
1260
|
+
livenessProbe: false
|
|
1261
|
+
cloudsql:
|
|
1262
|
+
enabled: true
|
|
1263
|
+
dbUser: |-
|
|
1264
|
+
postgres
|
|
1265
|
+
instanceConnectionName: |-
|
|
1266
|
+
myproject:europe-west6:instance-name
|
|
1267
|
+
proxyCredentials: |-
|
|
1268
|
+
$CL_prod_app_cloudsqlProxyCredentials
|
|
1269
|
+
fullDbName: |-
|
|
1270
|
+
pan-test-app-prod-app
|
|
1271
|
+
type: |-
|
|
1272
|
+
unmanaged
|
|
1273
|
+
jobs:
|
|
1274
|
+
db-migrate:
|
|
1275
|
+
hook: |-
|
|
1276
|
+
post-install,post-upgrade
|
|
1277
|
+
command: |-
|
|
1278
|
+
launcher bundle exec rake db:migrate
|
|
1279
|
+
|
|
1280
|
+
EOF
|
|
1281
|
+
- collapseable_section_end "writeallvalues"
|
|
1282
|
+
- kubernetesCreateSecret
|
|
1283
|
+
- kubernetesDeploy
|
|
1284
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
1285
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
|
|
1286
|
+
- echo deployment successful đģ
|
|
1287
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
|
|
1288
|
+
environment:
|
|
1289
|
+
name: prod/app
|
|
1290
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1291
|
+
on_stop: 'app đ Stop â ī¸ | prod '
|
|
1292
|
+
artifacts:
|
|
1293
|
+
reports:
|
|
1294
|
+
dotenv: gitlab_environment.env
|
|
1295
|
+
rules:
|
|
1296
|
+
- when: manual
|
|
1297
|
+
if: $CI_COMMIT_TAG
|
|
1298
|
+
needs:
|
|
1299
|
+
- job: 'app đ¨ docker | prod '
|
|
1300
|
+
artifacts: false
|
|
1301
|
+
- job: 'app đ§ž sbom | prod '
|
|
1302
|
+
artifacts: true
|
|
1303
|
+
retry: *a1
|
|
1304
|
+
interruptible: true
|
|
1305
|
+
allow_failure: true
|
|
1306
|
+
'app đ Stop â ī¸ | prod ':
|
|
1307
|
+
stage: stop prod
|
|
1308
|
+
image: path/to/docker/kubernetes:the-version
|
|
1309
|
+
variables:
|
|
1310
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1311
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1312
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1313
|
+
GIT_STRATEGY: none
|
|
1314
|
+
script:
|
|
1315
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1316
|
+
- export ENV_SHORT="prod"
|
|
1317
|
+
- export APP_DIR="."
|
|
1318
|
+
- export ENV_TYPE="prod"
|
|
1319
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1320
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1321
|
+
- 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")"
|
|
1322
|
+
- export HOSTNAME="my-fancy-website.com"
|
|
1323
|
+
- export ROOT_URL="https://my-fancy-website.com"
|
|
1324
|
+
- export HOSTNAME_INTERNAL="app.prod.test-app.pan.panter.cloud"
|
|
1325
|
+
- export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
|
|
1326
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
1327
|
+
- export KUBE_APP_NAME="app"
|
|
1328
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1329
|
+
- export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
|
|
1330
|
+
- export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
|
|
1331
|
+
- export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
|
|
1332
|
+
- export RAILS_ENV="production"
|
|
1333
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
1334
|
+
- export RELEASE_NAME="pan-test-app-prod-app"
|
|
1335
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1336
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
1337
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1338
|
+
- export HELM_ARGS=""
|
|
1339
|
+
- export COMPONENT_NAME="app"
|
|
1340
|
+
- collapseable_section_end "injectvars"
|
|
1341
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
1342
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
|
|
1343
|
+
- kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
|
|
1344
|
+
- kubectl config use-context "kube-pan-test-app-prod-app"
|
|
1345
|
+
- kubernetesDelete
|
|
1346
|
+
- echo 'Disabling component in Dependency Track'
|
|
1347
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
|
|
1348
|
+
environment:
|
|
1349
|
+
name: prod/app
|
|
1350
|
+
action: stop
|
|
1351
|
+
rules:
|
|
1352
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
1353
|
+
when: on_success
|
|
1354
|
+
- when: manual
|
|
1355
|
+
if: $CI_COMMIT_TAG
|
|
1356
|
+
needs: []
|
|
1357
|
+
retry: *a1
|
|
1358
|
+
interruptible: true
|
|
1359
|
+
allow_failure: true
|
|
1360
|
+
'app âŠī¸ Rollback â ī¸ | prod ':
|
|
1361
|
+
stage: rollback prod
|
|
1362
|
+
image: path/to/docker/kubernetes:the-version
|
|
1363
|
+
variables:
|
|
1364
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1365
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1366
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1367
|
+
GIT_STRATEGY: none
|
|
1368
|
+
script:
|
|
1369
|
+
- collapseable_section_start "injectvars" "Injecting variables"
|
|
1370
|
+
- export ENV_SHORT="prod"
|
|
1371
|
+
- export APP_DIR="."
|
|
1372
|
+
- export ENV_TYPE="prod"
|
|
1373
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1374
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1375
|
+
- 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")"
|
|
1376
|
+
- export HOSTNAME="my-fancy-website.com"
|
|
1377
|
+
- export ROOT_URL="https://my-fancy-website.com"
|
|
1378
|
+
- export HOSTNAME_INTERNAL="app.prod.test-app.pan.panter.cloud"
|
|
1379
|
+
- export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
|
|
1380
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
1381
|
+
- export KUBE_APP_NAME="app"
|
|
1382
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
1383
|
+
- export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
|
|
1384
|
+
- export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
|
|
1385
|
+
- export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
|
|
1386
|
+
- export RAILS_ENV="production"
|
|
1387
|
+
- 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
|
|
1388
|
+
- export RELEASE_NAME="pan-test-app-prod-app"
|
|
1389
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
1390
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
|
|
1391
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
1392
|
+
- export HELM_ARGS=""
|
|
1393
|
+
- export COMPONENT_NAME="app"
|
|
1394
|
+
- collapseable_section_end "injectvars"
|
|
1395
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
1396
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
|
|
1397
|
+
- kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
|
|
1398
|
+
- kubectl config use-context "kube-pan-test-app-prod-app"
|
|
1399
|
+
- kubernetesRollback
|
|
1400
|
+
environment:
|
|
1401
|
+
name: prod/app
|
|
1402
|
+
action: access
|
|
1403
|
+
rules:
|
|
1404
|
+
- when: manual
|
|
1405
|
+
if: $CI_COMMIT_TAG
|
|
1406
|
+
needs: []
|
|
1407
|
+
retry: *a1
|
|
1408
|
+
interruptible: true
|
|
1409
|
+
allow_failure: true
|
|
1410
|
+
create release:
|
|
1411
|
+
stage: release
|
|
1412
|
+
image: path/to/docker/semantic-release:the-version
|
|
1413
|
+
script:
|
|
1414
|
+
- semanticRelease
|
|
1415
|
+
- echo 'đ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
|
|
1416
|
+
rules:
|
|
1417
|
+
- &a3
|
|
1418
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1419
|
+
when: never
|
|
1420
|
+
- &a4
|
|
1421
|
+
if: $CI_PIPELINE_SOURCE == "schedule"
|
|
1422
|
+
when: never
|
|
1423
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
|
|
1424
|
+
when: on_success
|
|
1425
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1426
|
+
when: manual
|
|
1427
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
|
|
1428
|
+
when: manual
|
|
1429
|
+
â ī¸ force create release:
|
|
1430
|
+
stage: release
|
|
1431
|
+
image: path/to/docker/semantic-release:the-version
|
|
1432
|
+
script:
|
|
1433
|
+
- semanticRelease
|
|
1434
|
+
- echo 'đ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
|
|
1435
|
+
rules:
|
|
1436
|
+
- *a3
|
|
1437
|
+
- *a4
|
|
1438
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1439
|
+
when: manual
|
|
1440
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
|
|
1441
|
+
when: manual
|
|
1442
|
+
needs: []
|
|
1443
|
+
"
|
|
1444
|
+
`;
|