Deployment Travis CI:如何有条件地运行提供程序部署作业?
我有一个travis脚本,根据两个条件部署到不同的S3存储桶: 1.分行名称 2.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_分支
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