解决 GitHub Actions 同步 Gitee 仓库中遇到的一些问题

解决 GitHub Actions 同步 Gitee 过程中遇到的一些问题

前言

由于一直是在CSDN上更新博客,随着不断学习,想了想应该不应该局限于这一个平台

于是萌生出搭建一个属于自己博客网站的想法,并采用Hugo + Github的技术实现

Hugo工具负责生成静态页面,然后在Github上来部署静态页面,免费搭建出自己的博客

b站上有非常优质的up来手把手搭建博客网站,我这里看的是莱特雷

思路

up实现了GitHub自动部署的功能,但由于结合实际情况,我主要的代码存在Gitee的仓库中,在Github上更新不能在我的码云主页上有完整体现

而用普通的镜像仓库不能做到同步的功能,Gitee导入Github仓库功能本质上是一个一次性克隆的仓库。如果想在Gitee上看到还需要手动同步,非常低效且麻烦

😶‍🌫️所以我想新增一个懒功能:在GitHub更新Hugo博客后,自动同步到Gitee,并点亮Gitee的 "小绿点",同时也是为了解决国内访问速度问题

所以就继续完善莱特雷博主写的GitHub Action,每次 Push 到 GitHub 后,自动推送到 Gitee

技术实现

配置了 GitHub Actions ,利用 SSH 协议 将代码自动同步分发到 Gitee 仓库,实现了 "一次提交,双端自动部署" 的高效工作流,要注意:自动化脚本在配置密钥时都不能生成密码,否则就不能自动执行了

  1. SSH密钥生成

  2. 密钥与 Token 配置,生成后,需要分发到不同平台:

    • GitHub (Settings -> Secrets -> Actions):

      • GITEE_RSA_PRIVATE_KEY: 填入 私钥 (生成的 gitee_id_rsa 文件内容,是以 -----BEGIN RSA PRIVATE KEY----- 开头的格式)
      • GITEE_TOKEN: 填入 Gitee 私人令牌 (在 Gitee 设置 -> 私人令牌中生成,需勾选 projectshook 权限)
    • Gitee (设置 -> SSH 公钥):

      • 填入公钥 (生成的 gitee_id_rsa.pub 文件内容)
  3. 填写配置文件

遇到的坑

坑一:SSH的密钥格式问题

在同步Gitee仓库的时候出现了报错,虽然GitHub上可以完美推送到仓库中

原因:

  1. 由于我是直接使用默认的ssh-keygen​生成密钥,生成的是新版 OpenSSH 格式(以 BEGIN OPENSSH PRIVATE KEY​ 开头),而这个脚本环境比较老,只支持PEM格式的私钥

  2. 配置在 GitHub Secrets 里的私钥格式,GitHub Actions 的环境无法识别,是格式不兼容的问题

解决方法:

  1. 重新生成 PEM 格式密钥,在本地终端执行

    bash 复制代码
    # 在你的本地终端执行(不要在服务器上)
    # 注意:文件名可以改,不要覆盖了你原本的id_rsa
    ssh-keygen -t rsa -b 4096 -C "你的邮箱地址.com" -f ./gitee_id_rsa -m PEM
  2. 更新Github配置(更新私钥)

    • 回到你 GitHub 仓库的 Settings -> Secrets and variables -> Actions
    • 找到 GITEE_RSA_PRIVATE_KEY,更新新的私钥
    • 更新后记得保存
  3. 更新Gitee配置(更新公钥)

    • 打开生成的 gitee_id_rsa.pub (公钥)
    • 去 Gitee -> 设置 -> SSH 公钥
    • 删除之前添加的那个报错的公钥,格式不兼容留着也没有用了
    • 添加这个新的公钥

坑二:仓库名称映射问题

解决了密钥问题后,同步依然失败,我怀疑是同步到了错误的仓库

原因:

由于前期的维护问题,我的Github上的用户名与Gitee上的用户名并不一致,仓库名也有细微区别,这就使得++同步工作变得困难++

解决方法:

经排查,我发现GitHub上博客仓库名是 Jul1en-Lin.github.io​, Gitee 那边在由于创建仓库的时,仓库访问URL路径默认是仓库名的小写形式,是jul1en-lin.github.io,两边名字不一样,导致不能正确同步

在配置文件中static_list​列表正确填写上Gitee是正确的仓库访问路径:jul1en-lin.github.io,问题就解决了~

修改后的配置文件如下,注意要严格对应仓库路径

yaml 复制代码
name: deploy

# 代码提交到main分支时触发github action
on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
        - name: Checkout
          uses: actions/checkout@v4
          with:
              fetch-depth: 0

        - name: Setup Hugo
          uses: peaceiris/actions-hugo@v3
          with:
              hugo-version: "latest"
              extended: true

        - name: Build Web
          run: hugo -D

          # 推送到Github仓库的Jul1en-Lin.github.io 仓库
        - name: Deploy Web
          uses: peaceiris/actions-gh-pages@v4
          with:
			  # 这里是自动化脚本仓库的TOKEN,HUGO_TOKEN是名字,需要自己生成,其他名字也能替换
              PERSONAL_TOKEN: ${{ secrets.HUGO_TOKEN }}
			  # 需要填写你的博客仓库
              EXTERNAL_REPOSITORY: xxxx # 需要自己填写路径
              PUBLISH_BRANCH: main
              PUBLISH_DIR: ./public
              commit_message: auto deploy
              # 关键:为了 Gitee 小绿点,这里必须填你 Gitee 绑定的邮箱和昵称
              # 这样生成的 Commit 会归属到你名下,同步过去才有绿点。
              user_name: '你的Github用户名' 
              user_email: '你的邮箱' # 这里最好两个地方邮箱都同步

        # 同步到 Gitee
        - name: Sync to Gitee
          uses: Yikun/hub-mirror-action@master
          if: always() # 保证即使上面步骤偶尔抽风,这一步也尝试执行
          with:
            #  GitHub 用户名
            src: 你的用户名
            #  Gitee 用户名
            dst: 你的用户名
            # 因格式问题重新配置SSH的私钥(对应 GITEE_RSA_PRIVATE_KEY)
            dst_key: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
			# Gitee 个人访问令牌 (对应 GITEE_TOKEN)
            dst_token: ${{ secrets.GITEE_TOKEN }} # 需要去 Gitee 生成一个私人令牌(Access Token)
            static_list: "xxx" # 这里填你要同步的仓库名,注意路径问题
            force_update: true
            debug: true

总结

  • 了解到 SSH 密钥还会有不同格式的区别,熟悉了 GitHub Actions 的配置,这也是第一次接触GitHub Actions,配置文件也是第一次接触,但是静下心来看还是能看的懂并尝试解决的🤗
  • 遇到报错不要慌,仔细看 Log。培养能仔细查看报错日志是非常重要的,遇到的问题可能千奇百怪,如果能看懂报错日志就可以定位出现问题的原因了,这样以后遇到问题也不会害怕。毕竟 **授人以鱼不如授人以渔~**
  • 第一次接触自动化部署,虽然配置时麻烦,但配好并且解决问题后的感觉真的很爽,满满自豪感!!!!🥳

‍希望这里对你有所帮助,让我们变得更强

相关推荐
_落纸1 小时前
《传感器与检测技术》第 4 章 光电式传感器原理与应用
笔记·自动化
肥仔哥哥19302 小时前
Jenkins+Docker+Harbor全链路CI/CD重温笔记
ci/cd·docker·jenkins
我会一直在的2 小时前
Appium的基础API介绍
python·appium·自动化
每日出拳老爷子2 小时前
[Python自动化] 用 Python + Selenium 做一个“浏览器重复操作录制器”:录一次,自动点一百次(附GUI+源码)
python·selenium·自动化
阿蔹2 小时前
Selenium
软件测试·selenium·测试工具·自动化
月亮!2 小时前
智能合约的安全验证实践
网络·人工智能·python·测试工具·安全·自动化·智能合约
johnny2332 小时前
浏览器自动化:Puppeteer、Playwright、Skyvern、StageHand
自动化
秋刀鱼 ..3 小时前
第二届机器学习、计算智能与模式识别国际学术会议(MLCIPR 2025)
运维·人工智能·python·科技·机器学习·自动化
Zzz 小生3 小时前
Github-Langflow:可视化AI工作流构建平台,让AI应用开发更简单
人工智能·笔记·python·github