想着按照网上的教程直接部署的https://zhuanlan.zhihu.com/p/36390666… 不知道怎么总是出错
于是用了其他的方法实现了这个过程
准备
- Git
- Github repo
- openssl
- travis
- travis-ci
添加travis.yml
建立一个travis.yml模板:
language: node_js
sudo: required
node_js:
- node
branch: master
cache:
directories:
- node_modules
before_install:
script:
dist: xenial
添加Deploy key
到目标仓库,在仓库设置中添加deploy key。
在本地使用ssh-keygen
生成key
ssh-keygen -t rsa -C "your_email@example.com"
默认情况会在~/.ssh
生成两个文件:id_rsa
和id_rsa.pub
。将id_rsa.pub
的内容粘贴到Github的deploy key处,要勾选’Allow write access’
安装travis
根据情况,下列命令中你可能不需要用--pro
这个arg,请知悉
使用gem安装travis cli,这个可以参看网上教程
登录travis
gem install travis
travis login --auto --pro
使用travis加密生成私钥文件
travis encrypt-file id_rsa --add -r your_account/your_repo --pro --com
注意,我的账号要加上–pro,由于travis-ci从org迁移至com结尾的域,因此要加--com
这个命令会自动生成before_install
的部分。
before_install:
- openssl aes-256-cbc -K $encrypted_xxxxxxxx_key -iv $encrypted_xxxxxxxx_iv
-in id_rsa.enc -out ~/.ssh/id_rsa -d
其中有两个关键的key
值会传到travis-ci对应的repo上,就是encrypt_xxx_key和encrypt_xxx_iv 这个会添加到travis-ci的repo中的environment variable中。
在根目录创建.travis
文件夹,并把刚才用命令同时生成的id_rsa.enc
放入文件夹中,更改刚才的命令为
before_install:
- openssl aes-256-cbc -K $encrypted_xxxxxxxx_key -iv $encrypted_xxxxxxxx_iv
-in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d
在该文件夹下创建文件ssh_config
Host github.com
User git
StrictHostKeyChecking no
IdentityFile ~/.ssh/id_rsa
IdentitiesOnly yes
完善before_install
before_install:
- openssl aes-256-cbc -K $encrypted_xxxxxxxx_key -iv $encrypted_xxxxxxxx_iv
-in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d
# Set the permission of the key
- chmod 600 ~/.ssh/id_rsa
# Start SSH agent
- eval $(ssh-agent)
# Add the private key to the system
- ssh-add ~/.ssh/id_rsa
# Copy SSH config
- cp .travis/ssh_config ~/.ssh/config
- git config --global user.name 'your_name'
- git config --global user.email 'your@email.com'
在根目录创建deploy
文件夹,在其中添加deploy.sh
文件
#!/usr/bin/env sh
# 确保脚本抛出遇到的错误
set -e
# 生成静态文件
npm run docs:build
git clone https://github.com/CUP-ACM-Programming-Club/CUPACM-Docs.git -b gh-pages pages
rm -rf pages/*.html
rm -rf pages/assets
rm -rf pages/dist
cp -r docs/.vuepress/dist/* pages
cd pages
git add -A
git commit -m "deploy `TZ=UTC-8 date +'%Y-%m-%d %H:%M:%S'`"
git config user.email 'your@email'
git config user.name 'your_name'
git push -f git@github.com:CUP-ACM-Programming-Club/CUPACM-Docs.git gh-pages
cd -
以上内容请根据自身需要更改
执行命令
git update-index --chmod=+x ./deploy/deploy.sh
在install
添加执行代码
install:
- ./deploy/deploy.sh
要注意的是,在PR的时候encrypt_xxxx这两个变量Travis CI是不会传入虚拟机实例的,因此如果按照正常的流程这个过程是不会进行自动部署的。我们也不希望在PR前任何fork分支都被执行自动部署到主分支中去。
因此用条件判断语句做以下处理
before_install:
- '[[ -n ${encrypted_xxxxxxx_iv+x} ]] && openssl aes-256-cbc -K $encrypted_xxxxxx_key -iv $encrypted_xxxxxx_iv
-in .travis/id_rsa.enc -out ~/.ssh/id_rsa -d && chmod 600 ~/.ssh/id_rsa && eval $(ssh-agent) && ssh-add ~/.ssh/id_rsa && cp .travis/ssh_config ~/.ssh/config
|| echo "Pull Request mode"'
- git config --global user.name 'yourname'
- git config --global user.email your@email.com'
- export TZ='Asia/Shanghai'
script:
- '[[ -n ${encrypted_xxxxxx_iv+x} ]] && chmod a+x ./deploy/deploy.sh && ./deploy/deploy.sh || npm run docs:build'
这样问题就能得到解决。
然后根据上面的shell,我们会把Page push到gh-pages分支上。因此要在repo的setting中设置Github Pages分支为gh-pages
完成