首先说下场景,最近又捣鼓升级了一下Git个人网站的vuepress版本,弄完之后就想在提交代码的时候把构建的资源再提交到一个新的Git仓库;

以前都是手动执行打包部署的node脚本,发布构建的资源到指定分支,最后用action自动更新,这次就想再简化一下流程,提交代码的时候直接就执行这些操作。

The initial version

因为平时项目里面也用到了husky,就先想着我再加一个hooks的监听执行命令就ok了,

.husky文件夹里创建一个pre-push文件,

#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"
npm run publish # 执行package.json里面的打包命令;
# "publish": "node publish",用node执行publish.js,在publish.js中执行shell文件

最终就是运行这个shell文件的内容


#!/usr/bin/env sh

# 确保脚本抛出遇到的错误
set -e

# 生成静态文件
npm run build

# 进入生成的文件夹
cd .vuepress/dist

git init
git add -A
git commit -m 'deploy'

# 如果发布到 https://<USERNAME>.github.io/<REPO>
git push -f 需要提交的git仓库ssh路径 master:gh-pages

cd - 

做完上面这些,想要的效果也能达到了,但是因为整个构建的过程是在本地执行,就非常的耗时,

可以想象一下,每次push代码,就要弹出来一个运行任务的黑色窗口,执行完了之后才能完成整个push操作,

Final version

之前是GitHub和Gitee都整了个GitPage,最近Gitee那边的挂了一直没好,直接就all in Github了,

1. 生成SSH密钥

因为使用提交代码的SSH密钥会提示重复,所以这还得再重新生成,执行下面的命令,

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

执行之后会提示你输入文件保存路径和文件名。我设置的名字是id_rsa_github_action,所以密钥对会保存在 ~/.ssh/id_rsa_github_action(私钥)和 ~/.ssh/id_rsa_github_action.pub(公钥),

2. 目标仓库添加公钥

打开id_rsa_github_action.pub文件,复制公钥内容,

进入目标Git仓库的GitHub页面,转到"Settings" -> "Deploy keys"。

点击"Add deploy key"按钮,粘贴公钥,并勾选"Allow write access"。

3. 源仓库添加私钥

打开id_rsa_github_action文件,复制私钥,

进入源代码仓库的GitHub页面,转到"Settings" -> "Secrets and variables" -> "Actions"。

点击"New repository secret"按钮,创建一个名为SSH_PRIVATE_KEY密钥,并将私钥内容粘贴进去。

4. 配置GitHub Actions工作流

创建.github/workflows/deploy.yml文件,添加下面内容:

name: Deploy VuePress Site

on:
  push:
    branches:
      - main  # 监听触发部署的分支

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
      
    - name: Set up Node.js
      uses: actions/setup-node@v2
      with:
        node-version: '20'  # 指定Node版本

    - name: Install dependencies
      run: npm install

    - name: Build VuePress site
      run: npm run build  # 构建

    - name: Deploy to another Git repository
      env:
        DEPLOY_REPO: git@github.com:yourusername/yournewrepo.git  # 替换为你的目标仓库地址
        DEPLOY_BRANCH: gh-pages  # 目标仓库分支
        SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}

      run: |
        mkdir -p ~/.ssh
        echo "${SSH_PRIVATE_KEY}" > ~/.ssh/id_rsa
        chmod 600 ~/.ssh/id_rsa
        ssh-keyscan github.com >> ~/.ssh/known_hosts
        git config --global user.name "github-actions[bot]"
        git config --global user.email "github-actions[bot]@users.noreply.github.com"
        cd .vuepress/dist  # 源仓库需要提交出去的代码文件夹
        git init
        git remote add origin $DEPLOY_REPO
        git checkout -b $DEPLOY_BRANCH
        git add .
        git commit -m "Deploy VuePress site"
        git push --force origin $DEPLOY_BRANCH

现在就可以在源仓库设置的分支中提交代码了,actions在监听到提交之后就自动运行工作流,

总结

还踩了挺多坑的,开始不知道是要设置Deploy keys,设置了半天的secret,各种私钥密钥的尝试,一直都是报错没有权限,提示Error: The deploy step encountered an error: The process '/usr/bin/git' failed with exit code 128,

最终的效果就是,在提交源仓库代码的时候,会触发Git Actions执行打包操作,完成之后会提交代码到目标仓库,目标仓库触发Git Actions更新Git Page。


稀饭52
20 声望4 粉丝

愿将来的你不会讨厌现在的自己