Travis CI:如何有条件地运行提供程序部署作业?

rak*_*tin 0 deployment continuous-deployment travis-ci

我有一个基于 2 个条件部署到不同 S3 存储桶的 travis 脚本:1. 分支名称 2. $TRAVIS_BRANCHenv 变量

... travis stuff
deploy:
  - provider: s3
    ... other config
    bucket: my-staging-bucket
    on:
      repo: MyOrg/my-repo
      branch: staging
      condition: $TRAVIS_BRANCH = staging
  - provider: s3
    ... other config
    bucket: my-prod-bucket
    on:
      repo: MyOrg/my-repo
      branch: production
      condition: $TRAVIS_BRANCH = production
Run Code Online (Sandbox Code Playgroud)

它按预期工作:当我部署到暂存时,第一个配置成功构建和部署,我在 Travis 的作业日志中收到了适当的消息。

它还尝试部署到生产环境并被on:条件停止,再次提供表明同样多的消息。生成的日志消息如下所示,前两行表示成功部署到登台,没有部署到生产。

-Preparing deploy
-Deploying application
-Skipping a deployment with the s3 provider because a custom condition was not met
Run Code Online (Sandbox Code Playgroud)

当情况逆转时,这是一致的:

-Skipping a deployment with the s3 provider because this branch is not permitted: production
-Skipping a deployment with the s3 provider because a custom condition was not met
...
-Preparing deploy
-Deploying application
Run Code Online (Sandbox Code Playgroud)

这导致了团队中的一些混乱,因为消息似乎是一个误报,表明部署在实际按预期运行时失败了。我想要做的是设置 Travis,以便它只运行适合该分支和环境变量组合的部署脚本
有没有办法做到这一点?我的印象是这是有条件部署的方法。

如果无法阻止两个部署作业运行,是否有办法抑制作业日志中的消息传递?

Bri*_*Onn 5

最好的方法是使用 Travis 的阶段和工作功能。阶段是作业组。阶段内的作业并行运行。阶段按顺序运行,一个接一个。整个阶段可以是有条件的,阶段也可以包含有条件的作业。阶段中的作业也可以是部署作业(即deploy:travis.yml 中的整个可以嵌套在条件阶段中。最重要的是,对于您的目标,如果条件不满足条件阶段及其包含的作业将被静默跳过

deploy:与您已有的标准矩阵非常不同。即您当前的部署步骤包含 2 个部署,因此您会收到正在跳过部署的消息。

相反,您可以将其更改为具有条件作业的单独部署阶段。

使用这样的阶段的缺点是每个阶段都在自己的 VM 中运行,因此您无法从一个阶段到下一个阶段共享数据。(即从先前阶段构建工件不会传播到后续阶段)。例如,您可以通过 S3 共享冗长编译阶段的构建结果来解决此问题。

更多信息可以在这里找到:https : //docs.travis-ci.com/user/build-stages

我在我的 github 中有一个工作示例:https : //github.com/brianonn/travis-test

jobs:
  include:
    - stage: compile
      script: bash scripts/compile.sh

    - stage: test
      script: bash scripts/test.sh

    - stage: deploy-staging
      if: branch = staging
      name: "Deploy to staging S3"
      script: skip
      deploy:
        provider: script
        script: bash scripts/deploy.sh staging
        on:
          branch: staging
          condition: $TRAVIS_BRANCH = staging

    - stage: deploy-prod
      if: branch = production
      name: "Deploy to production S3"
      script: skip
      deploy:
        provider: script
        script: bash scripts/deploy.sh production
        on:
          branch: production
          condition: $TRAVIS_BRANCH = production
Run Code Online (Sandbox Code Playgroud)

这会生成一个特定于暂存和生产的 Travis 作业日志:

推送到暂存分支 推送到生产分支