本文章首發(fā)于 https://szhshp.org/tech/2020/03/15/hexocicd.html 轉(zhuǎn)載請(qǐng)注明
2020-03-15: 以下兩個(gè)方法測(cè)試通過(guò)
開(kāi)發(fā)背景
- 為知筆記的搜索太慢了状勤。
- 我想要遷移筆記荣堰。
- 我想要遷移筆記荔燎。
- 我想要遷移筆記。
- 我想要遷移筆記。
- 我想要遷移筆記。
- 我想要遷移筆記。
- 我想要遷移筆記。
- 我想要遷移筆記抒钱。
- 我很需要遷移筆記。
- 為知筆記的搜索太慢了。
- 希望能有一個(gè)免費(fèi)的筆記托管平臺(tái)谋币。
Github & Coding 的服務(wù)差異
主要配置:
- 一個(gè) Source Repo, 用于存放源碼
- 一個(gè) Release Repo, 用于存放 build 之后的 pages 文件
Pages 服務(wù)的限制:
- Github 的 pages 服務(wù) repo 必須設(shè)置為開(kāi)源, 因此 Source Repo 可以設(shè)置為閉源
- Coding 的 pages 服務(wù) repo 沒(méi)有任何限制, 所以 兩個(gè)都可以設(shè)置為閉源.
其他 CI/CD 服務(wù)的限制:
- Travis 可以用于 Github, 但是不能用于國(guó)內(nèi)的 Coding
- https://travis-ci.org 不支持私有倉(cāng)庫(kù), https://travis-ci.com 才支持選擇私有倉(cāng)庫(kù) (但是對(duì)于私有倉(cāng)庫(kù)只有 100 次次數(shù)限制)
最終決定:
- Github 端使用 Github Actions
- Coding 端使用新開(kāi)放的
持續(xù)集成
功能, 類似 Github Actions
Hexo 站點(diǎn)搭建
(略)
Github 操作方法
主要目的:
- 創(chuàng)建一個(gè) Github Action
- 當(dāng)我 push 代碼的時(shí)候自動(dòng) build
- 由于 hexo 自身就有用 deploy 的功能, 所以只需要在 push 的時(shí)候執(zhí)行以下
hexo deploy
將生成的文件全部部署到 Release Repo - 需要實(shí)現(xiàn)從 Source Repo 中提交到 Release Repo 的認(rèn)證
- 最大的麻煩就是這一步
認(rèn)證模式: SSH
生成一對(duì)公鑰和私鑰
公鑰放置在 請(qǐng)求操作端: 本機(jī)或者遠(yuǎn)程服務(wù)器 (一般放置在 .ssh/rsa_id)
私鑰放置在 目標(biāo)端, 可以放在兩個(gè)地方:
- 如果放置在用戶級(jí)別的私鑰處設(shè)置 (Github-Setting-SSH and GPG Keys), 那么可以不需要賬號(hào)密碼操作整個(gè)用戶的所有 repo
- 如果放置在單個(gè) repo 的 deploy key 中, 那么如果擁有這個(gè)私鑰, 就可以不需要賬號(hào)密碼操作單個(gè) repo
設(shè)置 SSH
我們這里實(shí)現(xiàn)單個(gè) repo 的 SSH 訪問(wèn)
首先本地使用 ssh-keygen 可以生成一個(gè)私鑰, 一個(gè)公鑰
首先跑到 bash 里面執(zhí)行 ssh-genkey
如果是 windows 系統(tǒng), 就可以直接跑到
${GitDirectory}\usr\bin\ssh-keygen.exe
然后使用 管理員權(quán)限+CMD 執(zhí)行
最后生成了一個(gè)公鑰 TESTKEY.PUB
, 一個(gè)私鑰 TESTKEY
.
將生成的 私鑰全部?jī)?nèi)容 (不要擔(dān)心格式) 放置在 Source Repo 的 Serect 里面, 然后取一個(gè)名字, 比如我給他取名成 DEPLOY_KEY
然后將 公鑰全部?jī)?nèi)容 放置到 Release Repo 的 Deployed Keys 里面, 并且要賦予讀寫(xiě)的權(quán)限, 公鑰的名字不重要
這個(gè)公鑰并不是放置在用戶的公鑰設(shè)置里面, 我們僅僅對(duì) Release Repo 進(jìn)行操作
Config.yml 設(shè)置
這一段代碼放置在 Source Repo 里面. 下方設(shè)置了對(duì)應(yīng)的 Release Repo 的名字以及對(duì)應(yīng)的分支名字.
deploy:
type: git
repo: git@github.com:szhielelp/notebook-release.git # 改成你自己的 repo 地址仗扬,需要設(shè)置 SSH 地址。
branch: master # 改成你自己的分支名稱瑞信。
設(shè)置完之后本地測(cè)試一下
hexo d
因?yàn)閷?duì)應(yīng)的私鑰同時(shí)也保存在本地, 所以應(yīng)該可以部署成功.
創(chuàng)建 Github Action
跑到 Github Action 的頁(yè)面創(chuàng)建一個(gè)新的 action, 然后這個(gè) action 就會(huì)被放置在 Repo 的根目錄的 .github/workflows/nodejs.yml
文件夾下面
name: Notebook Deployment
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [10.x]
steps:
- name: Deployment Start
uses: actions/checkout@v1
- name: Setup Node ${{matrix.node-version}}
uses: actions/setup-node@v1
with:
node-version: ${{matrix.node-version}}
- name: Setup Git Env
env:
DEPLOY_KEY: ${{secrets.DEPLOY_KEY}} # 這里寫(xiě)上剛才在 Secret 里面設(shè)置的變量名
run: |
mkdir -p ~/.ssh/
echo "$DEPLOY_KEY" > ~/.ssh/id_rsa # 將私鑰的全部?jī)?nèi)容輸出到一個(gè)文件里面厉颤。
chmod 600 ~/.ssh/id_rsa # 修改對(duì)應(yīng)私鑰文件的權(quán)限。
ssh-keyscan github.com >> ~/.ssh/known_hosts # 將 Github.com 添加到已知文件列表凡简。
git config --global user.name "你的 Github 用戶名" # 設(shè)置一下提交的姓名和郵箱逼友。
git config --global user.email "你的 Github 郵箱"
- name: Setup Hexo CI
run: |
npm i -g hexo-cli # 全局安裝需要的庫(kù)。
npm i
- name: Setup other package
run: |
npm install
- name: Deploy
run: |
rm -rf .deploy_git
hexo g && hexo deploy # 開(kāi)始部署
rm ~/.ssh/id_rsa
Coding 操作方法
主要目的基本相同, 但是選用的一個(gè)完全不同的認(rèn)證方法
SSH 認(rèn)證模式的問(wèn)題
理論上按照 github 的模式可以實(shí)現(xiàn), 但是 SSH 模式請(qǐng)求的時(shí)候一直報(bào) Permission denied (publickey)
我說(shuō)嘗試過(guò)的方法:
- 修改權(quán)限為 7, Github 上方腳本里面設(shè)置的權(quán)限為 6
- 生成一對(duì)完全不同的新的公鑰
- 使用 ssh-add 將添加公鑰到設(shè)備
- 公鑰對(duì)于 git.coding.net 無(wú)效秤涩,應(yīng)該改成 e.coding.net
最終發(fā)現(xiàn)用戶級(jí)別公鑰可以實(shí)現(xiàn)本地的部署, 但是無(wú)法實(shí)現(xiàn) repo 之間的部署, 一直出現(xiàn) Permission denied (publickey)
最終決定選用另一種認(rèn)證方式.
認(rèn)證模式: Token
首先創(chuàng)建一個(gè) token
-
是在 repo - 開(kāi)發(fā)者選項(xiàng) - 項(xiàng)目令牌里面生成
- 這個(gè)東西生成一次就無(wú)法再看到了, 一定要復(fù)制保存
Token 也可以放在兩個(gè)地方: 一個(gè)是用戶級(jí)的 Token 可以操作所有 Repo帜乞, 一個(gè)是 Repo 級(jí)的 token 只能操作單個(gè) repo
Config.yml 設(shè)置
同樣的, 在 Source Repo 那邊設(shè)置:
注意, 下方需要設(shè)置的是 HTTPS 的鏈接, 然后需要將你得到的 token 的賬號(hào)密碼扔進(jìn)去.
deploy:
type: git
repo: https://[token name]:[token password]@e.coding.net/szhshp/szhshp-notebook-release.git
branch: master
同樣現(xiàn)在本地測(cè)試一下, 這種模式上并沒(méi)有使用任何的 SSH 訪問(wèn), 直接就可以部署成功
創(chuàng)建持續(xù)集成任務(wù)
因?yàn)檫@個(gè)地方?jīng)]有使用 SSH 訪問(wèn), 并且 token 已經(jīng)設(shè)置到了上方的鏈接當(dāng)中, 直接 push 即可.
pipeline {
agent any
stages {
stage('檢出') {
steps {
checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]])
}
}
stage('構(gòu)建') {
steps {
echo '構(gòu)建中。..'
sh '''
git config --global user.name xxxxx
git config --global user.email xxxxx@sina.com
npm i -g hexo-cli
npm i
rm -rf .deploy_git
hexo g && hexo deploy
'''
echo '構(gòu)建完成筐眷。'
}
}
}
environment {
HOSTINFO = 'Host coding.net IdentityFile ~/.ssh/id_rsa.coding User szhshp'
}
}
Nice Work !!!
花了我三天, 搞定了累死我了
Coding 單個(gè) Repo 多倉(cāng)庫(kù)操作方法黎烈。
Coding 更新后, 一個(gè)項(xiàng)目里面可以有多個(gè)倉(cāng)庫(kù)
實(shí)際上就是多個(gè) Repo
在這種情況下完全可以只用一個(gè)項(xiàng)目控制 Source Repo 和 Release Repo
處理方法很簡(jiǎn)單:
- 因?yàn)槭峭粋€(gè) Repo, 在 Repo 里面創(chuàng)建一個(gè)項(xiàng)目 Token
- 將 _config.yml 里面 deploy 一列的 repo 改為 release 倉(cāng)庫(kù)對(duì)應(yīng)的 HTTPS 連接, 記得帶上 token
deploy:
type: git
repo: https://{token name}:{token pswd}@e.coding.net/ssszzz/notebook/release.git
branch: master
- CI 腳本如上文設(shè)置 Coding 操作方法
- 這樣子以后就不需要了來(lái)回跑兩個(gè)不同的 repo 了
參考文獻(xiàn)
- https://www.iots.vip/post/hexo-ci-wiki.html
- https://segmentfault.com/a/1190000002900848
- https://blog.csdn.net/qq_33619378/article/details/81191564
- https://zhuanlan.zhihu.com/p/26625249
- https://hexo.io/zh-cn/docs/commands.html
- http://www.reibang.com/p/5691815b81b6
- https://www.voidking.com/dev-hexo-travis-ci/
- https://www.cnblogs.com/milovetingting/p/12159100.html
- https://hdj.me/github-actions-hexo-cicd/
- https://yanyinhong.github.io/2017/05/02/How-to-insert-image-in-hexo-post/