我想使用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
但对我来说,这个解决方案看起来有点奇怪。还有其他任何可能实现的目标吗?
任何提示/链接赞赏。
答案 0 :(得分:21)
Travis-CI始终根据您正在推动的分支中的.travis.yml
创建构建。作为解决方案,您可以在不同的分支中维护不同的.travis.yml
文件。
如果您经常在分支之间合并,则可能导致分支之间的无意更改(如果将一个分支的.travis.yml
的更改合并到另一个分支)。如果这是一个问题,您的解决方案可能更安全。
要确保只构建特定分支(例如develop
和master
),您可以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。