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

时间:2019-01-30 20:03:22

标签: deployment travis-ci continuous-deployment

我有一个travis脚本,它基于2种情况部署到不同的S3存储桶: 1.分支名称 2. $TRAVIS_BRANCH环境变量

... 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

工作正常: 当我部署到暂存时,第一个配置成功构建和部署,并且在Travis的作业日志中得到了适当的消息传递。

它也尝试部署到生产环境,并在on:条件下停止,再次提供指示尽可能多的消息。产生的日志消息看起来像这样,前两行表明已成功部署到暂存并且未部署到生产。

-Preparing deploy
-Deploying application
-Skipping a deployment with the s3 provider because a custom condition was not met

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

-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

这引起了团队的困惑,因为消息似乎是错误的否定,表明部署实际上在按预期运行时失败了。 我想要做的是设置Travis,使其只为该分支和env变量组合运行部署脚本适当的操作
有没有办法做到这一点?我印象中这是有条件部署的方法。

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

1 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是使用Travis的工作台和作业功能。阶段是一组工作。阶段内的作业并行运行。各个阶段依次运行。整个阶段可以是有条件的,阶段也可以包含有条件的工作。阶段中的作业也可以是部署作业(即travis.yml中的整个deploy:可以嵌套在条件阶段中。最重要的是,对于您的目标,条件阶段及其包含的作业会在忽略时被跳过条件不满足

这与您已经拥有的标准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

这将产生一个Travis作业日志,该日志特定于登台和生产中的每一个:

push to staging branch push to production branch