<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          利用Github Action實現(xiàn)Github到Gitee的持續(xù)同步

          共 9319字,需瀏覽 19分鐘

           ·

          2021-07-17 16:22

          目錄

          • 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 actiongithub推出的自動化CI/CD的功能,隨著201911月后github對該功能的全面開放,現(xiàn)在所有的github用戶可以直接使用該功能

          github action的語法類似于gitlab ci,與之相比,還有更多優(yōu)勢,例如:

          • actiongithub各個事件的支持更為全面,如releasepull-request、issue事件等等
          • action支持直接使用別人編寫好的action
          • action的執(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)在海外,也要想盡各種辦法)

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

          目前可用的進(jìn)行同步的方法可能有:

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

          下面介紹利用github action如何實現(xiàn)githubgitee的持續(xù)同步

          3、選用或編寫 action

          實現(xiàn)githubgitee同步的思路主要是基于我們的賬戶調(diào)用githubgitee各自的api接口和密鑰通信,在執(zhí)行器內(nèi)拉取并推送代碼庫到gitee

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

          這里我們使用的actionYikun/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)獲取源端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"
          • 靜態(tài)名單(可用于單一倉庫同步)

          不會動態(tài)獲取源端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 方式進(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是一個步驟,stepjob的最小單元,所有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 actiongithub倉庫的代碼實時同步到gitee就完成了,個人認(rèn)為github actiongitlabci更為強大且有更多高階玩法,但企業(yè)內(nèi)部一般還都是私有倉庫,因此對個人來說還是很實用的

          See you ~

          參考資料

          [1]

          Yikun/hub-mirror-action: https://github.com/Yikun/hub-mirror-action

          [2]

          github action doc: https://docs.github.com/cn/actions

          瀏覽 40
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美一区二区视频在线77777 | 青青草在线观看免费 | 欧美色图日韩色图 | 91翔田千里| 天堂中文在线资源的 |