【问题标题】:How to publish to Github Pages from Travis CI?如何从 Travis CI 发布到 Github 页面?
【发布时间】:2014-06-10 05:45:02
【问题描述】:

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

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

【问题讨论】:

标签: git github travis-ci doxygen github-pages


【解决方案1】:

在环境变量中使用 HTTPS API 令牌的分步示例

其他人都提到过,但这里有一个更详细的过程。

  1. 为网站创建一个单独的存储库(可选)。这将减少您覆盖主存储库的可能性,并防止输出文件污染它。

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

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

    将令牌保存在某处,因为您只能看到一次。

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

    GITHUB_API_KEY=<token>
    

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

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

    只要确保你永远不会在你的构建中列出你的环境变量!

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

    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 加密方法

详解于:https://stackoverflow.com/a/33109519/895245

使用travis gem 加密字符串GITHUB_API_KEY=&lt;key&gt;,并将其添加到您的.travis.yml

env:
  secure: <encrypted>

这样做的好处是它不需要使用 Travis Web 界面,但需要使用 Gem 和更多的复制粘贴。

【讨论】:

  • 这对于推送到另一台服务器(即不是 GitHub)上的存储库没有帮助。
  • @Arcrammer 当然。但是如何为其他服务器解释这个问题呢?例如:是否有其他服务支持 Travis CI?
  • @nn0p 这只是标准的 YAML 多行字符串表示法:stackoverflow.com/questions/3790454/…
  • 我认为https://&lt;me&gt;:$GITHUB_API_KEY@github.com 可能需要为https://$GITHUB_API_KEY:@github.comhttps://$GITHUB_API_KEY@github.com
  • 我必须将 URL 更改为 https://&lt;me&gt;:$GITHUB_API_KEY@github.com/&lt;me&gt;/&lt;repo-name&gt;.git 才能正常工作。
【解决方案2】:

我不知道它有多新,但是 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
    例如 target_branch : rc1.2

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

另一种可能适合发布的替代方法(虽然我没有亲自测试过)是发布到标签,请参阅:https://docs.travis-ci.com/user/deployment/releases/

【讨论】:

  • 缺点:(1) 需要来自 GitHub 的 个人访问令牌,不必要地授予对用户所有 repos 的访问权限。 (2) 覆盖目标 repo 分支而不保留 git 历史记录。
  • 关于 (1) 这不是什么大问题,travis 不会弄乱您拥有的任何其他存储库,除了与构建有关的存储库。问题在于将其公开,它是私有的并且仅与 travis 共享,您隐含地信任它,因为它正在上传。 (2) 实际上是可取的,您不想存储构建的二进制结果的历史记录。只需标记要发布的修订。
  • 有使用此解决方案的示例回购吗?
  • @ManoelVilela 这里是一个生产示例,它将 MacOS 和 linux 目标上传到不同的位置(分支)。 github.com/lip6/libDDD/blob/master/.travis.yml
【解决方案3】:

travis-ci documentation here 建议将其添加到 git repo:

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 密钥添加为 encrypted environmental variable

travis encrypt DEPLOY_KEY=<private ssh key with write access> --add env.matrix

现在你只需要将这一行添加到 after_success 的开头:

cat $DEPLOY_KEY > .travis/deploy_key.pem

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

【讨论】:

  • 我会试试这个 - 请等待星星
  • 密钥对于安全环境变量来说太长,请参阅我的替代解决方案
  • 我使用加密文件的选项解决了密钥过长的问题:docs.travis-ci.com/user/encrypting-files
  • 这看起来很有希望,但是你到底是怎么想出来的呢?他们的文档非常......所有错误方式的准系统......
  • 如何在批准的 PR 上进行部署,这意味着在合并事件上。我看到了 $TRAVIS_PULL_REQUEST 的使用,但我不想在每个 PR 上部署,只在批准的 PR 上部署。
【解决方案4】:

只是为了添加另一个解决方案,我使用了来自 github 的 HTTPS 令牌,对其进行加密并使用 HTTPS 进行结帐和推送

【讨论】:

  • 我会投票赞成这是一个更好的解决方案。要制作令牌,请转到帐户设置 -> 应用程序 -> 生成令牌。这里有一个很好的指南:medium.com/@nthgergo/…
  • 请注意,HTTPS 令牌不能仅限于一个 repo。但是由于令牌是加密存储的,并且您是唯一应该有权访问 Travis CI 的人,所以这无关紧要。
  • 那么,您的最终解决方案是什么样的?
【解决方案5】:

几天前我刚刚写了一篇关于这个的博客。简介如下:

我为此写了a custom deploy script。该脚本的核心功能如下所示:

#!/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。


我的博客是here。如果在此处作为答案发布它是全面的,因此是多余的(因为 Stack Overflow 用户大多是有经验的开发人员)。我在博客中发布的脚本也缺少一个功能:它不会保留已构建站点的提交历史记录,而上面这个答案中的脚本会保留。

【讨论】:

    猜你喜欢
    • 2019-05-21
    • 2018-10-09
    • 2019-12-28
    • 1970-01-01
    • 2018-03-14
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    相关资源
    最近更新 更多