飞天猪猪侠 發表於 2021-7-13 23:51:00

利用Github Action实现Github到Gitee的持续同步

<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>1、什么是Github Action</li><li>2、github和gitee同步</li><li>3、选用或编写action</li><li>4、语法示例</li><li>5、准备工作<ul><li>5.1 设置dst_key</li><li>5.2 设置dst_token</li></ul></li><li>6、github同步到gitee</li><li>7、小结</li></ul></div><p></p>
<p><img src="https://image.ssgeek.com/20210714-01.png" alt="" loading="lazy"></p>
<h2 id="1什么是github-action">1、什么是Github Action</h2>
<p><code>github action</code>是<code>github</code>推出的自动化<code>CI/CD</code>的功能,随着<code>2019</code>年<code>11</code>月后<code>github</code>对该功能的全面开放,现在所有的<code>github</code>用户可以直接使用该功能</p>
<p><code>github action</code>的语法类似于<code>gitlab ci</code>,与之相比,还有更多优势,例如:</p>
<ul>
<li><code>action</code>对<code>github</code>各个事件的支持更为全面,如<code>release</code>、<code>pull-request</code>、<code>issue</code>事件等等</li>
<li><code>action</code>支持直接使用别人编写好的<code>action</code></li>
<li><code>action</code>的执行器类似于<code>gitlab runner</code>,可以使用<code>github</code>托管的执行器,也可以托管自己的执行器。甚至在<code>action</code>运行的时候,还可以通过某些特殊技巧进入到执行器里面,相当于一台临时的服务器供我们使用</li>
</ul>
<h2 id="2github和gitee同步">2、github和gitee同步</h2>
<p><code>github</code>的服务器在国外,因为某些原因,在大多数的网络环境下都是无法顺畅访问的</p>
<p><code>gitee</code>的服务器在国内,由国内公司运营</p>
<p>纵使如此,大多数开发者还是习惯使用<code>github</code>(远在海外,也要想尽各种办法)</p>
<p>那么为什么需要把<code>github</code>和<code>gitee</code>的仓库进行同步呢?原因不言而喻</p>
<p>目前可用的进行同步的方法可能有:</p>
<ul>
<li>利用<code>gitee</code>官方的同步(导入<code>github</code>项目),这种方法只能一次性导入</li>
<li>本地同时关联<code>gitee</code>和<code>github</code>,提交时都<code>push</code>一份,这种方法纯属手动</li>
<li>利用<code>github action</code></li>
</ul>
<p>下面介绍利用<code>github action</code>如何实现<code>github</code>到<code>gitee</code>的持续同步</p>
<h2 id="3选用或编写action">3、选用或编写action</h2>
<p>实现<code>github</code>和<code>gitee</code>同步的思路主要是基于我们的账户调用<code>github</code>和<code>gitee</code>各自的<code>api</code>接口和密钥通信,在执行器内拉取并推送代码库到<code>gitee</code></p>
<p><code>action</code>的编写语法和<code>gitlab ci</code>很相似,同时<code>github</code>还推出了官方的<code>action</code>市场,地址为 https://github.com/marketplace</p>
<p>这里我们使用的<code>action</code>是Yikun/hub-mirror-action</p>
<h2 id="4语法示例">4、语法示例</h2>
<p>上述<code>action</code>,支持较为全面。参照说明,相关不同场景下的语法如下:</p>
<ul>
<li>组织同步</li>
</ul>
<p>同步<code>Github</code>的组织到<code>Gitee</code></p>
<pre><code class="language-yaml">- 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

</code></pre>
<ul>
<li>黑/白名单</li>
</ul>
<p>动态获取源端<code>github</code>的<code>repos</code>,但仅同步名为<code>hub-mirror-action</code>,不同步<code>hashes</code>这个<code>repo</code>到<code>Gittee</code></p>
<pre><code class="language-yaml">- 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"
</code></pre>
<ul>
<li>静态名单(可用于单一仓库同步)</li>
</ul>
<p>不会动态获取源端<code>github</code>的<code>repos</code>,仅同步<code>hub-mirror-action</code>这个<code>repo</code></p>
<pre><code class="language-yaml">- 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"
</code></pre>
<ul>
<li>使用ssh方式进行clone</li>
</ul>
<pre><code class="language-yaml">- 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"
</code></pre>
<ul>
<li>强制更新,并打开debug日志开关</li>
</ul>
<pre><code class="language-yaml">- 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
</code></pre>
<ul>
<li>设置命令行超时时间为1小时</li>
</ul>
<pre><code class="language-yaml">- 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'
</code></pre>
<h2 id="5准备工作">5、准备工作</h2>
<h3 id="51-设置dst_key">5.1 设置dst_key</h3>
<p>在<code>github</code>上打开一个自己的仓库(可以是一个已有的仓库,也可以是用来专门存放<code>action</code>的仓库),这里以我的个人公开仓库为例</p>
<p>首先在本地生成一个<code>ssh</code>密钥对</p>
<pre><code class="language-shell"># 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:
+-------+
|   . .   o+o o++*|
|. + . .+ooo+E|
| o . + .o *.+|
|o o . .o = o o |
|.+   .S . + + .|
|. . . .. +.. ..|
|   .   .o....o.|
|          .. .+ +|
|             o...|
+---------+
</code></pre>
<p>在<code>github</code>打开<code>settings</code>—&gt;<code>secrets</code>,新建一个<code>secret</code>,名为<code>GITEE_PRIVATE_KEY</code>,值为上面生成的密钥对的私钥</p>
<p><img src="https://image.ssgeek.com/20210714-02.png" alt="" loading="lazy"></p>
<p>然后登录到<code>gitee</code>,在个人设置—&gt;安全设置—&gt;<code>SSH</code>公钥中添加上面生成的密钥对的公钥,命名随意</p>
<p><img src="https://image.ssgeek.com/20210714-03.png" alt="" loading="lazy"></p>
<h3 id="52-设置dst_token">5.2 设置dst_token</h3>
<p>在<code>gitee</code>打开个人设置—&gt;安全设置—&gt;私人令牌,新建一个私人令牌,命名随意,复制生成的令牌值</p>
<p><img src="https://image.ssgeek.com/20210714-04.png" alt="" loading="lazy"></p>
<p>在<code>github</code>打开<code>settings</code>—&gt;<code>secrets</code>,新建一个<code>secret</code>,名为<code>GITEE_TOKEN</code>,值为上面复制的令牌值</p>
<p><img src="https://image.ssgeek.com/20210714-05.png" alt="" loading="lazy"></p>
<h2 id="6github同步到gitee">6、github同步到gitee</h2>
<p>在刚才的<code>GitHub</code>仓库中,新建 <code>.github/workflows/SyncToGitee.yml</code> 文件,其中<code>.github/workflows/</code>是固定的目录名</p>
<p>内容如下</p>
<pre><code class="language-yaml">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操作
</code></pre>
<p>相关语法说明:</p>
<ul>
<li>on</li>
</ul>
<p>指定<code>action</code>的触发条件,一般有:使用web事件触发工作流,并且可以具体指定<code>branches</code>,<code>tags</code>以及文件路径;使用<code>cron</code>语法指定时间触发工作流</p>
<ul>
<li>job</li>
</ul>
<p>指定相应的任务,每一个<code>step</code>是一个步骤,<code>step</code>是<code>job</code>的最小单元,所有<code>step</code>配置在<code>steps</code>中</p>
<p>其中<code>uses</code>用于使用其他用户所发布的<code>action</code></p>
<p>其他的内容这里不再赘述,更多内容可以参考官方语法说明 github action doc</p>
<p>提交该<code>action</code>,观察<code>github</code>上的执行视图</p>
<p><img src="https://image.ssgeek.com/20210714-06.png" alt="" loading="lazy"></p>
<p>此时打开<code>gitee</code>,就会发现自动创建了同名称的仓库且自动提交了同样的代码</p>
<p>分析<code>action</code>的执行日志,主要如下</p>
<pre><code class="language-shell">...
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
</code></pre>
<p>大致流程:执行器运行起来后,自动检出了该仓库,然后判断目标仓库是否存在,不存在则先创建,存在则直接执行强制推送</p>
<p>后面每一次提交代码或对仓库做变更都可以按照触发条件触发<code>action</code>的执行了</p>
<p><img src="https://image.ssgeek.com/20210714-07.png" alt="" loading="lazy"></p>
<h2 id="7小结">7、小结</h2>
<p>到这里,利用<code>github action</code>将<code>github</code>仓库的代码实时同步到<code>gitee</code>就完成了,个人认为<code>github action</code>比<code>gitlabci</code>更为强大且有更多高阶玩法,但企业内部一般还都是私有仓库,因此对个人来说还是很实用的</p>
<p>See you ~</p><br><br>
来源:https://www.cnblogs.com/ssgeek/p/15009012.html
頁: [1]
查看完整版本: 利用Github Action实现Github到Gitee的持续同步