Hexo 實(shí)現(xiàn) Github/Coding 持續(xù)集成

本文章首發(fā)于 https://szhshp.org/tech/2020/03/15/hexocicd.html 轉(zhuǎn)載請(qǐng)注明

2020-03-15: 以下兩個(gè)方法測(cè)試通過(guò)

開(kāi)發(fā)背景

  1. 為知筆記的搜索太慢了状勤。
  2. 我想要遷移筆記荣堰。
  3. 我想要遷移筆記荔燎。
  4. 我想要遷移筆記。
  5. 我想要遷移筆記。
  6. 我想要遷移筆記。
  7. 我想要遷移筆記。
  8. 我想要遷移筆記。
  9. 我想要遷移筆記抒钱。
  10. 我很需要遷移筆記。
  11. 為知筆記的搜索太慢了。
  12. 希望能有一個(gè)免費(fèi)的筆記托管平臺(tái)谋币。

Github & Coding 的服務(wù)差異

主要配置:

  1. 一個(gè) Source Repo, 用于存放源碼
  2. 一個(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ù)限制)

最終決定:

  1. Github 端使用 Github Actions
  2. Coding 端使用新開(kāi)放的 持續(xù)集成 功能, 類似 Github Actions

Hexo 站點(diǎn)搭建

(略)

Github 操作方法

主要目的:

  1. 創(chuàng)建一個(gè) Github Action
  2. 當(dāng)我 push 代碼的時(shí)候自動(dòng) build
  3. 由于 hexo 自身就有用 deploy 的功能, 所以只需要在 push 的時(shí)候執(zhí)行以下 hexo deploy 將生成的文件全部部署到 Release Repo
  4. 需要實(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ò)的方法:

  1. 修改權(quán)限為 7, Github 上方腳本里面設(shè)置的權(quán)限為 6
  2. 生成一對(duì)完全不同的新的公鑰
  3. 使用 ssh-add 將添加公鑰到設(shè)備
  4. 公鑰對(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

  1. 首先創(chuàng)建一個(gè) token

  2. 是在 repo - 開(kāi)發(fā)者選項(xiàng) - 項(xiàng)目令牌里面生成

    • 這個(gè)東西生成一次就無(wú)法再看到了, 一定要復(fù)制保存
  3. 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 RepoRelease Repo

處理方法很簡(jiǎn)單:

  1. 因?yàn)槭峭粋€(gè) Repo, 在 Repo 里面創(chuàng)建一個(gè)項(xiàng)目 Token
  2. 將 _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
  1. CI 腳本如上文設(shè)置 Coding 操作方法
  2. 這樣子以后就不需要了來(lái)回跑兩個(gè)不同的 repo 了

參考文獻(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請(qǐng)通過(guò)簡(jiǎn)信或評(píng)論聯(lián)系作者匀谣。
  • 序言:七十年代末照棋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子武翎,更是在濱河造成了極大的恐慌烈炭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宝恶,死亡現(xiàn)場(chǎng)離奇詭異符隙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)垫毙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)霹疫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人综芥,你說(shuō)我怎么就攤上這事丽蝎。” “怎么了膀藐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵屠阻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我消请,道長(zhǎng),這世上最難降的妖魔是什么类腮? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任臊泰,我火速辦了婚禮,結(jié)果婚禮上蚜枢,老公的妹妹穿的比我還像新娘缸逃。我一直安慰自己针饥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布需频。 她就那樣靜靜地躺著丁眼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昭殉。 梳的紋絲不亂的頭發(fā)上苞七,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音挪丢,去河邊找鬼蹂风。 笑死,一個(gè)胖子當(dāng)著我的面吹牛乾蓬,可吹牛的內(nèi)容都是我干的惠啄。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼任内,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼撵渡!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起死嗦,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤趋距,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后越走,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體棚品,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年廊敌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了铜跑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骡澈,死狀恐怖锅纺,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情肋殴,我是刑警寧澤囤锉,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站护锤,受9級(jí)特大地震影響官地,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜烙懦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一驱入、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦亏较、人聲如沸莺褒。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)遵岩。三九已至,卻和暖如春巡通,著一層夾襖步出監(jiān)牢的瞬間尘执,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工扁达, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留正卧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓跪解,卻偏偏與公主長(zhǎng)得像炉旷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子叉讥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容