Hexo 实现 Github/Coding 持续集成

本文章首发于 https://szhshp.org/tech/2020/03/15/hexocicd.html 转载请注明

2020-03-15: 以下两个方法测试通过

开发背景

  1. 为知笔记的搜索太慢了。
  2. 我想要迁移笔记。
  3. 我想要迁移笔记。
  4. 我想要迁移笔记。
  5. 我想要迁移笔记。
  6. 我想要迁移笔记。
  7. 我想要迁移笔记。
  8. 我想要迁移笔记。
  9. 我想要迁移笔记。
  10. 我很需要迁移笔记。
  11. 为知笔记的搜索太慢了。
  12. 希望能有一个免费的笔记托管平台。

Github & Coding 的服务差异

主要配置:

  1. 一个 Source Repo, 用于存放源码
  2. 一个 Release Repo, 用于存放 build 之后的 pages 文件

Pages 服务的限制:

  • Github 的 pages 服务 repo 必须设置为开源, 因此 Source Repo 可以设置为闭源
  • Coding 的 pages 服务 repo 没有任何限制, 所以 两个都可以设置为闭源.

其他 CI/CD 服务的限制:

  • Travis 可以用于 Github, 但是不能用于国内的 Coding
  • https://travis-ci.org 不支持私有仓库, https://travis-ci.com 才支持选择私有仓库 (但是对于私有仓库只有 100 次次数限制)

最终决定:

  1. Github 端使用 Github Actions
  2. Coding 端使用新开放的 持续集成 功能, 类似 Github Actions

Hexo 站点搭建

(略)

Github 操作方法

主要目的:

  1. 创建一个 Github Action
  2. 当我 push 代码的时候自动 build
  3. 由于 hexo 自身就有用 deploy 的功能, 所以只需要在 push 的时候执行以下 hexo deploy 将生成的文件全部部署到 Release Repo
  4. 需要实现从 Source Repo 中提交到 Release Repo 的认证
  • 最大的麻烦就是这一步

认证模式: SSH

生成一对公钥和私钥

公钥放置在 请求操作端: 本机或者远程服务器 (一般放置在 .ssh/rsa_id)

私钥放置在 目标端, 可以放在两个地方:

  • 如果放置在用户级别的私钥处设置 (Github-Setting-SSH and GPG Keys), 那么可以不需要账号密码操作整个用户的所有 repo
  • 如果放置在单个 repo 的 deploy key 中, 那么如果拥有这个私钥, 就可以不需要账号密码操作单个 repo

设置 SSH

我们这里实现单个 repo 的 SSH 访问

首先本地使用 ssh-keygen 可以生成一个私钥, 一个公钥

首先跑到 bash 里面执行 ssh-genkey

如果是 windows 系统, 就可以直接跑到 ${GitDirectory}\usr\bin\ssh-keygen.exe 然后使用 管理员权限+CMD 执行

最后生成了一个公钥 TESTKEY.PUB , 一个私钥 TESTKEY .

将生成的 私钥全部内容 (不要担心格式) 放置在 Source Repo 的 Serect 里面, 然后取一个名字, 比如我给他取名成 DEPLOY_KEY

然后将 公钥全部内容 放置到 Release Repo 的 Deployed Keys 里面, 并且要赋予读写的权限, 公钥的名字不重要

这个公钥并不是放置在用户的公钥设置里面, 我们仅仅对 Release Repo 进行操作

Config.yml 设置

这一段代码放置在 Source Repo 里面. 下方设置了对应的 Release Repo 的名字以及对应的分支名字.

deploy:
  type: git
  repo: git@github.com:szhielelp/notebook-release.git # 改成你自己的 repo 地址,需要设置 SSH 地址。
  branch: master # 改成你自己的分支名称。

设置完之后本地测试一下

hexo d

因为对应的私钥同时也保存在本地, 所以应该可以部署成功.

创建 Github Action

跑到 Github Action 的页面创建一个新的 action, 然后这个 action 就会被放置在 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}} # 这里写上刚才在 Secret 里面设置的变量名
        run: |
          mkdir -p ~/.ssh/
          echo "$DEPLOY_KEY" > ~/.ssh/id_rsa # 将私钥的全部内容输出到一个文件里面。
          chmod 600 ~/.ssh/id_rsa # 修改对应私钥文件的权限。
          ssh-keyscan github.com >> ~/.ssh/known_hosts # 将 Github.com 添加到已知文件列表。

          git config --global user.name "你的 Github 用户名" # 设置一下提交的姓名和邮箱。
          git config --global user.email "你的 Github 邮箱"

      - name: Setup Hexo CI

        run: |
          npm i -g hexo-cli # 全局安装需要的库。
          npm i

      - name: Setup other package

        run: |
          npm install

      - name: Deploy

        run: |
          rm -rf .deploy_git
          hexo g && hexo deploy # 开始部署
          rm ~/.ssh/id_rsa

Coding 操作方法

主要目的基本相同, 但是选用的一个完全不同的认证方法

SSH 认证模式的问题

理论上按照 github 的模式可以实现, 但是 SSH 模式请求的时候一直报 Permission denied (publickey)

我说尝试过的方法:

  1. 修改权限为 7, Github 上方脚本里面设置的权限为 6
  2. 生成一对完全不同的新的公钥
  3. 使用 ssh-add 将添加公钥到设备
  4. 公钥对于 git.coding.net 无效,应该改成 e.coding.net

最终发现用户级别公钥可以实现本地的部署, 但是无法实现 repo 之间的部署, 一直出现 Permission denied (publickey)

最终决定选用另一种认证方式.

认证模式: Token

  1. 首先创建一个 token

  2. 是在 repo - 开发者选项 - 项目令牌里面生成

    • 这个东西生成一次就无法再看到了, 一定要复制保存
  3. Token 也可以放在两个地方: 一个是用户级的 Token 可以操作所有 Repo, 一个是 Repo 级的 token 只能操作单个 repo

Config.yml 设置

同样的, 在 Source Repo 那边设置:

注意, 下方需要设置的是 HTTPS 的链接, 然后需要将你得到的 token 的账号密码扔进去.

deploy:
  type: git
  repo: https://[token name]:[token password]@e.coding.net/szhshp/szhshp-notebook-release.git
  branch: master

同样现在本地测试一下, 这种模式上并没有使用任何的 SSH 访问, 直接就可以部署成功

创建持续集成任务

因为这个地方没有使用 SSH 访问, 并且 token 已经设置到了上方的链接当中, 直接 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('构建') {
      steps {
        echo '构建中。..'
        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 '构建完成。'
      }
    }
  }
  environment {
    HOSTINFO = 'Host coding.net     IdentityFile ~/.ssh/id_rsa.coding     User szhshp'
  }
}

Nice Work !!!

花了我三天, 搞定了累死我了

Coding 单个 Repo 多仓库操作方法。

Coding 更新后, 一个项目里面可以有多个仓库

实际上就是多个 Repo

在这种情况下完全可以只用一个项目控制 Source RepoRelease Repo

处理方法很简单:

  1. 因为是同一个 Repo, 在 Repo 里面创建一个项目 Token
  2. 将 _config.yml 里面 deploy 一列的 repo 改为 release 仓库对应的 HTTPS 连接, 记得带上 token
deploy:
type: git
repo: https://{token name}:{token pswd}@e.coding.net/ssszzz/notebook/release.git
branch: master
  1. CI 脚本如上文设置 Coding 操作方法
  2. 这样子以后就不需要了来回跑两个不同的 repo 了

参考文献

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,458评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,454评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,171评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,062评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,440评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,661评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,906评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,609评论 0 200
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,379评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,600评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,085评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,409评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,072评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,088评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,860评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,704评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,608评论 2 270

推荐阅读更多精彩内容