使用 GitLab 部署 ImageLabeller

Warren 是一位由开发人员转型的技术布道师,于 2021 年加入 Atlassian。他的职业履历涵盖从大型机运行的 COBOL 电信软件,到 AWS 现代云基础架构等各种工作。他不仅对技术充满热忱,还具备机器学习领域的研究背景。作为技术布道师,Warren 通过演示、文章和视频,提升市场对 Atlassian 产品及其合作伙伴集成能力的认知。闲暇之余,他常沉浸在巴西柔术的训练中。

为了演示如何使用 Jira Software 和各种互联工具开发、部署和管理应用,我们的团队创建了 ImageLabeller,这是一款基于 AWS 构建的简单演示应用,它使用机器学习将标签应用于图像。

本页面介绍如何使用 GitLab 部署 ImageLabeller。在您开始之前,我们建议阅读 ImageLabeller 架构AWS SageMaker 设置页面,以了解背景信息。

先决条件

如果您还没有 GitLab 组,请按照本 GitLab 指南中的步骤从头开始创建一个。

使用 ImageLabeller 代码的面向公众的 GitHub 存储库

Jira GitLab 集成演示视频

集成 Jira 和 GitLab

从 Jira 中,单击“看板”,再单击“应用”,然后单击“GitLab”。

Jira Software 中导航到 GitLab 的下拉菜单的屏幕截图

单击“立即获取”。

Jira Software 中的 GitLab 应用模式

单击“应用”,然后单击“管理您的应用”。

Jira software 中带下拉菜单的 Gitlab 应用模式

扩展适用于 GitLab for Jira。

在 Jira Software 的“管理应用”屏幕上展开 Gitlab

单击“添加命名空间”。

向 Gitlab Jira software 配置中添加命名空间的屏幕

选择您现有的命名空间,并单击“链接”。本指南假设您已经有一个现有的 GitLab 帐户和 GitLab 组。

在 Jira Software 中链接 Gitlab 命名空间

将 SSH 密钥添加到 GitLab

单击右上角的个人资料图标,并单击首选项

在 Gitlab 中使用下拉菜单导航到首选项

单击“SSH 密钥”并按照“生成新的 SSH 密钥”或“使用现有的 SSH 密钥”的说明。

为 AWS S3 基础架构创建存储库

标准的开发人员循环通常是让开发人员从 Jira 中接取任务,将其移至正在进行的工作中,然后进行开发工作。Jira 事务 ID 是将开发工作与 Jira 事务联系起来的关键。它是两个系统之间的核心集成组件。

转到 Jira,创建一个新事务,将 AWS S3 基础架构存储库添加到 GitLab。记下事务 ID。本例中为 IM-5。

在 Jira software 中为您的看板创建一个新事务

转到 GitLab,并单击“新项目”。

在 GitLab 中导航到创建“新项目”

单击“创建空白项目”。

在 GitLab 中创建一个新项目

添加“项目名称”,然后在“项目 URL”中选择相应的组。单击“创建项目”以继续。

在 Gitlab 中创建新项目 - 详细屏幕

在您的终端中,转到您的 s3_infra 存储库并运行以下命令,将您的 AWS CloudFormation template.yml 文件推送到 GitLab。

1git add --all
2git commit -m "IM-5 add s3_infra repository to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
4git branch -m mainline
5git push -u origin mainline

添加 AWS 访问密钥

单击“设置”,然后单击“CI/CD”。向下滚动,然后展开“变量”。单击“添加变量”。

GitLab 中的 CI/CD 设置页面

创建两个变量。一个用于您的 AWS 访问密钥 ID,另一个用于您的 AWS 秘密访问密钥。

在 GitLab 中“添加变量”模式以添加您的 AWS 密钥

保护变量,使其仅供在受保护分支和标记上运行的管道使用。向与 AWS 访问密钥关联的 IAM 用户授予管理员访问权限。您也可以通过选择个别 AWS 访问策略来选择使用更精细的访问控制。

在 GitLab 的 CI/CD 设置页面的“变量”部分下列出的 AWS 密钥

配置受保护分支以访问受保护的变量

单击“设置”,然后单击“存储库”。向下滚动,然后展开“受保护分支”。

输入您的 Jira 事务 ID 前缀和 *。

在本例中,Jira 事务 ID 与 IM-5 和 IM-6 类似;前缀是 IM-。

输入 IM-*,并单击“保护”。

在 GitLab 中配置受保护分支

您将看到主线,以及 IM-* 作为受保护分支。

设置部署环境

单击“部署”,然后单击“环境”。单击“新建环境”以添加新环境。在本例中,US-WEST-1 和 US-EAST-2 中有测试环境,US-WEST-2、US-EAST-1 和 CA-CENTRAL-1 中有生产环境。

在 GitLab 中设置部署环境

用于部署到 AWS 的 .gitlab-ci.yml

在您的终端中转到 s3_infra 存储库,创建一个以您的 Jira 事务 ID 命名的分支。

1git checkout -b IM-5

使用以下 yaml 创建一个 .gitlab-ci.yml 文件。这为您的测试、暂存和生产环境定义了部署工作流程。

1stages:
2  - merge-request
3  - test-us-west-1
4  - test-us-east-2
5  - production-us-west-2
6  - production-us-east-1
7  - production-ca-central-1
8
9merge-request-pipeline-job:
10  stage: merge-request
11  rules:
12    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
13  script:
14    - echo "This pipeline always succeeds and enables merges during merge requests"
15    - echo true
16
17deploy-test-us-west-1:
18  stage: test-us-west-1
19  environment: test-us-west-1
20  rules:
21    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
22  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
23  script:
24    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
25    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
26    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
27
28deploy-test-us-east-2:
29  stage: test-us-east-2
30  environment: test-us-east-2
31  rules:
32    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
34  script:
35    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
36    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
37    - aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
38
39deploy-production-us-west-2:
40  stage: production-us-west-2
41  environment: production-us-west-2
42  rules:
43    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
44  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
45  script:
46    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
47    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
48    - aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra
49
50deploy-production-us-east-1:
51  stage: production-us-east-1
52  environment: production-us-east-1
53  rules:
54    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
55  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
56  script:
57    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
58    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
59    - aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra
60
61deploy-production-ca-central-1:
62  stage: production-ca-central-1
63  environment: production-ca-central-1
64  rules:
65    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
66  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
67  script:
68    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
69    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
70    - aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

了解 .gitlab-ci.yml 文件

阶段

添加一个阶段块来定义 GitLab 管道的执行顺序。阶段按照它们在阶段块中定义的顺序执行。与阶段相关的作业并行执行。

1stages:
2  - merge-request
3  - test-us-west-1
4  - test-us-east-2
5  - production-us-west-2
6  - production-us-east-1
7  - production-ca-central-1

工作

作业与阶段关联,可以与环境关联。规则控制是否执行特定的作业。本例中的规则检查管道分支是否不是默认分支,以及管道是否未作为合并请求的一部分自动运行。

您可以为每个作业指定不同的图像。您可以使用作业脚本所需的工具设置图像。脚本部分定义了在执行作业时运行的一组步骤。

1deploy-test-us-west-1:
2  stage: test-us-west-1
3  environment: test-us-west-1
4  rules:
5    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
6  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
7  script:
8    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
9    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
10    - aws cloudformation deploy --region us-west-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

合并请求管道

合并请求获得批准后,GitLab 会自动运行管道。您可以通过添加规则为该管道创建作业。在本例中,作业始终成功。

1merge-request-pipeline-job:
2  stage: merge-request
3  rules:
4    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
5  script:
6    - echo "This pipeline always succeeds and enables merges during merge requests"
7    - echo true

推送到功能分支

从命令行运行以下命令,将您的变更推送到 s3_infra 存储库的 IM-5 分支。在提交消息中包含 Jira 事务 ID 和分支名称,以使 Jira GitLab 集成能够跟踪您的项目中正在发生的情况。

1git add --all
2git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
3git push -u origin IM-5

单击“CI/CD”,然后单击“管道”以查看管道运行情况。

GitLab 中的 CI/CD 管道屏幕

单击正在运行的管道的管道 ID。

GitLab 中正在运行的管道的管道 ID

单击职位查看更多详细信息。

在 GitLab 中运行管道的详细作业屏幕

创建合并请求

要创建合并请求,请单击“合并请求”,然后单击“创建合并请求”。

GitLab 中的合并请求屏幕

选择您的功能分支作为源分支,然后单击“比较分支并继续”。

在 GitLab 中比较源分支和目标分支

选择“经办人”和“审查人”。

在 GitLab 中为您的合并请求选择审查人

单击“创建合并请求”。

在 GitLab 中选择“创建合并请求”按钮

审查代码变更,然后单击“批准”。

合并请求详细屏幕,您可以在其中审查 GitLab 中的变更

单击“CI/CI”,然后单击“管道”,以查看合并请求管道的运行情况。

在 Gitlab 中导航到“管道”屏幕以查看运行合并请求

单击管道 ID。请注意,merge-request-pipeline-job 是唯一运行的作业。

“管道”详细页面显示 GitLab 中只运行了 merge-request-pipeline-job

单击“合并请求”,然后单击活跃的合并请求,并单击 “合并”,返回到合并请求。这开启了另一条管道。

在 GitLab 中合并活跃的合并请求

单击“CI/CD”,然后单击“管道”。单击管道 ID。

GitLab 中的管道详细页面显示“将分支‘IM -5’合并到‘主线’中”

为 SystemTests 创建存储库

转到 Jira 并创建一个 Jira 事务,将 SystemTests 存储库添加到 GitLab。记下 Jira 事务 ID。本例中为 IM-7。

在 Jira Software 中创建一个事务“为 SubmitImage AWS Lambda 添加 GitLab 代码存储库”

添加“项目名称”,然后在“项目 URL”中选择相应的组。单击“创建项目”以继续。

在 GitLab 中创建新项目时填写项目详细信息

在您的终端中转到您的 SystemTests 存储库,并运行以下命令以将您的代码推送到 GitLab。

1git add --all
2git commit -m "IM-8 add SubmitImage to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
4git branch -m mainline
5git push -u origin mainline

SystemTests 存储库不需要 .gitlab-ci.yml 文件。它没有自己的管道,因为它为其他管道提供测试使其运行。记下您的 SystemTest 的远程 URL。SubmitImage、GetImageLabel 和 InvokeLabeller CI/CD 管道将在测试步骤中克隆 SystemTests 存储库。您需要使用正确的 URL 更新后续存储库的 gitlab-ci.yml。

添加部署令牌

您需要添加部署令牌才能在执行其他管道期间克隆此存储库。单击“设置”,然后单击“存储库”。向下滚动,并展开“部署令牌”。

在 GitLab 中的“部署令牌”下输入示例名称“CloneMe”

输入名称,勾选“read_repository”,并单击“创建部署令牌”。

在 GitLab 中的"部署令牌"设置页面上选择“read_repository”复选框

部署令牌用户名是自动生成的。部署令牌密码在创建时提供一次。将其添加到密钥管理工具中,以便以后可以引用。在本指南的后面,部署令牌用户名被引用为 gitlab_deploy_token,部署令牌密码被引用为 gitlab_deploy_password

在 Gitlab 中部署令牌屏幕,显示部署令牌用户名和密码

为 SubmitImage AWS Lambda 创建存储库

转到 Jira,并创建一个新事务,将 SubmitImage AWS Lambda 存储库添加到 GitLab。记下事务 ID。本例中为 IM-8。

Jira software 中的 Imagelabeller 看板——突出显示事务“IM-8 为 SubmiTimage AWS Lambda 添加 GitLab 代码存储库”

转到 GitLab 并单击“新项目”,然后单击“创建空白项目”。添加“项目名称”,然后在“项目 URL”中选择相应的组。单击“创建项目”以继续。

在 GitLab 中创建新项目时填写项目详细信息

在您的终端中转到您的 SubmitImage 存储库,并运行以下命令以将您的代码推送到 GitLab。

1git add --all
2git commit -m "IM-8 add SubmitImage to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/submitimage.git
4git branch -m mainline
5git push -u origin mainline

然后添加来自您的 SystemTests 存储库的部署密钥,以启用 SubmitImage GitLab 管道来下载和运行 SystemTests。

最后,将您的 AWS 帐户 ID 添加为 CI/CD 变量。

gitlab 中变量屏幕的屏幕截图

用于部署到 AWS 的 .gitlab-ci.yml

在您的终端中转到 SubmitImage 存储库,创建一个以您的 Jira 事务 ID 命名的分支。

1git checkout -b IM-8

使用以下 yaml 创建一个 .gitlab-ci.yml 文件。这为您的测试、暂存和生产环境定义了部署工作流程。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

1stages:
2  - merge-request
3  - run-unit-tests
4#US-WEST-1
5  - deploy-us-west-1
6  - test-us-west-1
7#US-EAST-2
8  - deploy-us-east-2
9  - test-us-east-2
10#US-WEST-2
11  - deploy-us-west-2
12  - test-us-west-2
13#US-EAST-1
14  - deploy-us-east-1
15  - test-us-east-1
16#CA-CENTRAL-1
17  - deploy-ca-central-1
18  - test-ca-central-1
19
20merge-request-pipeline-job:
21  stage: merge-request
22  rules:
23    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
24  script:
25    - echo "This pipeline always succeeds and enables merge"
26    - echo true
27
28run-unit-tests:
29  stage: run-unit-tests
30  image: golang:buster
31  rules:
32    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33  script:
34    - cd submitImage
35    - go test ./opendevopslambda/...
36
37#US-WEST-1
38deploy-us-west-1:
39  stage: deploy-us-west-1
40  environment: test-us-west-1
41  image: python:latest
42  rules:
43    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
44  before_script:
45    - pip3 install awscli --upgrade
46    - pip3 install aws-sam-cli --upgrade
47    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
48    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
49    - export PATH=$PATH:/usr/local/go/bin
50    - go version
51  script:
52    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
53    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
54    - sam build
55    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
56    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset
57
58      #test-us-west-1:
59      #  stage: test-us-west-1
60      #  environment: test-us-west-1
61      #  image: golang:buster
62      #  rules:
63      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
64      #  script:
65      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
66      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
67      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
68      #    - cd systemtests
69      #    - go test -v ./... -aws_region=us-west-1
70
71#US-EAST-2
72deploy-us-east-2:
73  stage: deploy-us-east-2
74  environment: test-us-east-2
75  image: python:latest
76  rules:
77    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
78  before_script:
79    - pip3 install awscli --upgrade
80    - pip3 install aws-sam-cli --upgrade
81    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
82    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
83    - export PATH=$PATH:/usr/local/go/bin
84    - go version
85  script:
86    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
87    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
88    - sam build
89    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
90    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset
91
92      #test-us-east-2:
93      #  stage: test-us-east-2
94      #  environment: test-us-east-2
95      #  image: golang:buster
96      #  rules:
97      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
98      #  script:
99      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
100      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
101      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
102      #    - cd systemtests
103      #    - go test -v ./... -aws_region=us-east-2
104
105#US-WEST-2
106deploy-us-west-2:
107  stage: deploy-us-west-2
108  environment: production-us-west-2
109  image: python:latest
110  rules:
111    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
112  before_script:
113    - pip3 install awscli --upgrade
114    - pip3 install aws-sam-cli --upgrade
115    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
116    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
117    - export PATH=$PATH:/usr/local/go/bin
118    - go version
119  script:
120    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
121    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
122    - sam build
123    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
124    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset
125
126      #test-us-west-2:
127      #  stage: test-us-west-2
128      #  environment: production-us-west-2
129      #  image: golang:buster
130      #  rules:
131      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
132      #  script:
133      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
134      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
135      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
136      #    - cd systemtests
137      #    - go test -v ./... -aws_region=us-west-2
138
139#US-EAST-1
140deploy-us-east-1:
141  stage: deploy-us-east-1
142  environment: production-us-east-1
143  image: python:latest
144  rules:
145    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
146  before_script:
147    - pip3 install awscli --upgrade
148    - pip3 install aws-sam-cli --upgrade
149    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
150    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
151    - export PATH=$PATH:/usr/local/go/bin
152    - go version
153  script:
154    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
155    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
156    - sam build
157    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
158    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset
159
160      #test-us-east-1:
161      #  stage: test-us-east-1
162      #  environment: production-us-east-1
163      #  image: golang:buster
164      #  rules:
165      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
166      #  script:
167      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
168      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
169      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
170      #    - cd systemtests
171      #    - go test -v ./... -aws_region=us-east-1
172
173#CA-CENTRAL-1
174deploy-central-1:
175  stage: deploy-ca-central-1
176  environment: production-ca-central-1
177  image: python:latest
178  rules:
179    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
180  before_script:
181    - pip3 install awscli --upgrade
182    - pip3 install aws-sam-cli --upgrade
183    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
184    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
185    - export PATH=$PATH:/usr/local/go/bin
186    - go version
187  script:
188    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
189    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
190    - sam build
191    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
192    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset
193
194      #test-central-1:
195      #  stage: test-ca-central-1
196      #  environment: production-ca-central-1
197      #  image: golang:buster
198      #  rules:
199      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
200      #  script:
201      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
202      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
203      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
204      #    - cd systemtests
205      #    - go test -v ./... -aws_region=ca-central-1

集成测试的执行目前已被注释掉。只有在部署整个应用时,系统测试才会通过。取消对存储库中的集成测试步骤的注释,并在部署 ImageLabeller 的所有组件后再次推送以运行部署管道。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

了解 .gitlab-ci.yml 文件

此步骤执行属于 SubmitImage 存储库一部分的单元测试。

1unit-test-us-west-1:
2  stage: unit-test-us-west-1
3  environment: test-us-west-1
4  image: golang:buster
5  rules:
6    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7  script:
8    - cd submitImage
9    - go test ./opendevopslambda/...

此步骤使用 AWS SAM 部署 SubmitImage AWS Lambda。注意 before_script 部分。此步骤在脚本部分之前运行,可用于安装依赖关系和设置各种工具。

1deploy-us-west-1:
2  stage: deploy-us-west-1
3  environment: test-us-west-1
4  image: python:latest
5  rules:
6    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7  before_script:
8    - pip3 install awscli --upgrade
9    - pip3 install aws-sam-cli --upgrade
10    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
11    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
12    - export PATH=$PATH:/usr/local/go/bin
13    - go version
14  script:
15    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
16    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
17    - sam build
18    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
19    - sam deploy --template-file submit-image-packaged.yaml --stack-name OpenDevOpsSubmitImage  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset

此步骤下载并运行 SystemTests 存储库中的集成测试。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

1test-us-west-1:
2  stage: test-us-west-1
3  environment: test-us-west-1
4  image: golang:buster
5  rules:
6    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
7  script:
8    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
9    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
10    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
11    - cd systemtests
12    - go test -v ./... -aws_region=us-west-1

git clone 行中引用了之前创建的部署令牌

1- git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git

推送到功能分支

从命令行运行以下命令,将您的变更推送到 SubmitImage 存储库的 IM-8 分支。在提交消息中包含 Jira 事务 ID 和分支名称,以使 Jira GitLab 集成能够跟踪您的项目中正在发生的情况。

单击“CI/CD”,然后单击“管道”以查看管道运行情况。

在 gitlab 中运行的管道的屏幕截图

创建合并请求

在 GitLab 部署到您的测试环境后,创建要部署到您的生产环境的合并请求。选择 IM-8 分支。

gitlab 中合并请求的屏幕截图

单击“CI/CD”,然后单击“管道”,以查看正在运行的合并请求管道。

在 gitlab 中运行合并请求的屏幕截图

合并请求管道完成后,将变更合并到主线。点击 CI/CD,然后点击管道,以查看正在运行的生产管道。

在 gitlab 中运行生产管道的屏幕截图

为 InvokeLabeller AWS Lambda 创建存储库

转到 Jira,并创建一个新事务,将 InvokeLabeller AWS Lambda 存储库添加到 GitLab。记下事务 ID。本例中为 IM-10。

gitlab 中 jira 创建事务代码存储库“invokelabeller”的屏幕截图

转到 GitLab 并单击“新项目”,然后单击“创建空白项目”。添加“项目名称”,然后在“项目 URL”中选择相应的组。单击“创建项目”以继续。

在 gitlab 中创建新项目“invokelabeller”的屏幕截图

在您的终端中转到您的 InvokeLabeller 存储库,并运行以下命令以将您的代码推送到 GitLab。

1git add --all
2git commit -m "IM-10 add InvokeLabeller to gitlab"
3git remote add origin git@gitlab.com:pmmquickstartguides/invokelabeller.git
4git branch -m mainline
5git push -u origin mainline

然后添加来自您的 SystemTests 存储库的部署密钥,以启用 InvokeLabeller GitLab 管道来下载和运行 SystemTests。

最后,将您的 AWS 帐户 ID 添加为 CI/CD 变量。

gitlab 中变量页面的屏幕截图

用于部署到 AWS 的 .gitlab-ci.yml

在您的终端中转到 InvokeLabeller 存储库,创建一个以您的 Jira 事务 ID 命名的分支。

1git checkout -b IM-10

使用以下 yaml 创建一个 .gitlab-ci.yml 文件。这为您的测试、暂存和生产环境定义了部署工作流程。您必须更新 git clone 行才能让 SystemTests 成为您的 SystemTests 存储库。

1stages:
2  - merge-request
3  - run-unit-tests
4#US-WEST-1
5  - deploy-us-west-1
6  - test-us-west-1
7#US-EAST-2
8  - deploy-us-east-2
9  - test-us-east-2
10#US-WEST-2
11  - deploy-us-west-2
12  - test-us-west-2
13#US-EAST-1
14  - deploy-us-east-1
15  - test-us-east-1
16#CA-CENTRAL-1
17  - deploy-ca-central-1
18  - test-ca-central-1
19
20merge-request-pipeline-job:
21  stage: merge-request
22  rules:
23    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
24  script:
25    - echo "This pipeline always succeeds and enables merge"
26    - echo true
27
28run-unit-tests:
29  stage: run-unit-tests
30  image: python:3.8-buster
31  rules:
32    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
33  before_script:
34    - pip3 install pytest
35    - pip3 install moto
36    - pip3 install -r tst/requirements.txt --user
37  script:
38    - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
39
40#US-WEST-1
41deploy-us-west-1:
42  stage: deploy-us-west-1
43  environment: test-us-west-1
44  image: python:3.8-buster
45  rules:
46    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
47  before_script:
48    - pip3 install awscli --upgrade
49    - pip3 install aws-sam-cli --upgrade
50  script:
51    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
52    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
53    - sam build
54    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
55    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-1 --no-fail-on-empty-changeset
56
57      #test-us-west-1:
58      #  stage: test-us-west-1
59      #  environment: test-us-west-1
60      #  image: golang:buster
61      #  rules:
62      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
63      #  script:
64      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
65      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
66      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
67      #    - cd systemtests
68      #    - go test -v ./... -aws_region=us-west-1
69
70#US-EAST-2
71deploy-us-east-2:
72  stage: deploy-us-east-2
73  environment: test-us-east-2
74  image: python:3.8-buster
75  rules:
76    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
77  before_script:
78    - pip3 install awscli --upgrade
79    - pip3 install aws-sam-cli --upgrade
80  script:
81    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
82    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
83    - sam build
84    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
85    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-2 --no-fail-on-empty-changeset
86
87      #test-us-east-2:
88      #  stage: test-us-east-2
89      #  environment: test-us-east-2
90      #  image: golang:buster
91      #  rules:
92      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
93      #  script:
94      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
95      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
96      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
97      #    - cd systemtests
98      #    - go test -v ./... -aws_region=us-east-2
99
100#US-WEST-2
101deploy-us-west-2:
102  stage: deploy-us-west-2
103  environment: production-us-west-2
104  image: python:3.8-buster
105  rules:
106    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
107  before_script:
108    - pip3 install awscli --upgrade
109    - pip3 install aws-sam-cli --upgrade
110  script:
111    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
112    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
113    - sam build
114    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
115    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-west-2 --no-fail-on-empty-changeset
116
117      #test-us-west-2:
118      #  stage: test-us-west-2
119      #  environment: production-us-west-2
120      #  image: golang:buster
121      #  rules:
122      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
123      #  script:
124      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
125      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
126      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
127      #    - cd systemtests
128      #    - go test -v ./... -aws_region=us-west-2
129
130#US-EAST-1
131deploy-us-east-1:
132  stage: deploy-us-east-1
133  environment: production-us-east-1
134  image: python:3.8-buster
135  rules:
136    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
137  before_script:
138    - pip3 install awscli --upgrade
139    - pip3 install aws-sam-cli --upgrade
140  script:
141    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
142    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
143    - sam build
144    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
145    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region us-east-1 --no-fail-on-empty-changeset
146
147      #test-us-east-1:
148      #  stage: test-us-east-1
149      #  environment: production-us-east-1
150      #  image: golang:buster
151      #  rules:
152      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
153      #  script:
154      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
155      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
156      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
157      #    - cd systemtests
158      #    - go test -v ./... -aws_region=us-east-1
159
160#CA-CENTRAL-1
161deploy-central-1:
162  stage: deploy-ca-central-1
163  environment: production-ca-central-1
164  image: python:3.8-buster
165  rules:
166    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
167  before_script:
168    - pip3 install awscli --upgrade
169    - pip3 install aws-sam-cli --upgrade
170  script:
171    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
172    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
173    - sam build
174    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
175    - sam deploy --template-file invoke-labeller-packaged.yaml --stack-name OpenDevOpsInvokeLabeller  --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --capabilities CAPABILITY_IAM --region ca-central-1 --no-fail-on-empty-changeset
176
177      #test-central-1:
178      #  stage: test-ca-central-1
179      #  environment: production-ca-central-1
180      #  image: golang:buster
181      #  rules:
182      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
183      #  script:
184      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
185      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
186      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
187      #    - cd systemtests
188      #    - go test -v ./... -aws_region=ca-central-1

为了演示如何使用 Jira Software 和各种互联工具开发、部署和管理应用,我们的团队创建了 ImageLabeller,这是一款基于 AWS 构建的简单演示应用,它使用机器学习将标签应用于图像。

本页面介绍如何使用 Bitbucket 部署 ImageLabeller。在您开始之前,我们建议阅读 ImageLabeller 架构AWS SageMaker 设置页面,以了解背景信息。

使用 AWS SageMaker 端点更新 src/app.py

打开 InvokeLabeller 的 src/app.py 文件,并查找 query_endpoint。变更 endpoint_name 和客户端 region_name 以匹配您的 AWS SageMaker 记事本。

1def query_endpoint(img):
2  endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
3  client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
4  response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
5  model_predictions = json.loads(response['Body'].read())['predictions'][0]
6  return model_predictions

推送到功能分支

从命令行运行以下命令,将您的变更推送到 InvokeLabeller 存储库的 IM-10 分支。在提交消息中包含 Jira 事务 ID 和分支名称,以使 Jira GitLab 集成能够跟踪您的项目中正在发生的情况。

1git add --all
2git commit -m "IM-10 add .gitlab-ci.yml to InvokeLabeller"
3git push -u origin IM-10

单击“CI/CD”,然后单击“管道”以查看管道运行情况。

在 gitlab 中运行的管道的屏幕截图

创建合并请求

在 GitLab 部署到您的测试环境后,创建要部署到您的生产环境的合并请求。选择 IM-10 分支。

在 gitlab 中创建合并请求的屏幕截图

合并请求管道完成后,将变更合并到主线。点击 CI/CD,然后点击管道,以查看正在运行的生产管道。

在 gitlab 中运行生产管道的屏幕截图

为了演示如何使用 Jira Software 和各种互联工具开发、部署和管理应用,我们的团队创建了 ImageLabeller,这是一款基于 AWS 构建的简单演示应用,它使用机器学习将标签应用于图像。

本页面介绍如何使用 Bitbucket 部署 ImageLabeller。在您开始之前,我们建议阅读 ImageLabeller 架构AWS SageMaker 设置页面,以了解背景信息。

为您推荐

DevOps 社区

DevOps 学习路径

免费试用

Morty Proxy This is a proxified and sanitized view of the page, visit original site.