Hexo 透過 GitHub Actions 自動佈署 Blog

  1. 前言
  2. 環境
  3. 流程
  4. 前置作業
  5. 流程
  6. 補充
  7. SSH key (有密碼版本)
  8. 參考連結

前言

本篇記錄 透過 GitHub Actions 自動化佈署至 GitHub Pages 的 Blog

環境

  • Windows 10 (home 21H2)

流程

當文章撰寫好並推送到 blog-source 後,GitHub Actions 會自動佈署至 blog

  • blog-source: 私有的 GitHub Repo (撰寫Hexo Source文章)
  • blog: 公開的 GitHub Repo (GitHub Pages)

前置作業

  1. 安裝 hexo-deployer-git 可參考 w4560000 - 上傳至 GitHub Page

  2. 調整 /_config.yml
    改為 SSH 方式

 deploy:
   type: git
-  repo: https://github.com/w4560000/w4560000.github.io.git
+  repo: git@github.com:w4560000/w4560000.github.io.git
   branch: master

流程

  1. 調整 package.json,新增 npm script

    • hs: 本機測試
    • hd: 佈署至 GitHub Pages

    package.json

    ...
    "scripts": {
        ...,
    +   "hs": "hexo clean && hexo g && hexo s",
    +   "hd": "hexo clean && hexo g && hexo d"
        ...,
    },
    ...
    
  2. 建立 SSH key (無密碼版本)

    ssh-keygen -t rsa -b 4096 -f actions-deploy-key -N ""
    
    • actions-deploy-key.pub (公鑰)
    • actions-deploy-key (私鑰)
  3. 在 GitHub Pages Repo 上設定 Deploy Key

    將公鑰設定至 Deploy Key,Title可以隨便取 (記得 Allow write access 要勾選)

  4. 在 Hexo Source Repo 上設定私鑰

    將私鑰設定到 Action secrets,Name = DEPLOY_KEY (待會設定 GitHub Actions yaml 會用到)

  5. 在 Hexo Source Repo 上設定 GitHub Actions

    主要流程是 npm install後,接著設定 SSH 連線、Git Config,最後 Deploy

    name: Deploy
    on: [push]
    
    jobs:
    build:
        runs-on: ubuntu-latest
        name: Deploy Hexo Blog
        steps:
        - name: Checkout
        uses: actions/checkout@v1
        
        - name: Cache node modules
        uses: actions/cache@v2
        id: cache
        with:
            path: node_modules
            key: ${{ runner.OS }}-npm-cache
            restore-keys: |
            ${{ runner.OS }}-npm-cache
            
        - name: Install Dependencies
        run: npm install
        
        - name: Deploy
        run: |
            mkdir -p ~/.ssh/
            echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_rsa
            chmod 600 ~/.ssh/id_rsa
            ssh-keyscan github.com >> ~/.ssh/known_hosts
            
            git config --global user.name "$YOUR_GITHUB_USERNAME>"
            git config --global user.email "$YOUR_GITHUB_EMAIL"
            
            npm run hd
            
        - name: Get the output
        run: |
            echo "${{ steps.deploy.outputs.notify }}"
    

    設定完成後,當 Hexo Source Repo 有異動時,會自動 Trigger GitHub Actions 佈署至 GitHub Pages

補充

若要在本機直接佈署到GitHub Pages,也可以直接跑 npm run hd
但因已設為 SSH 方式,本機也要調整一下設定

  1. 將私鑰放到使用者的對應的 .ssh 資料夾內 (ex: C:\Users\leo.zheng\.ssh)
  2. 將私鑰檔名改成 id_rsa (預設是吃 id_rsa)
  3. 測試一下連線是否正常
    ssh -T git@github.com
    

PS 若原先以有其他 SSH 私鑰 用到 id_rsa,此時就不能直接把私鑰檔名改成 id_rsa,可另外設定使用 actions-deploy-key 來連線 SSH

  1. 新增檔名為 config 的檔案

    # for GitHub
    Host github.com
        HostName github.com
        User git
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/actions-deploy-key
    

SSH key (有密碼版本)

  1. 建立 SSH key (有密碼版本)

    ssh-keygen -t rsa -b 4096 -f actions-deploy-password-key -N "123"
    
    • actions-deploy-password-key.pub (公鑰)
    • actions-deploy-password-key (私鑰)
  2. 在 GitHub Pages Repo 上設定 Deploy Key

    參考上面流程 3,將公鑰設定至 Deploy Key

  3. 在 Hexo Source Repo 上設定私鑰、密碼

    私鑰 = DEPLOY_KEY_BY_PASSWORD
    密碼 = DEPLOY_KEY_PASSWORD

  4. 調整 GitHub Actions yml檔

    name: Deploy
    
    on: [push]
    
    jobs:
    build:
        runs-on: ubuntu-latest
        name: Deploy Hexo Blog
        steps:
        - name: Checkout
        uses: actions/checkout@v1
        
        - name: Cache node modules
        uses: actions/cache@v2
        id: cache
        with:
            path: node_modules
            key: ${{ runner.OS }}-npm-cache
            restore-keys: |
            ${{ runner.OS }}-npm-cache
            
        - name: Install Dependencies
        run: npm install
    
        - name: Deploy
        run: |
            mkdir -p ~/.ssh/
    -       echo "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_rsa
    -       chmod 600 ~/.ssh/id_rsa
    +       echo 'echo "${{ secrets.DEPLOY_KEY_PASSWORD }}"' > ~/.ssh/.ssh_password
    +       chmod +x ~/.ssh/.ssh_password
    +       eval $(ssh-agent -s)
    +       echo "${{ secrets.DEPLOY_KEY_BY_PASSWORD }}" | tr -d '\r' | DISPLAY=None SSH_ASKPASS=~/.ssh/.ssh_password setsid ssh-add - > /dev/null
            ssh-keyscan github.com >> ~/.ssh/known_hosts
            
            git config --global user.name "w4560000"
            git config --global user.email "39783609+w4560000@users.noreply.github.com"
            
            npm run hd
            
        - name: Get the output
        run: |
            echo "${{ steps.deploy.outputs.notify }}"
    

參考連結

Jerry Yang’s Blog - Hexo + GitHub Actions 部屬網站遷移全紀錄
ithelp - (27) 試著學 Hexo - 奇淫技巧 - 自動化部屬(GitHub Actions)
GitHub - ssh-agent
StackOverflow - Switching between multiple ssh keys in Git on Windows
StackOverflow - How to send passphrase for ssh-add with GitHub Actions?
StackOverflow - How to run an ansible-playbook with a passphrase-protected-ssh-private-key?
webfactory - Using a SSH deploy key in GitHub Actions to access private repositories
Pablo Daniel González - GitLab CI — SSH with Passphrase deploy example


轉載請註明來源,若有任何錯誤或表達不清楚的地方,歡迎在下方評論區留言,也可以來信至 leozheng0621@gmail.com
如果文章對您有幫助,歡迎斗內(donate),請我喝杯咖啡

斗內💰

×

歡迎斗內

github