如何从Travis CI发布到Github Pages?

Sta*_*sik 32 git doxygen github travis-ci github-pages

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

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

Cir*_*四事件 40

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

其他人已提到它,但这里有一个更详细的程序.

  1. 为网站创建单独的存储库(可选).这将降低您覆盖主存储库的可能性,并使输出文件不会污染它.

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

    仅对公共存储库启用"public_repo"访问,对私有启用"repo".

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

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

    GITHUB_API_KEY=<token>
    
    Run Code Online (Sandbox Code Playgroud)

    并确保将"在构建日志中显示值"标记为"关闭".

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

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

  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
    
    Run Code Online (Sandbox Code Playgroud)

替代travis加密方法

详细解释:https://stackoverflow.com/a/33109519/895245

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

env:
  secure: <encrypted>
Run Code Online (Sandbox Code Playgroud)

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

  • @nn0p这只是标准的YAML多行字符串表示法:http://stackoverflow.com/questions/3790454/in-yaml-how-do-i-break-a-string-over-multiple-lines (3认同)
  • @Arcrammer肯定.但是这个问题如何解释为其他服务器呢?例如:是否有任何其他服务支持Travis CI? (2认同)
  • 我认为`https:// <me>:$ GITHUB_API_KEY @ github.com`可能需要是`https:// $ GITHUB_API_KEY:@ github.com`或`https:// $ GITHUB_API_KEY @ github.com`. (2认同)

Yan*_* TM 33

我不知道它是最近的,但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
Run Code Online (Sandbox Code Playgroud)

确保上传的文件夹中没有.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/


jos*_*son 12

这里的travis-ci文档建议添加它以推送到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
Run Code Online (Sandbox Code Playgroud)

但是,这是不安全的,因为它将您未受保护的私钥存储在github存储库中.

相反,您可以使用travis工具将ssh密钥添加为加密环境变量:

travis encrypt DEPLOY_KEY=<private ssh key with write access> --add env.matrix
Run Code Online (Sandbox Code Playgroud)

现在您只需将此行添加到after_success的开头:

cat $DEPLOY_KEY > .travis/deploy_key.pem
Run Code Online (Sandbox Code Playgroud)

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

  • 我使用加密文件的选项解决了密钥太长的问题:http://docs.travis-ci.com/user/encrypting-files/ (2认同)

Sta*_*sik 10

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