关于git:如何从Travis CI发布到Github Pages?

How to publish to Github Pages from Travis CI?

我们正在Travis CI服务器上编译doxygen文档,并希望将其推送到我们的GH页面分支。

我如何处理git push的授权?是否有人有在Travis CI中使用加密变量的示例?我应该使用https授权还是使用ssh密钥?


环境变量中包含https api标记的分步示例

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

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

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

    仅对公共存储库启用"public_repo"访问,对private启用"repo"。

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

  • 在存储库的travis设置中,https://travis-ci.org///settings创建一个环境变量:

    1
    GITHUB_API_KEY=<token>

    并确保将"生成日志中的显示值"标记为"关闭"。

    这是安全的,因为只有经过授权的推送才能看到这样的环境变量,所以如果恶意用户试图发出请求以获取字符串,那么该变量就不存在。

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

  • 在您的.travis.yml中添加以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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>:[email protected]/<me>/<myrepo>-gh-pages gh-pages &>/dev/null
        cd"$TRAVIS_BUILD_DIR"
      fi
  • 替代Travis加密方法

    详情请访问:https://stackoverflow.com/a/33109519/895245

    travisgem加密字符串GITHUB_API_KEY=,并将其添加到.travis.yml中:

    1
    2
    env:
      secure: <encrypted>

    它的优点是不需要使用Travis Web界面,但需要使用gem和更多的复制粘贴。


    我不知道它有多新,但Travis现在有一个内置的部署选项,基本上添加到您的Travis文件中:

    1
    2
    3
    4
    5
    6
    7
    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以添加标志:目标分支:要强制执行的分支,默认为GH页例如,目标公司:RC1.2

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

    另一个可能对发行版有好处的选择是发布到一个标签上,请参见:https://docs.travis-ci.com/user/deployment/releases/


    这里的travis ci文档建议将其添加到一个git repo中:

    1
    2
    3
    4
    5
    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密钥添加为加密的环境变量:

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

    现在您只需将这一行添加到成功后的开头:

    1
    cat $DEPLOY_KEY > .travis/deploy_key.pem

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


    为了添加另一个解决方案,我使用了一个来自Github的HTTPS令牌,对其进行加密,并使用HTTPS进行签出和推送


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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/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"[email protected]"
    git commit --message"Auto deploy from Travis CI"
    git remote add deploy"https://[email protected]/iBug/iBug.github.io.git" &>/dev/null
    git push deploy master &>/dev/null

    现在转到https://github.com/settings/tokens并生成一个token。给予它1〔0〕的特权。转到travis ci上的存储库设置,并存储变量名为GH_TOKEN的令牌。

    将部署脚本添加到travis:

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

    把这些东西推到Github上,Travis就会被触发。

    我的博客在这里。如果在这里作为答案发布,它是全面的,因此是冗余的(因为堆栈溢出用户大多是经验丰富的开发人员)。我在博客中发布的脚本也缺少一个功能:它不保留已构建站点的提交历史记录,而上面这个答案中的脚本却保留了。