Close

使用 GitLab 部署 ImageLabeller

Warren Marusiak 头像
Warren Marusiak

高级技术传播者

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

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

先决条件

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

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

https://github.com/AtlassianOpenDevOpsGuides

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。

git add --all
git commit -m "IM-5 add s3_infra repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/s3_infra.git
git branch -m mainline
git 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 命名的分支。

git checkout -b IM-5

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

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

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

deploy-test-us-east-2:
  stage: test-us-east-2
  environment: test-us-east-2
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-west-2:
  stage: production-us-west-2
  environment: production-us-west-2
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-west-2 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-us-east-1:
  stage: production-us-east-1
  environment: production-us-east-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region us-east-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

deploy-production-ca-central-1:
  stage: production-ca-central-1
  environment: production-ca-central-1
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  image: registry.gitlab.com/gitlab-org/cloud-deploy/aws-base:latest
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - aws cloudformation deploy --region ca-central-1 --template-file template.yml --stack-name OpenDevOpsS3Infra

了解 .gitlab-ci.yml 文件

阶段

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

stages:
  - merge-request
  - test-us-west-1
  - test-us-east-2
  - production-us-west-2
  - production-us-east-1
  - production-ca-central-1

工作

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

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

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

合并请求管道

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

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merges during merge requests"
    - echo true

推送到功能分支

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

git add --all
git commit -m "IM-5 add .gitlab-ci.yml to s3_infra"
git 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。

git add --all
git commit -m "IM-7 add SystemTests repository to gitlab"
git remote add origin git@gitlab.com:pmmquickstartguides/systemtests.git
git branch -m mainline
git 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”的屏幕截图

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

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

您必须添加 AWS 访问密钥配置受保护分支设置部署环境

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

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

gitlab 中变量屏幕的屏幕截图

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

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

git checkout -b IM-8

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

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - 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

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - 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

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - 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

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - 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

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - 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

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

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

了解 .gitlab-ci.yml 文件

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

unit-test-us-west-1:
  stage: unit-test-us-west-1
  environment: test-us-west-1
  image: golang:buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  script:
    - cd submitImage
    - go test ./opendevopslambda/...

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

deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:latest
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
    - wget https://golang.org/dl/go1.16.6.linux-amd64.tar.gz
    - rm -rf /usr/local/go && tar -C /usr/local -xzf go1.16.6.linux-amd64.tar.gz
    - export PATH=$PATH:/usr/local/go/bin
    - go version
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file submit-image-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - 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 存储库。

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

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

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

推送到功能分支

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

git add --all
git commit -m "IM-8 add .gitlab-ci.yml to SubmitImage"
git push -u origin IM-8

单击“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。

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

您必须添加 AWS 访问密钥配置受保护分支设置部署环境

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

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

gitlab 中变量页面的屏幕截图

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

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

git checkout -b IM-10

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

stages:
  - merge-request
  - run-unit-tests
#US-WEST-1
  - deploy-us-west-1
  - test-us-west-1
#US-EAST-2
  - deploy-us-east-2
  - test-us-east-2
#US-WEST-2
  - deploy-us-west-2
  - test-us-west-2
#US-EAST-1
  - deploy-us-east-1
  - test-us-east-1
#CA-CENTRAL-1
  - deploy-ca-central-1
  - test-ca-central-1

merge-request-pipeline-job:
  stage: merge-request
  rules:
    - if: $CI_PIPELINE_SOURCE == "merge_request_event"
  script:
    - echo "This pipeline always succeeds and enables merge"
    - echo true

run-unit-tests:
  stage: run-unit-tests
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install pytest
    - pip3 install moto
    - pip3 install -r tst/requirements.txt --user
  script:
    - python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml

#US-WEST-1
deploy-us-west-1:
  stage: deploy-us-west-1
  environment: test-us-west-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-1-$AWS_ACCOUNT_ID --region us-west-1
    - 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

      #test-us-west-1:
      #  stage: test-us-west-1
      #  environment: test-us-west-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-1

#US-EAST-2
deploy-us-east-2:
  stage: deploy-us-east-2
  environment: test-us-east-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-2-$AWS_ACCOUNT_ID --region us-east-2
    - 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

      #test-us-east-2:
      #  stage: test-us-east-2
      #  environment: test-us-east-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH != $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-2

#US-WEST-2
deploy-us-west-2:
  stage: deploy-us-west-2
  environment: production-us-west-2
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-west-2-$AWS_ACCOUNT_ID --region us-west-2
    - 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

      #test-us-west-2:
      #  stage: test-us-west-2
      #  environment: production-us-west-2
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-west-2

#US-EAST-1
deploy-us-east-1:
  stage: deploy-us-east-1
  environment: production-us-east-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-us-east-1-$AWS_ACCOUNT_ID --region us-east-1
    - 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

      #test-us-east-1:
      #  stage: test-us-east-1
      #  environment: production-us-east-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=us-east-1

#CA-CENTRAL-1
deploy-central-1:
  stage: deploy-ca-central-1
  environment: production-ca-central-1
  image: python:3.8-buster
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
  before_script:
    - pip3 install awscli --upgrade
    - pip3 install aws-sam-cli --upgrade
  script:
    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
    - sam build
    - sam package --output-template-file invoke-labeller-packaged.yaml --s3-bucket open-devops-code-ca-central-1-$AWS_ACCOUNT_ID --region ca-central-1
    - 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

      #test-central-1:
      #  stage: test-ca-central-1
      #  environment: production-ca-central-1
      #  image: golang:buster
      #  rules:
      #    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_PIPELINE_SOURCE != "merge_request_event"
      #  script:
      #    - export AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID
      #    - export AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY
      #    - git clone https://${gitlab_deploy_token}:${gitlab_deploy_password}@gitlab.com/pmmquickstartguides/systemtests.git
      #    - cd systemtests
      #    - go test -v ./... -aws_region=ca-central-1

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

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

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

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

推送到功能分支

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

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

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

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

创建合并请求

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

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

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

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

如果您已经做到这一步,恭喜!您刚刚已部署 ImageLabeller。下一步是设置使用 Opsgenie 监控 ImageLabeller

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


分享这篇文章

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

Devops 示意图

DevOps 社区

Devops 示意图

DevOps 学习路径

地图插图

免费试用

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up