【问题标题】:Travis: different `script` for different branch?Travis:不同分支的不同“脚本”?
【发布时间】:2019-11-24 06:54:49
【问题描述】:

我想使用 Travis-CI 和 Github 设置基于分支的部署。

即- 如果我们从 develop 构建 - 然后 exec /deploy.rb 使用 DEV env 主机名,如果 master - 然后 ./deploy.rb 使用 PROD 主机名等等。

我发现的唯一一个想法是检查$TRAVIS_BRANC 变量,然后执行脚本,例如:

language: php
install:
  - true
script:
  - test $TRAVIS_BRANCH = "develop" && ./ci/deploy.rb envdev.tld 
  - test $TRAVIS_BRANCH = "master" && ./ci/deploy.rb envprod.tld

但是这个解决方案对我来说有点奇怪。还有其他实现这一点的可能性吗?

感谢任何提示/链接。

【问题讨论】:

    标签: travis-ci


    【解决方案1】:

    Travis-CI 始终基于您正在推送的分支中的.travis.yml 创建构建。作为一种解决方案,您可以在不同的分支中维护不同的.travis.yml 文件。

    如果您定期在分支之间合并,这可能会导致分支之间的无意更改(如果您将一个分支的 .travis.yml 的更改合并到另一个分支)。如果这是一个问题,您的解决方案可能更安全。

    为确保只构建特定的分支(例如developmaster),您可以在.travis.ymlwhitelist 分支。

    使用现有解决方案时,您可以简化 travis.yml 脚本。将用于选择正确部署目标的逻辑移动到您的 ci/deploy.rb 脚本中可能是有意义的(或者甚至添加一个您从 .travis.yml 调用的单独包装脚本)。这样一来,您的 .travis.yml 中只有一个 script 行,如果您更改部署目标,甚至不需要更改。

    或者,为了确保您的现有结构没有失败的测试,您甚至可以使用这样的东西:

    script:
      - if [ "$TRAVIS_BRANCH" = "develop" ]; then ./ci/deploy.rb envdev.tld; fi
      - if [ "$TRAVIS_BRANCH" = "master" ]; then ./ci/deploy.rb envprod.tld; fi
    

    【讨论】:

    • 不应该将 "$TRAVIS_BRANCH" = "develop" 改为 "$TRAVIS_BRANCH" == "develop" 吗?
    • 或者 = 更适合 POSIX 合规性?
    • test 命令(通常与[ 一起调用)仅指定=“运算符”。 == 运算符是一个 bashism,当使用 [ shell 内置函数或带有一些等效兼容性补丁的可执行文件时,它可以等效地用于 Bash。为了不依赖 Bash 或兼容性补丁,您应该改用 = 运算符。
    • 对,不依赖 bash 更好。
    【解决方案2】:

    似乎现在最好的解决方案是使用stages。你可以有类似的东西:

    stages:
      - name: deploy
        # require the branch name to be master (note for PRs this is the base branch name)
        if: branch = master
    

    有关阶段的更多详细信息,请参阅Travis documentation

    【讨论】:

    • 我希望示例显示如何为多个分支执行此操作。另一个 if 子句或 else 子句应该如何出现?
    【解决方案3】:

    我认为这是一个更好的解决方案,因为它非常简单。

    假设您有一个专用的生产分支(master)和一个暂存/测试分支(dev)。

    在您的 TravisCI 帐户中,您可以设置环境变量。您可以选择让某些变量仅适用于指定的分支。

    例如,在你的.travis.yml 中,你写:firebase deploy --project "$DEPLOY_TARGET"

    并设置DEPLOY_TARGET(Web 配置区域中不需要在 var 之前的美元符号!)作为每个分支的不同环境变量。尽管该特定示例适用于 firebase 托管,但您可以使用基于分支 env vars 的脚本来概括该示例。

    因此您可以将$BRANCH_SPECIFIC_VAR 设置为环境变量并指定您需要的每个分支,然后从您的配置文件中访问该变量。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2019-11-12
      相关资源
      最近更新 更多