我们正在travis-ci服务器上编译Doxygen文档,并希望将它们推送到我们的gh-pages分支。
我如何处理git push
的授权?有没有人有在travis-ci中使用加密变量的示例?我应该选择https授权还是SSH密钥?
我们正在travis-ci服务器上编译Doxygen文档,并希望将它们推送到我们的gh-pages分支。
我如何处理git push
的授权?有没有人有在travis-ci中使用加密变量的示例?我应该选择https授权还是SSH密钥?
使用HTTPS API Token的逐步示例 (环境变量中)
其他人已经提到过它,这里提供更详细的步骤。
创建一个用于网站的独立存储库(可选)。这将减少您覆盖主要存储库的可能性,并将输出文件保持独立。
在https://github.com/settings/tokens下获取个人访问令牌。
对于公共存储库,请仅启用“public_repo”访问,“repo”适用于私有存储库。
请将令牌保存在某个地方,因为您只能看到一次。
在存储库的Travis设置https://travis-ci.org/<me>/<myrepo>/settings
上创建一个环境变量:
GITHUB_API_KEY=<token>
确保将“在构建日志中显示值”标记为“关闭”。
这是安全的,因为只有您授权的推送才能看到这些环境变量,因此如果恶意用户试图发出拉取请求以获取您的字符串,则变量不会存在。
只要确保您永远不要在构建中列出您的环境变量即可!
将以下内容添加到您的.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 encrypt方法
在https://dev59.com/9Wct5IYBdhLWcg3wHJzF#33109519中有详细解释。
使用travis
gem加密字符串GITHUB_API_KEY=<key>
,并将其添加到您的.travis.yml
文件中:
env:
secure: <encrypted>
这种做法的好处在于不需要使用 Travis 的网页界面,但需要使用一个 Gem 并进行更多的复制粘贴。
https://<me>:$GITHUB_API_KEY@github.com
可能需要更改为 https://$GITHUB_API_KEY:@github.com
或者 https://$GITHUB_API_KEY@github.com
。 - Benjamin Oakeshttps://<me>:$GITHUB_API_KEY@github.com/<me>/<repo-name>.git
才能使其工作。 - John Blischak我不知道这个功能有多新,但是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/
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将在构建矩阵中的每个构建中切换,因此如果您每个构建有多个作业,您的代码将被推送多次,这不会产生任何影响,但知道它正在发生是很好的。
再添加一种解决方案,我使用了来自Github的HTTPS令牌,对其进行了加密,并在检出和推送时使用HTTPS。
我几天前刚写了一篇关于这个的博客。以下是简要内容:
我为此编写了一个自定义部署脚本。该脚本的核心功能如下:
#!/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
我的博客在这里。它非常全面,如果在此作为答案发布会显得有些冗余(因为 Stack Overflow 的用户大多数都是经验丰富的开发者)。我在博客中发布的脚本还缺少一项功能:它不能保留生成站点的提交历史记录,而上面这个答案中的脚本可以。