1、什么是Github Action
github action
是github
推出的自動化CI/CD
的功能,隨着2019
年11
月后github
對該功能的全面開放,現在所有的github
用戶可以直接使用該功能
github action
的語法類似於gitlab ci
,與之相比,還有更多優勢,例如:
action
對github
各個事件的支持更為全面,如release
、pull-request
、issue
事件等等action
支持直接使用別人編寫好的action
action
的執行器類似於gitlab runner
,可以使用github
托管的執行器,也可以托管自己的執行器。甚至在action
運行的時候,還可以通過某些特殊技巧進入到執行器里面,相當於一台臨時的服務器供我們使用
2、github和gitee同步
github
的服務器在國外,因為某些原因,在大多數的網絡環境下都是無法順暢訪問的
gitee
的服務器在國內,由國內公司運營
縱使如此,大多數開發者還是習慣使用github
(遠在海外,也要想盡各種辦法)
那么為什么需要把github
和gitee
的倉庫進行同步呢?原因不言而喻
目前可用的進行同步的方法可能有:
- 利用
gitee
官方的同步(導入github
項目),這種方法只能一次性導入 - 本地同時關聯
gitee
和github
,提交時都push
一份,這種方法純屬手動 - 利用
github action
下面介紹利用github action
如何實現github
到gitee
的持續同步
3、選用或編寫action
實現github
和gitee
同步的思路主要是基於我們的賬戶調用github
和gitee
各自的api
接口和密鑰通信,在執行器內拉取並推送代碼庫到gitee
action
的編寫語法和gitlab ci
很相似,同時github
還推出了官方的action
市場,地址為 https://github.com/marketplace
這里我們使用的action
是Yikun/hub-mirror-action
4、語法示例
上述action
,支持較為全面。參照說明,相關不同場景下的語法如下:
- 組織同步
同步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
- 黑/白名單
動態獲取源端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"
- 靜態名單(可用於單一倉庫同步)
不會動態獲取源端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方式進行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日志開關
- 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
- 設置命令行超時時間為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、准備工作
5.1 設置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 ssgeek@honganrongdeMac-mini.local
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
,在個人設置—>安全設置—>SSH
公鑰中添加上面生成的密鑰對的公鑰,命名隨意
5.2 設置dst_token
在gitee
打開個人設置—>安全設置—>私人令牌,新建一個私人令牌,命名隨意,復制生成的令牌值
在github
打開settings
—>secrets
,新建一個secret
,名為GITEE_TOKEN
,值為上面復制的令牌值
6、github同步到gitee
在剛才的GitHub
倉庫中,新建 .github/workflows/SyncToGitee.yml
文件,其中.github/workflows/
是固定的目錄名
內容如下
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/hub-mirror-action@v1.1 # 使用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方式進行clone,也可以使用ssh
debug: true # 啟用后會顯示所有執行命令
force_update: true # 啟用后,強制同步,即強制覆蓋目的端倉庫
static_list: "python-nianbao-struct" # 靜態同步列表,在此填寫需要同步的倉庫名稱,可填寫多個
timeout: '600s' # git超時設置,超時后會自動重試git操作
相關語法說明:
- on
指定action
的觸發條件,一般有:使用web事件觸發工作流,並且可以具體指定branches
,tags
以及文件路徑;使用cron
語法指定時間觸發工作流
- job
指定相應的任務,每一個step
是一個步驟,step
是job
的最小單元,所有step
配置在steps
中
其中uses
用於使用其他用戶所發布的action
其他的內容這里不再贅述,更多內容可以參考官方語法說明 github action doc
提交該action
,觀察github
上的執行視圖
此時打開gitee
,就會發現自動創建了同名稱的倉庫且自動提交了同樣的代碼
分析action
的執行日志,主要如下
...
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
大致流程:執行器運行起來后,自動檢出了該倉庫,然后判斷目標倉庫是否存在,不存在則先創建,存在則直接執行強制推送
后面每一次提交代碼或對倉庫做變更都可以按照觸發條件觸發action
的執行了
7、小結
到這里,利用github action
將github
倉庫的代碼實時同步到gitee
就完成了,個人認為github action
比gitlabci
更為強大且有更多高階玩法,但企業內部一般還都是私有倉庫,因此對個人來說還是很實用的
See you ~