利用Github Action實現(xiàn)Github到Gitee的持續(xù)同步
目錄
1、什么是 Github Action
2、github 和 gitee 同步
3、選用或編寫 action
4、語法示例
5、準(zhǔn)備工作
5.1 設(shè)置 dst_key
5.2 設(shè)置 dst_token
6、github 同步到 gitee
7、小結(jié)

1、什么是 Github Action
github action是github推出的自動化CI/CD的功能,隨著2019年11月后github對該功能的全面開放,現(xiàn)在所有的github用戶可以直接使用該功能
github action的語法類似于gitlab ci,與之相比,還有更多優(yōu)勢,例如:
action對github各個事件的支持更為全面,如release、pull-request、issue事件等等action支持直接使用別人編寫好的actionaction的執(zhí)行器類似于gitlab runner,可以使用github托管的執(zhí)行器,也可以托管自己的執(zhí)行器。甚至在action運行的時候,還可以通過某些特殊技巧進(jìn)入到執(zhí)行器里面,相當(dāng)于一臺臨時的服務(wù)器供我們使用
2、github 和 gitee 同步
github的服務(wù)器在國外,因為某些原因,在大多數(shù)的網(wǎng)絡(luò)環(huán)境下都是無法順暢訪問的
gitee的服務(wù)器在國內(nèi),由國內(nèi)公司運營
縱使如此,大多數(shù)開發(fā)者還是習(xí)慣使用github(遠(yuǎn)在海外,也要想盡各種辦法)
那么為什么需要把github和gitee的倉庫進(jìn)行同步呢?原因不言而喻
目前可用的進(jìn)行同步的方法可能有:
利用 gitee官方的同步(導(dǎo)入github項目),這種方法只能一次性導(dǎo)入本地同時關(guān)聯(lián) gitee和github,提交時都push一份,這種方法純屬手動利用 github action
下面介紹利用github action如何實現(xiàn)github到gitee的持續(xù)同步
3、選用或編寫 action
實現(xiàn)github和gitee同步的思路主要是基于我們的賬戶調(diào)用github和gitee各自的api接口和密鑰通信,在執(zhí)行器內(nèi)拉取并推送代碼庫到gitee
action的編寫語法和gitlab ci很相似,同時github還推出了官方的action市場,地址為 https://github.com/marketplace
這里我們使用的action是Yikun/hub-mirror-action[1]
4、語法示例
上述action,支持較為全面。參照說明,相關(guān)不同場景下的語法如下:
組織同步
同步Github的組織到Gitee
- name: Organization mirror
uses: Yikun/hub-mirror-action@master
with:
src: github/kunpengcompute
dst: gitee/kunpengcompute
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
account_type: org
黑/白名單
動態(tài)獲取源端github的repos,但僅同步名為hub-mirror-action,不同步hashes這個repo到Gittee
- name: Single repo mirror
uses: Yikun/hub-mirror-action@master
with:
src: github/Yikun
dst: gitee/yikunkero
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
white_list: "hub-mirror-action"
black_list: "hashes"
靜態(tài)名單(可用于單一倉庫同步)
不會動態(tài)獲取源端github的repos,僅同步hub-mirror-action這個repo
- name: Black list
uses: Yikun/hub-mirror-action@master
with:
src: github/Yikun
dst: gitee/yikunkero
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
static_list: "hub-mirror-action"
使用 ssh 方式進(jìn)行 clone
- name: ssh clone style
uses: Yikun/hub-mirror-action@master
with:
src: github/Yikun
dst: gitee/yikunkero
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
clone_style: "ssh"
強制更新,并打開 debug 日志開關(guān)
- name: Mirror with force push (git push -f)
uses: Yikun/hub-mirror-action@master
with:
src: github/Yikun
dst: gitee/yikunkero
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
force_update: true
debug: true
設(shè)置命令行超時時間為 1 小時
- name: Mirror with force push (git push -f)
uses: Yikun/hub-mirror-action@master
with:
src: github/Yikun
dst: gitee/yikunkero
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
force_update: true
timeout: '1h'
5、準(zhǔn)備工作
5.1 設(shè)置 dst_key
在github上打開一個自己的倉庫(可以是一個已有的倉庫,也可以是用來專門存放action的倉庫),這里以我的個人公開倉庫為例
首先在本地生成一個ssh密鑰對
# ssh-keygen -t rsa -f ~/Documents/ssh-key/id_rsa
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/ssgeek/Documents/Document/ssh-key/id_rsa.
Your public key has been saved in /Users/ssgeek/Documents/Document/ssh-key/id_rsa.pub.
The key fingerprint is:
SHA256:eUf8KzgFFoTikDoo1at9/fVpftcUWkWgTgPNbWTVOdM [email protected]
The key's randomart image is:
+---[RSA 3072]----+
| . . o+o o++*|
| . + . . +ooo+E|
| o . + . o *. +|
|o o . . o = o o |
|. + .S . + + .|
| . . . .. +.. ..|
| . .o....o.|
| .. .+ +|
| o...|
+----[SHA256]-----+
在github打開settings—>secrets,新建一個secret,名為GITEE_PRIVATE_KEY,值為上面生成的密鑰對的私鑰

然后登錄到gitee,在個人設(shè)置—>安全設(shè)置—>SSH公鑰中添加上面生成的密鑰對的公鑰,命名隨意

5.2 設(shè)置 dst_token
在gitee打開個人設(shè)置—>安全設(shè)置—>私人令牌,新建一個私人令牌,命名隨意,復(fù)制生成的令牌值

在github打開settings—>secrets,新建一個secret,名為GITEE_TOKEN,值為上面復(fù)制的令牌值

6、github 同步到 gitee
在剛才的GitHub倉庫中,新建 .github/workflows/SyncToGitee.yml 文件,其中.github/workflows/是固定的目錄名
內(nèi)容如下
name: Sync Github Repos To Gitee
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-20.04
steps:
- name: Sync Github Repos To Gitee # 名字隨便起
uses: Yikun/[email protected] # 使用Yikun/hub-mirror-action
with:
src: github/Hargeek # 源端賬戶名(github)
dst: gitee/ssgeek # 目的端賬戶名(gitee)
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} # SSH密鑰對中的私鑰
dst_token: ${{ secrets.GITEE_TOKEN }} # Gitee賬戶的私人令牌
account_type: user # 賬戶類型
clone_style: "https" # 使用https方式進(jìn)行clone,也可以使用ssh
debug: true # 啟用后會顯示所有執(zhí)行命令
force_update: true # 啟用后,強制同步,即強制覆蓋目的端倉庫
static_list: "python-nianbao-struct" # 靜態(tài)同步列表,在此填寫需要同步的倉庫名稱,可填寫多個
timeout: '600s' # git超時設(shè)置,超時后會自動重試git操作
相關(guān)語法說明:
on
指定action的觸發(fā)條件,一般有:使用 web 事件觸發(fā)工作流,并且可以具體指定branches,tags以及文件路徑;使用cron語法指定時間觸發(fā)工作流
job
指定相應(yīng)的任務(wù),每一個step是一個步驟,step是job的最小單元,所有step配置在steps中
其中uses用于使用其他用戶所發(fā)布的action
其他的內(nèi)容這里不再贅述,更多內(nèi)容可以參考官方語法說明 github action doc[2]
提交該action,觀察github上的執(zhí)行視圖

此時打開gitee,就會發(fā)現(xiàn)自動創(chuàng)建了同名稱的倉庫且自動提交了同樣的代碼
分析action的執(zhí)行日志,主要如下
...
Successfully installed GitPython-3.1.13 PyYAML-5.4.1 certifi-2021.5.30 chardet-4.0.0 gitdb-4.0.7 idna-2.10 requests-2.25.1 six-1.16.0 smmap-4.0.0 tenacity-6.3.1 urllib3-1.26.6
+ python3 /hub-mirror/hubmirror.py --src github/Hargeek --dst gitee/ssxr --dst-token *** --account-type user --clone-style https --cache-path /github/workspace/hub-mirror-cache --black-list '' --white-list '' --static-list python-nianbao-struct --force-update true --debug true --timeout 600s
Backup python-nianbao-struct
(1/3) Downloading...
Starting git clone https://github.com/Hargeek/python-nianbao-struct.git
Clone completed: /github/workspace/github/workspace/hub-mirror-cache/python-nianbao-struct
(2/3) Creating...
python-nianbao-struct doesn't exist, create it...
Destination repo creating accepted.
(3/3) Force pushing...
Total: 1, skip: 0, successed: 1, failed: 0.
Failed: []
+ exit 0
Cleaning up orphan processes
大致流程:執(zhí)行器運行起來后,自動檢出了該倉庫,然后判斷目標(biāo)倉庫是否存在,不存在則先創(chuàng)建,存在則直接執(zhí)行強制推送
后面每一次提交代碼或?qū)}庫做變更都可以按照觸發(fā)條件觸發(fā)action的執(zhí)行了

7、小結(jié)
到這里,利用github action將github倉庫的代碼實時同步到gitee就完成了,個人認(rèn)為github action比gitlabci更為強大且有更多高階玩法,但企業(yè)內(nèi)部一般還都是私有倉庫,因此對個人來說還是很實用的
See you ~
參考資料
Yikun/hub-mirror-action: https://github.com/Yikun/hub-mirror-action
[2]github action doc: https://docs.github.com/cn/actions
