代码之家  ›  专栏  ›  技术社区  ›  rakitin

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

  •  0
  • rakitin  · 技术社区  · 7 年前

    我有一个Travis脚本,它根据两个条件部署到不同的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
    

    它按预期工作: 当我部署到staging时,第一个配置成功地构建和部署,并且在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 回复  |  直到 7 年前
        1
  •  1
  •   Brian Onn    7 年前

    最好的方法是使用Travis的阶段和工作特性。阶段是一组工作。阶段内的作业并行运行。各阶段依次进行。整个阶段可以是有条件的,阶段也可以包含有条件的作业。阶段中的作业也可以部署作业(即 deploy: 在travis.yml中,可以嵌套在条件阶段中。最重要的是为了你的目标, 条件阶段及其包含的作业将在不满足条件时自动跳过。 .

    这和标准大不相同 部署: 你已经拥有的矩阵。即,您当前的部署步骤包含2个部署,因此您会收到消息,表示它将跳过部署。

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

    使用这样的阶段的缺点是,每个阶段都在自己的虚拟机中运行,因此您不能在每个阶段之间共享数据。(即,以前阶段的构建工件不会传播到后续阶段)。例如,您可以通过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