我希望一直为开发和主分支部署CI-CD管道。功能分支的管道将在需要时由开发人员手动创建。
我正在使用来自https://github.com/awslabs/aws-simple-cicd
在project-config.json中,我们有:
"Backend": [
{
"pipelineName": "backend",
"ccRepoName": "backend",
"branch": "master",
"type": "BitBucket",
"cron": ""
}
],
步骤1。分支主部署的管道
步骤2。编辑project-config.json并更改分支名称:
"Backend": [
{
"pipelineName": "backend",
"ccRepoName": "backend",
"branch": "develop",
"type": "BitBucket",
"cron": ""
}
],
步骤3。为开发分支部署的管道
在这个阶段,它删除主分支的管道,并将其部署到开发分支。我们如何同时保留多个分支的管道?
maafk提供的答案是一个很好的答案。然而,在我们的案例中,出于合规性原因,我们不能从同一个AWS帐户为不同的环境提供不同的管道。因此,在我们的环境中,我们有一个开发AWS帐户、一个暂存帐户和一个生产帐户。开发、阶段和生产环境的每个管道都需要从自己的AWS帐户中进行配置。此外,我们的生产帐户需要与其他没有连接的帐户完全隔离,无论是与开发帐户还是与暂存帐户。除此之外,我们的开发人员需要为不同的开发分支创建管道。我们没有简单的方法来管理这一切,而不会在多个aws帐户中创建各种管道,在这些帐户中,我们只需要一个用于生产,一个用于暂存。我们提出了以下解决方案,该解决方案通常允许部署任何数量的管道,而无需在cdk源代码中检查任何与分支相关的绑定。
我们正在创建一个代码管道,如下所示:
const branch = this.node.tryGetContext("branch");
new CodePipeline(this, createResourceName(this.node, "CodePipeline"), {
pipelineName: createResourceName(this.node, "CodePipeline"),
synth: new CodeBuildStep("Synth", {
input: ...,
env: { // The trick is to create an environment variable where the branch name is stored.
"BRANCH": branch,
},
commands: [
"npm ci",
"npm run build",
"npx cdk synth -c branch=$BRANCH", // During synthesis the environment variable is passed in as the branch name to the cdk context.
]
})
});
// This is just for generating resource names based on the pipeline branch
export function createResourceName(node: ConstructNode, resourceName: string) {
const branch = node.tryGetContext("branch");
return `${branch}-${resourceName}`;
}
这里的技巧在于如何在合成过程中解析分支变量。它实际上是从cdk上下文中查找的。开发人员第一次从新的开发分支(例如分支"dev"(提供管道时;bug123";,cdk应用程序是使用如下命令部署的:CCD_ 1。这通常在本地工作站上执行。在合成期间,从cdk上下文中检索分支。同时,第一次部署在CodeBuild项目中创建一个名为BRANCH的环境变量,负责合成CDK应用程序。这就像在石头上写下管道的分支名称。
第二次运行管道时,例如,因为开发人员向分支签入了一些代码,所以为合成应用程序而运行的命令是管道的命令部分中定义的命令:npx cdk synth -c branch=$BRANCH
。由于环境变量是在第一次部署时设置的,现在将相同的分支名称传递给cdk上下文。因此,cdk代码中的分支变量再次从上下文解析为创建管道时使用的原始分支名称。
这样,就可以创建多个分支并为每个分支部署新的管道,而无需担心或维护源代码中分支和管道之间的任何映射。
您可以根据要构建的分支定义多个管道堆栈
我使用以下方法(使用Python(成功地做到了这一点
# app.py
from aws_cdk import core
from my_project.pipeline_stack import PipelineStack
app = core.App()
PipelineStack(app, "project-master-branch",
branch="main"
)
PipelineStack(app, "project-develop-branch",
branch="develop"
)
PipelineStack
看起来像
# my_project/pipeline_stack.py
from aws_cdk import (
core,
pipelines,
aws_codepipeline as codepipeline,
aws_codepipeline_actions as cpactions
)
class PipelineStack(core.Stack):
def __init__(self, scope: core.Construct, id: str, branch: str, **kwargs) -> None:
super().__init__(scope, id, **kwargs)
source_artifact = codepipeline.Artifact()
cloud_assembly_artifact = codepipeline.Artifact()
pipeline = pipelines.CdkPipeline(
self,
"Pipeline",
cloud_assembly_artifact=cloud_assembly_artifact,
pipeline_name=f"my-pipeline-{branch}",
source_action=cpactions.BitBucketSourceAction(
... # your Bitbucket details
branch=branch # taking the main or develop branch
),
synth_action=pipelines.SimpleSynthAction(
source_artifact=source_artifact,
cloud_assembly_artifact=cloud_assembly_artifact,
install_command="npm i -g aws-cdk",
synth_command="cdk synth",
... # other options you can provide
)
)
这将创建两个代码管道,用于响应main
和develop
的更改并进行部署