关于github:使用github-action同时部署hexo到github和coding最优雅的方式

33次阅读

共计 6178 个字符,预计需要花费 16 分钟才能阅读完成。

原文发于我的博客和公众号:“Noosphere 博客”,“智圈云公众号”,理解相干信息能够关注“智圈云”

指标

咱们晓得应用 github action 能够很简略的部署 hexo 的动态文件到 github pages,然而如果在国内咱们心愿部署到 github pages 同时也部署到 coding,而后通过 dns 双线路由,另外,咱们可能有多个账号,比方公司的和集体的博客或者网站,也是同时部署到 coding 和 github,那就这个 github action 解决不了,上面咱们革新一下,使其达到这个指标:

  1. hexo 的 source 寄存在独立库
  2. 生成的动态文件存在独立的库
  3. 提交 markdown 文件后,主动生成动态文件
  4. 主动部署到 github pages
  5. 主动部署到 coding
  6. 同一份 hexo source 库,只须要配置一次 hexo 的 _config.yml,就能够间接通过hexo deploy -g 或者git push 来触发部署
  7. 反对多个 github 账号,同时也反对多个 coding 账号

配置 hexo 的 deploy

找到 hexo 根目录的_config.yml, 而后配置 deploy 字段的内容如下

deploy:
  type: 'git'
  repo: 
    github: 'git@noosphere-coder.github.com:noosphere-coder/noosphere-coder.github.io.git'
    coding: 'git@e.coding.net:noosphere/noosphere.git'
  branch: 'master'

这个配置指标是让咱们间接 hexo deploy 能够同时推送到 github 和 coding 的 pages 仓库

配置 hexo deploy 命令反对多个 github 和 coding 账号

一般来说,如果我只有一个 github 的账号,在这个配置下间接执行hexo g -d,一个命令就能够间接实现两个仓库的部署了。

那么如果咱们的 github 账号有多个,比方有一个办公用的,一个私人的,那怎么办?
咱们晓得 git 的 ssh 推送形式是须要应用特定的 key 的,所以,咱们只须要配置 ssh 来路由特定的域名到 key 即可.

依据需要,在配置这个 ssh key 的路由之前,咱们要学生成一个 key 用于做 pages 部署

ssh-keygen noosphere-coder

而后一路回车就行 (不须要太强的安全性的话),生成后 key 在/home/$USER/.ssh/ 目录下

为了这个 key 能够推送到 github 或者 coding 的独立账号,咱们须要把这个 key 退出到 github 和 coding 的账号,比方我新建了一个 noosphere-coder 的 github 账号,那么我把这个 noosphere-coder 的 ssh key 作为这个账户的 ssh key 即可,关上 [https://github.com/settings/keys](https://github.com/settings/keys),点击 New SSH key 减少即可,退出后,咱们就能够用这个 key 来操作这个 github 账号了(coding 也相似)。

接下来,咱们用这个 key 来配置 ssh key 的路由,达到执行 git push 命令的时候主动应用不同的 key:

cat << EOF > /home/$USER/.ssh/config
Host github.com  
    HostName github.com  
    PreferredAuthentications publickey  
    IdentityFile /home/$USER/.ssh/id_rsa

Host noosphere-coder.github.com  
    HostName github.com  
    PreferredAuthentications publickey 
    IdentityFile /home/$USER/.ssh/noosphere-coder

Host e.coding.net  
    HostName e.coding.net  
    PreferredAuthentications publickey  
    IdentityFile /home/$USER/.ssh/id_rsa 

Host noosphere-coder.coding.net  
    HostName e.coding.net  
    PreferredAuthentications publickey  
    IdentityFile /home/$USER/.ssh/noosphere-coder
EOF

这个配置通知 ssh,如果碰到 Host 为 noosphere-coder.github.com 或者 noosphere-coder.coding.net 的时候就去应用 /home/$USER/.ssh/noosphere-coder 这个 key

然而,因为咱们新建的 github 的仓库,默认的 remote url 的是 git@github.com:noosphere-coder/hexo-noosphere.git(coding 亦如是)
所以咱们须要批改这个仓库的 remote url 为git@noosphere-coder.github.com:noosphere-coder/hexo-action.git

git remote set-url origin git@noosphere-coder.github.com:noosphere-coder/hexo-action.git

coding 我的项目也如法炮制即可。

截止目前,你用 hexo g -d 就能够用不同的账号推送到 github 和 coding 了。

配置 github CI Actions

下面章节,咱们配置了 git 和 hexo,实现了通过一个 hexo g -d的命令间接推送到 github 和 coding,并反对多个账号。

hexo g是在本地生成动态文件,咱们的 source 文件的仓库个别是放在 github,而后配置为公有仓库,保障安全性,所以,咱们接下来配置 github CI actions,来达到间接间接用 git push 来触发 hexo g -d,也就是,当咱们git push 的时候,CI 主动生成动态文件,而后主动推送到 github 和 coding 的动态 pages 仓库。

上面咱们来看看最终的 CI action 的配置,而后再来解释

github hexo ci action

# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the action will run. Triggers the workflow on push or pull request
# events but only for the master branch
on:
  push:
    branches: [master]
  pull_request:
    branches: [master]

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  build-and-deploy:
    # The type of runner that the job will run on
    runs-on: ubuntu-latest
    container:
      image: node:13-alpine

    steps:
    # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
    - uses: actions/checkout@v1
      with:
        submodules: true # Checkout private submodules(themes or something else).
    
    # Caching dependencies to speed up workflows. (GitHub will remove any cache entries that have not been accessed in over 7 days.)
    # - name: Cache node modules
    #   uses: actions/cache@v1
    #   id: cache
    #   with:
    #     path: node_modules
    #     key: ${{runner.os}}-node-${{hashFiles('**/package-lock.json') }}
    #     restore-keys: |
    #       ${{runner.os}}-node-
    - name: Install Dependencies
      # if: steps.cache.outputs.cache-hit != 'true'
      # run: npm ci
      run: |
        npm install

    # Deploy hexo blog website.
    - name: Deploy
      id: deploy
      # uses: noosphere-coder/hexo-action@master
      uses: noosphere-coder/hexo-action@master
      with:
        deploy_key: ${{secrets.DEPLOY_KEY}}
        # user_name: your github username  # (or delete this input setting to use bot account)
        # user_email: your github useremail  # (or delete this input setting to use bot account)
        commit_msg: ${{github.event.head_commit.message}}  # (or delete this input setting to use hexo default settings)
    # Use the output from the `deploy` step(use for test action)
    - name: Get the output
      run: |
        echo "${{steps.deploy.outputs.notify}}"

配置阐明:

  1. 在这个配置外面,咱们 use 了一个 action,[noosphere-coder/hexo-action@master](https://github.com/noosphere-coder/hexo-action),这个是我依据指标定制的一个 action,来自于[sma11black/hexo-action](https://github.com/sma11black/hexo-action)
  2. 这里没有应用 dependency cache,因为 node-sass这本地构建的包在 cache 的状况下存在版本不统一的问题,临时没找到解决办法

那么,这里咱们为什么要定制一个本人的 action,起因是 smallblack/hexo-action 不反对同时推送到 github 和 coding

因而,咱们 fork 这个 action 的仓库来革新一下

革新 smallblack/hexo-actionentrypoint.sh

#!/bin/sh

set -e

# setup ssh-private-key
mkdir -p /root/.ssh/
echo "$INPUT_DEPLOY_KEY" > /root/.ssh/id_rsa

chmod 600 /root/.ssh/id_rsa

ssh-keyscan -t rsa github.com >> /root/.ssh/known_hosts
ssh-keyscan -t rsa e.coding.net >> /root/.ssh/known_hosts

# you can change here to router domain with defferent key with you need
cat << EOF > /root/.ssh/config
Host github.com  
    HostName github.com  
    PreferredAuthentications publickey  
    IdentityFile /root/.ssh/id_rsa

Host $GITHUB_ACTOR.github.com  
    HostName github.com  
    PreferredAuthentications publickey
    IdentityFile /root/.ssh/id_rsa

Host e.coding.net  
    HostName e.coding.net  
    PreferredAuthentications publickey  
    IdentityFile /root/.ssh/id_rsa 

Host $GITHUB_ACTOR.coding.net  
    HostName e.coding.net  
    PreferredAuthentications publickey  
    IdentityFile /root/.ssh/id_rsa 
EOF

chmod 600 /root/.ssh/config

# setup deploy git account
git config --global user.name "$INPUT_USER_NAME"
git config --global user.email "$INPUT_USER_EMAIL"

# install hexo env
npm install hexo-cli -g
npm install hexo-deployer-git --save

git clone https://github.com/$GITHUB_ACTOR/$GITHUB_ACTOR.github.io.git .deploy_git
echo 'have clone .deploy_git'

# npm remove node-sass hexo-renderer-scss
# npm install hexo-renderer-scss

# deployment
if ["$INPUT_COMMIT_MSG" == ""]
then
    hexo g -d
else
    hexo g -d -m "$INPUT_COMMIT_MSG"
fi

echo ::set-output name=notify::"Deploy complate."

这个革新也很简略

  1. 把咱们下面生成的 noosphere-coder 的这个 ssh key 配置成 变量,而后把它生成为跑 action 的容器的 ssh key /root/.ssh/key
  2. 把 coding 的证书退出的 known_hosts
  3. 配置 ssh key 路由

看到第一点,咱们就晓得,咱们须要把 noosphere-coder 的 ssh key 的秘钥退出到 source 仓库的 secret key,并且命名为 DEPLOY_KEY:

  1. 关上你 github 的 source 仓库
  2. 点击settings
  3. 点击Secrets
  4. 点击New secret

而后把本地的 /home/$USER/.ssh/noosphere-coder 的内容复制进去即可。

总结

  1. 通过以上 折腾 ,咱们实现了一个比拟优雅的 hexo 部署形式,既能够间接用在本地一条命令hexo g -d 间接部署到 github 和 coding,也能够通过 git push 来触发这个同时部署,而且 github 和 coding 的动态 pages 的仓库配置只须要在 hexo 的_config.yml 配置一次就能够了。
  2. 同时,咱们这个办法反对在机器上应用多个 github 或者 coding 账号,能够辨别同时领有如办公和私人账号的这类状况


欢送关注公众号和我互动

正文完
 0