如何从Travis CI发布到Github Pages?

33

我们正在travis-ci服务器上编译Doxygen文档,并希望将它们推送到我们的gh-pages分支。

我如何处理git push的授权?有没有人有在travis-ci中使用加密变量的示例?我应该选择https授权还是SSH密钥?


Superset:https://dev59.com/questions/9Wct5IYBdhLWcg3wHJzF - Ciro Santilli OurBigBook.com
2
我发现这个网站非常有用 使用travis-ci自动将Javadoc发布到gh-pages这是我用来构建的脚本:https://github.com/WPIRoboticsProjects/GRIP/blob/master/.travis-scripts/push-javadoc-to-gh-pages.sh - Jonathan Leitschuh
如果我们只想将编译后的二进制文件发布到现有的 GitHub Pages 上,该怎么办? - Stevoisiak
与 .html 文件相同的过程,同样适用于此。 - Stasik
5个回答

43

使用HTTPS API Token的逐步示例 (环境变量中)

其他人已经提到过它,这里提供更详细的步骤。

  1. 创建一个用于网站的独立存储库(可选)。这将减少您覆盖主要存储库的可能性,并将输出文件保持独立。

  2. https://github.com/settings/tokens下获取个人访问令牌。

    对于公共存储库,请仅启用“public_repo”访问,“repo”适用于私有存储库。

    请将令牌保存在某个地方,因为您只能看到一次。

  3. 在存储库的Travis设置https://travis-ci.org/<me>/<myrepo>/settings上创建一个环境变量:

    GITHUB_API_KEY=<token>
    

    确保将“在构建日志中显示值”标记为“关闭”。

    这是安全的,因为只有您授权的推送才能看到这些环境变量,因此如果恶意用户试图发出拉取请求以获取您的字符串,则变量不会存在。

    只要确保您永远不要在构建中列出您的环境变量即可!

  4. 将以下内容添加到您的.travis.yml

  5. after_success: |
      if [ -n "$GITHUB_API_KEY" ]; then
        cd "$TRAVIS_BUILD_DIR"
        # This generates a `web` directory containing the website.
        make web
        cd web
        git init
        git checkout -b gh-pages
        git add .
        git -c user.name='travis' -c user.email='travis' commit -m init
        # Make sure to make the output quiet, or else the API token will leak!
        # This works because the API key can replace your password.
        git push -f -q https://<me>:$GITHUB_API_KEY@github.com/<me>/<myrepo>-gh-pages gh-pages &>/dev/null
        cd "$TRAVIS_BUILD_DIR"
      fi
    

替代的travis encrypt方法

https://dev59.com/9Wct5IYBdhLWcg3wHJzF#33109519中有详细解释。

使用travis gem加密字符串GITHUB_API_KEY=<key>,并将其添加到您的.travis.yml文件中:

env:
  secure: <encrypted>

这种做法的好处在于不需要使用 Travis 的网页界面,但需要使用一个 Gem 并进行更多的复制粘贴。


2
@Arcrammer 当然,但是这个问题如何解释适用于其他服务器呢?例如:是否有任何其他服务支持Travis CI? - Ciro Santilli OurBigBook.com
Travis支持许多服务的部署,如Heroku和AWS,以及推送到Git远程并执行Bash脚本进行部署。我想知道如何推送到Git远程,但不是GitHub Git远程。我在我的服务器上有一个远程。今天我终于让它工作了!具有挑战性的部分是通过SSH加密SSH密钥以推送到远程,并实际让Travis使用该密钥。 - IIllIIll
3
@nn0p,那只是标准的 YAML 多行字符串符号表示法:https://dev59.com/0G865IYBdhLWcg3wfemU - Ciro Santilli OurBigBook.com
2
我认为 https://<me>:$GITHUB_API_KEY@github.com 可能需要更改为 https://$GITHUB_API_KEY:@github.com 或者 https://$GITHUB_API_KEY@github.com - Benjamin Oakes
1
我必须将URL更改为https://<me>:$GITHUB_API_KEY@github.com/<me>/<repo-name>.git才能使其工作。 - John Blischak
显示剩余4条评论

35

我不知道这个功能有多新,但是Travis现在已经有了内置的部署选项,基本上只需要在你的Travis文件中添加:

deploy:
  provider: pages
  skip_cleanup: true
  local_dir: myfolder/  # or remove this line to upload from root of repo
  github_token: $GITHUB_TOKEN # Set in travis-ci.org dashboard
  on:
    branch: master

确保上传文件夹中没有 .gitignore 文件;它只上传未被忽略的文件。

请查看来自Travis的在线官方文档: https://docs.travis-ci.com/user/deployment/pages/

使用“存储库设置”方法没有公钥问题,您可以在Github上生成一个密钥,然后将其复制粘贴到Travis的秘密/不可见字段中。

上传历史问题: 请注意,每次上传都会覆盖以前上传的任何数据,而不保留历史记录。

  • 现在(2017年11月+),您可以添加一行keep_history: true来保留历史记录

  • 这可能是有必要的,因为这些快照构建可能很庞大,并且它们可以随意重现(只需从您想要的修订版本回退您的仓库)。指向这些工件通常是指向快照的最后成功构建。

  • 但是,要触发存储到稳定位置,只需编辑您的travis以添加标志:
    target_branch:强制推送到的分支,默认为gh-pages
    例如目标分支:rc1.2

在设置回快照模式之前运行一次。

另一种可能适用于发布的替代方法(我个人没有测试过)是发布到标签,参见:https://docs.travis-ci.com/user/deployment/releases/


1
缺点:(1)需要来自GitHub的个人访问令牌,不必要地授予用户所有存储库的访问权限。(2)覆盖目标存储库分支而不保留git历史记录。 - Thomas Weiser
关于(1),这不是什么大问题,travis不会干扰除了构建相关的那个repo之外的任何其他repo。问题在于将其公开,它是私有的,并且只与您信任的travis共享,因为它正在进行上传。(2)实际上是可取的,您不希望存储构建的二进制结果的历史记录。只需为发布标记修订版。 - Yann TM
这个解决方案有示例的存储库吗? - Manoel Vilela
@ManoelVilela 这是一个生产示例,它将 MacOS 和 Linux 目标上传到不同的位置(分支)。https://github.com/lip6/libDDD/blob/master/.travis.yml - Yann TM

12

Travis-CI文档建议将以下内容添加到git仓库的推送中:

after_success:
   - chmod 600 .travis/deploy_key.pem # this key should have push access
   - ssh-add .travis/deploy_key.pem
   - git remote add deploy DEPLOY_REPO_URI_GOES_HERE
   - git push deploy

然而,这种方法不安全,因为它要求您将未受保护的私钥存储在 Github 存储库中。

相反,您可以使用 Travis 工具将您的 SSH 密钥添加为加密环境变量

travis encrypt DEPLOY_KEY=<private ssh key with write access> --add env.matrix
现在你只需要将这行代码添加到after_success的开头即可:
cat $DEPLOY_KEY > .travis/deploy_key.pem

请注意,after_success将在构建矩阵中的每个构建中切换,因此如果您每个构建有多个作业,您的代码将被推送多次,这不会产生任何影响,但知道它正在发生是很好的。


我会尝试这个 - 请稍等星号。 - Stasik
密钥过长,无法存储在安全环境变量中,请查看我的替代方案。 - Stasik
2
我使用加密文件选项解决了密钥过长的问题:http://docs.travis-ci.com/user/encrypting-files/ - Elias Dorneles
这看起来很有前途,但你是怎么想到的呢?他们的文档非常简略,而且还都是错的... - IIllIIll
如何在合并事件上仅部署已批准的PR?我看到了$TRAVIS_PULL_REQUEST的使用,但我不想在每个PR上都部署,只想在已批准的PR上部署。 - Ron

10

再添加一种解决方案,我使用了来自Github的HTTPS令牌,对其进行了加密,并在检出和推送时使用HTTPS。


1
我会投票支持这是更好的解决方案。要生成令牌,请转到帐户设置->应用程序->生成令牌。这里有一个不错的指南:https://medium.com/@nthgergo/publishing-gh-pages-with-travis-ci-53a8270e87db - Jonas Jongejan
1
请注意,HTTPS 令牌无法限制为一个仓库。但由于该令牌已加密存储,并且您是唯一应该访问 Travis CI 的人,因此这并不重要。 - lumbric
那么,你的最终解决方案是什么样子的? - okutane
@okutane https://github.com/open62541/open62541/blob/0.2/tools/travis/travis_push_doc.sh - Stasik

0

我几天前刚写了一篇关于这个的博客。以下是简要内容:

我为此编写了一个自定义部署脚本。该脚本的核心功能如下:

#!/bin/bash

git clone --depth=1 --branch=master "https://github.com/iBug/iBug.github.io.git" deploy
cd deploy
git rm -rf .
cd ..
mv _site/* deploy
cd deploy
git add --all
git config user.name "Travis CI"
git config user.email "travis@travis-ci.org"
git commit --message "Auto deploy from Travis CI"
git remote add deploy "https://$GH_TOKEN@github.com/iBug/iBug.github.io.git" &>/dev/null
git push deploy master &>/dev/null

现在前往https://github.com/settings/tokens并生成一个令牌。授予它public_repo权限。前往Travis CI的存储库设置,并将令牌存储为变量名为GH_TOKEN

将部署脚本添加到Travis:

script: bundle exec jekyll build
after_success:
    - bash .travis/deploy.sh

将这些东西推送到GitHub,Travis 就会被触发。

我的博客在这里。它非常全面,如果在此作为答案发布会显得有些冗余(因为 Stack Overflow 的用户大多数都是经验丰富的开发者)。我在博客中发布的脚本还缺少一项功能:它不能保留生成站点的提交历史记录,而上面这个答案中的脚本可以。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接