利用Github Action實現Github到Gitee的持續同步


1、什么是Github Action

github actiongithub推出的自動化CI/CD的功能,隨着201911月后github對該功能的全面開放,現在所有的github用戶可以直接使用該功能

github action的語法類似於gitlab ci,與之相比,還有更多優勢,例如:

  • actiongithub各個事件的支持更為全面,如releasepull-requestissue事件等等
  • action支持直接使用別人編寫好的action
  • action的執行器類似於gitlab runner,可以使用github托管的執行器,也可以托管自己的執行器。甚至在action運行的時候,還可以通過某些特殊技巧進入到執行器里面,相當於一台臨時的服務器供我們使用

2、github和gitee同步

github的服務器在國外,因為某些原因,在大多數的網絡環境下都是無法順暢訪問的

gitee的服務器在國內,由國內公司運營

縱使如此,大多數開發者還是習慣使用github(遠在海外,也要想盡各種辦法)

那么為什么需要把githubgitee的倉庫進行同步呢?原因不言而喻

目前可用的進行同步的方法可能有:

  • 利用gitee官方的同步(導入github項目),這種方法只能一次性導入
  • 本地同時關聯giteegithub,提交時都push一份,這種方法純屬手動
  • 利用github action

下面介紹利用github action如何實現githubgitee的持續同步

3、選用或編寫action

實現githubgitee同步的思路主要是基於我們的賬戶調用githubgitee各自的api接口和密鑰通信,在執行器內拉取並推送代碼庫到gitee

action的編寫語法和gitlab ci很相似,同時github還推出了官方的action市場,地址為 https://github.com/marketplace

這里我們使用的actionYikun/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

  • 黑/白名單

動態獲取源端githubrepos,但僅同步名為hub-mirror-action,不同步hashes這個repoGittee

- 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"
  • 靜態名單(可用於單一倉庫同步)

不會動態獲取源端githubrepos,僅同步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事件觸發工作流,並且可以具體指定branchestags以及文件路徑;使用cron語法指定時間觸發工作流

  • job

指定相應的任務,每一個step是一個步驟,stepjob的最小單元,所有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 actiongithub倉庫的代碼實時同步到gitee就完成了,個人認為github actiongitlabci更為強大且有更多高階玩法,但企業內部一般還都是私有倉庫,因此對個人來說還是很實用的

See you ~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM