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

Deployment Travis CI:如何有条件地运行提供程序部署作业?,deployment,travis-ci,continuous-deployment,Deployment,Travis Ci,Continuous Deployment,我有一个travis脚本,根据两个条件部署到不同的S3存储桶: 1.分行名称 2.$TRAVIS_分支env变量 ... travis stuff deploy: - provider: s3 ... other config bucket: my-staging-bucket on: repo: MyOrg/my-repo branch: staging condition: $TRAVIS_BRANCH = staging

我有一个travis脚本,根据两个条件部署到不同的S3存储桶: 1.分行名称 2.
$TRAVIS_分支
env变量

... 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
它按预期工作: 当我部署到staging时,第一个配置成功构建和部署,Travis的作业日志中为我提供了适当的消息

它还试图部署到生产环境中,并被以下条件停止:上的
,再次提供消息,表明这一点。生成的日志消息如下所示,前两行表示已成功部署到暂存,而未部署到生产

-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,使其只运行该分支和环境变量组合的部署脚本
有办法吗?我的印象是,这是有条件部署的方法


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

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

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

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

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

更多信息可在此处找到:

我的github中有一个工作示例:

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


最好的方法是使用Travis的阶段和作业功能。阶段是作业组。阶段内的作业并行运行。阶段按顺序依次运行。整个阶段可以是有条件的,阶段也可以包含有条件的作业。阶段中的作业也可以是部署作业(即,travis.yml中的整个
部署:
可以嵌套在条件阶段中。最重要的是,对于您的目标,条件阶段及其包含的作业将在不满足条件的情况下自动跳过

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

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

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

更多信息可在此处找到:

我的github中有一个工作示例:

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


这对我不起作用。唯一的区别是,为了防止部署阶段对拉请求执行,我扩展了条件
if:branch=production和env(TRAVIS\u Pull\u请求)=false
现在阶段将永远不会运行。不知道为什么。这对我来说不起作用。唯一的区别是,为了防止部署阶段在拉请求上执行,我扩展了条件
如果:branch=production AND env(TRAVIS_Pull_REQUEST)=false,那么阶段将永远不会运行。不知道为什么。
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