Travis:针对不同分支的不同`script`?

时间:2016-05-31 11:20:44

标签: travis-ci

我想使用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

但对我来说,这个解决方案看起来有点奇怪。还有其他任何可能实现的目标吗?

任何提示/链接赞赏。

3 个答案:

答案 0 :(得分:21)

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

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

要确保只构建特定分支(例如developmaster),您可以whitelist .travis.yml中的分支。

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

或者,为确保您的现有结构没有失败的测试,您甚至可以使用以下内容:

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

答案 1 :(得分:0)

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

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

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

例如,在您的.travis.yml中,您输入:firebase deploy --project "$DEPLOY_TARGET"

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

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

我希望这会有所帮助。

答案 2 :(得分:0)

似乎最好的解决方案是使用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