CircleCI:如何根据Git标签进行部署。

12

有没有一种方法可以限制 CircleCI 的部署只在具有特定 git tag 的检查中使用?

目前我正在使用以下代码

...
deployment:
  dockerhub:
    branch: master
    commands:
      - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS
      - docker push abcdef

我希望更改branch: mastertag: /release_.*/

背景:我希望根据git标签设置docker标签。例如,每当有内容提交到主分支时,将创建并推送一个具有latest标签的新docker镜像。每当设置一个特定的git标签时(例如release_1.0_2015-06-13),将创建并推送一个带有1.0标签的新docker镜像。

另一种选择是仅使用不同的分支来对应不同的标签。但我想使用标签来标记一个特定的发布版本。

4个回答

16

看起来这是 Kim 回答后新增的内容

通常情况下,推送一个标签不会触发构建。如果有一个部署配置,并且它有一个与你创建的标签名称匹配的 tag 属性,我们将运行相应的构建和部署部分。

在下面的例子中,推送名为 release-v1.05 的标签将触发构建和部署,推送名为 qa-9502 的标签将不会触发构建。

deployment:
  release:
    tag: /release-.*/
    owner: circleci
    commands:
      - ./deploy_master.sh

有没有办法在构建过程中获取标签名称?对于CIRCLE_BRANCH,有一个环境变量,但我没有看到CIRCLE_TAG的环境变量。 - sthomps
3
如果通过推送新标签触发构建,则使用CIRCLE_TAG而不是CIRCLE_BRANCH。 - stmllr
1
这似乎在“部署”部分无法正常工作。我有一个s3_location部分,其中包含key_pattern: builds/{TAG}-{BUILD_NUM}.zipkey_pattern: builds/{CIRCLE_TAG}-{BUILD_NUM}.zip。两者都没有填充{tag}。 - sthomps
2
tag: /regexp/ 特性不能正常工作的原因是:Circle 上的 git checkout 步骤无法获取标签... 我认为这是一个 bug。但是有一个简单的解决方法:将 git fetch --tags 添加为 pre 步骤。 - lalyos
lalyos,你指的是哪个预处理步骤? - Michael Czolko
@lalyos,在checkout中没有“pre”步骤,只有“post”,而且它不起作用。 - mediafreakch

3
我把这个放在这里,是为了帮助那些遵循了文档但没有成功的人。如果你在总体设置中使用了branchonly配置,CircleCI似乎完全忽略标签。这样,标记的提交将显示为“未运行”。
要仅在特定分支上构建并在特定标记上部署,请使用branchignore选项以及负向先行断言正则表达式:
# circle.yml
general:
  branches:
    ignore:
      - /^(?!master).*$/
deployment:
  beta:
    tag: /v[0-9]+(\.[0-9]+)*(-.*)*/
    owner: mediafreakch
    commands:
      - deploy.sh

这个将构建每一个提交到 master 的代码,并在有标签的提交时进行部署。要给提交打标签,我使用 npm version 命令。

@Jack 你是如何命名你的标签的?你是否使用 git tag -a 标记来进行注释标签(这就是 npm version 所做的)? - mediafreakch
注释标签对于 GitHub 也没有影响。 - Tom
@tom 上述配置适用于我的 Github 存储库。确保您使用 git tag 创建的标签可见,并且您的 tag 正则表达式与这些名称匹配。当然,您还需要将“owner”更改为您的 Github 用户! - mediafreakch
@mediafreakch 谢谢,但解决方案中仍然缺少一些东西。checkout.post包含git fetch --tags && git tag(即“test-8”)以及始终未设置的echo $CIRCLE_TAG。对于deployment.release,我有tag:/test-.*/owner:$CIRCLE_PROJECT_USERNAME(我还尝试过不使用环境变量的用户)。 - Tom
@Tom 如果你在本地标记一个提交,然后推送它 git push && git push --tags ,这样怎么样?另外,你有设置 general.branches.only 吗? - mediafreakch
显示剩余5条评论

3

我是来自CircleCI的Kim。

为了实现您想要做的事情,我认为您必须能够在Github上推送新标签时触发构建。然而,只有新提交才会触发构建,所以目前似乎无法实现。对不起!

更新:此功能现已实现:https://circleci.com/docs/configuration/#tags


这是一个回归吗?基于标签的构建在最近过去的时间里明显得到了支持,用户分享了他们使用它的经验。 - Tom
该功能是在Kim回答后添加的。@Dean的回答链接到了正确的资源。 - keybits

0

这里有一个完整的工作示例,注意版本需要为2.1或以上。staging_workflow仅在推送到主分支时运行(不在git标签推送时运行),而prod_workflow仅在以“R..”开头的git标签推送时运行(不在主分支上推送)- 旨在用于生产部署,将您的提交与发布标签一起使用:

git tag -a R2.1.0 -m“一些新的发布功能”

然后推送标签:

git push origin --tags

还包括如何使用assume-role-with-web-identity与AWS集成的示例(这比在CirceCI上存储永久AWS凭据更可取)。它假定您已在AWS中设置了IDP(您只需要CircleCI组织ID并添加管理员角色),然后将角色ARN存储在CircleCI组织上下文中。此处的示例是,如果您有两个用于staging和prod的AWS帐户,则上下文分别为aws-staging和aws-prod,那么上下文中唯一需要的环境变量是:AWS_ROLE_ARN,尽管您可能希望包括AWS_DEFAULT_REGION。

这是我的 package.json(nodeJs 项目)的一部分,你可以看到管道正在运行的脚本,包括 linting、testing 和 CICDPackage & CICDDeploy(AWS SAM/serverless 项目 - 用于 staging 和 prod,使用 'sam package' 和 'sam deploy',我在 dev stacks 中使用 sam sync,因为它更快): package.json 摘录:
"scripts": {
    "test": "jest",
    "watchTestFiles": "jest --watch --verbose=false",
    "lint": "eslint \"src/**/*.js\"",
    "build": "node scripts/bundle",
    "CICDPackage": "sam package --s3-bucket serverless-packaged-artifacts --template template.yaml --output-template-file templateOut.yaml --region eu-west-1",
    "CICDDeploy": "sam deploy --template-file templateOut.yaml --stack-name some-stack-name --capabilities CAPABILITY_NAMED_IAM --region eu-west-1"
}

config.yml

version: 2.1
orbs:
  aws-cli: circleci/aws-cli@3.1.1

jobs:
  test_and_lint:
    docker:
      - image: cimg/node:lts
    steps:
      - checkout
      - run: npm i
      - run: npm run lint
      - run: npm run test

  deploy_staging:
    docker:
      - image: cimg/node:lts
    steps:
      - checkout
      - run: npm i
      - run: npm run build
      - aws-cli/setup
      # if using standard AWS user credentials stored as organisation context & not OIDC token
      # - run: aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID --profile default
      # - run: aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY --profile default
      # - run: aws configure set default.region $AWS_DEFAULT_REGION
      - run: curl -L https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip -o aws-sam-cli-linux-x86_64.zip
      - run: unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
      - run: sudo ./sam-installation/install
      - run:
          name: AWS authentication
          command: |
            read -r AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN \<<< \
              $(aws sts assume-role-with-web-identity \
              --role-arn ${AWS_ROLE_ARN} \
              --role-session-name "CircleCI-${CIRCLE_WORKFLOW_ID}-${CIRCLE_JOB}" \
              --web-identity-token $CIRCLE_OIDC_TOKEN \
              --duration-seconds 3600 \
              --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
              --output text)
              echo export AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" >> $BASH_ENV
              echo export AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" >> $BASH_ENV
              echo export AWS_SESSION_TOKEN="$AWS_SESSION_TOKEN" >> $BASH_ENV
      - run: npm run CICDPackage
      - run: npm run CICDDeploy

  deploy_prod:
    docker:
      - image: cimg/node:lts
    steps:
      - checkout
      - run: npm i
      - run: npm run build
      - aws-cli/setup
      # if using standard AWS user credentials stored as organisation context & not OIDC token
      # - run: aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID --profile default
      # - run: aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY --profile default
      # - run: aws configure set default.region $AWS_DEFAULT_REGION
      - run: curl -L https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip -o aws-sam-cli-linux-x86_64.zip
      - run: unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
      - run: sudo ./sam-installation/install
      - run:
          name: AWS authentication
          command: |
            read -r AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN \<<< \
              $(aws sts assume-role-with-web-identity \
              --role-arn ${AWS_ROLE_ARN} \
              --role-session-name "CircleCI-${CIRCLE_WORKFLOW_ID}-${CIRCLE_JOB}" \
              --web-identity-token $CIRCLE_OIDC_TOKEN \
              --duration-seconds 3600 \
              --query 'Credentials.[AccessKeyId,SecretAccessKey,SessionToken]' \
              --output text)
              echo export AWS_ACCESS_KEY_ID="$AWS_ACCESS_KEY_ID" >> $BASH_ENV
              echo export AWS_SECRET_ACCESS_KEY="$AWS_SECRET_ACCESS_KEY" >> $BASH_ENV
              echo export AWS_SESSION_TOKEN="$AWS_SESSION_TOKEN" >> $BASH_ENV
      - run: npm run CICDPackage
      - run: npm run CICDDeploy

workflows:
  staging_workflow:
    when:
      and:
        - or:
            - matches:
                pattern: "^master$"
                value: << pipeline.git.branch >>
        - not:
            matches:
              pattern: "^R.+$"
              value: << pipeline.git.tag >>
    jobs:
      - test_and_lint
      - deploy_staging:
          context: aws-staging
          requires:
            - test_and_lint

  prod_workflow:
    when:
      and:
        - or:
            - matches:
                pattern: "^master$"
                value: << pipeline.git.branch >>
        - or:
            - matches:
                pattern: "^R.+$"
                value: << pipeline.git.tag >>
    jobs:
      - test_and_lint
      - deploy_prod:
          context: aws-prod
          requires:
            - test_and_lint

请注意,它还将临时的AWS凭证导出到 >> $BASH_ENV 中,以便在其他步骤中可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接