如何从Travis CI发布到Github Pages?

时间:2014-04-24 18:52:07

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

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

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

5 个答案:

答案 0 :(得分:39)

环境变量中使用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
    
  5. 替代travis加密方法

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

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

    env:
      secure: <encrypted>
    

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

答案 1 :(得分:25)

我不知道最近的情况,但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/

使用&#34;存储库设置&#34;没有公钥问题。方法,你在Github中生成一个密钥,然后将其粘贴到特拉维斯的秘密/非可见字段中。

上传历史记录问题: 请注意,每次上传都会破坏以前上传的所有数据,而不会保留历史记录。

  • 您现在可以(2017年11月以上)通过添加keep-history: true行来保留历史记录

  • 这可能是理想的,因为这些快照构建可能很大,并且它们可以随意重现(只需将您的软件仓库从您想要的修订版中分支出来)。指向此类工件通常指向最后一次成功构建快照。

  • 但是要触发存储到稳定的地方,只需编辑travis即可添加标记:
    target_branch:分支推力,默认为gh-pages
    例如, target_branch:rc1.2

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

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

答案 2 :(得分:12)

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将在构建矩阵中的每个构建中切换,因此如果每个构建中有多个作业,则代码将被多次推送,这不会做任何事情,但很高兴知道它正在发生。

答案 3 :(得分:10)

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

答案 4 :(得分:0)

几天前我刚刚写了一篇关于此的博客。以下是简报:

我为此目的写了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用户大多是经验丰富的开发人员)。我在博客中发布的脚本也缺少一个功能:它不会保留已构建网站的提交历史记录,而上面这个答案中的脚本会这样做。