抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

前段时间对github同步到gitee并且实现自动化devops写了一篇简单版的文章,后期也遇到了很多问题,这篇文章主要解决遇到的痛点。

痛点

  1. 仓库数量多的情况下每个都需要配置,十分繁琐。
  2. 如果统一配置在一个github action中时单个仓库提交无法被感知。
  3. github的私有仓库如果gitee没有则会被原来的github action创建为公有仓库,隐私信息容易被泄露。

解决方案

遇到问题是正常的,我们需要思考如何去解决问题,也需要针对具体的问题去解决问题,如果可以一劳永逸当然是最好的,然而大多数情况下不能,只能一步一步的探索。

Q3解决方案

先从问题3开始解决,只需要去查看对应的api文档,看看有没有对应参数,查看了文档之后发现有,然后去分析对应的github action的代码然后fork到自己的账户下面,去改动对应的代码即可,我这边已经改动完了,提交到PR但是因为理念原因目前没有被merge,可以直接上github查看我的fix。

Q1和Q2解决方案

多个仓库配置和单个仓库配置其实是冲突但是又不冲突的,可以分开来实现,创建一个新的github仓库,然后专门来做这件事,这样就不用一个一个去进行繁琐的配置了。

  1. 针对多个仓库的同步,这种同步实际上不需要实时,定时同步即可,这样可以用一个github action task去实现即可,以下是对应的解决方案代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    # 定时同步多个仓库

    name: github2gitee

    # Controls when the workflow will run
    on:
    # Triggers the workflow on push or pull request events but only for the main branch
    push:
    # branches: [ main ] 注释代表全部分支、
    schedule:
    - cron: 0 */12 * * *

    # Allows you to run this workflow manually from the Actions tab
    workflow_dispatch:

    # A workflow run is made up of one or more jobs that can run sequentially or in parallel
    jobs:
    repo-sync:
    env:
    dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
    dst_token: ${{ secrets.GITEE_TOKEN }}
    gitee_user: ${{ secrets.GITEE_USER }}
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    with:
    persist-credentials: false

    - name: Get Time
    id: get-time
    run: |
    echo "::set-output name=date::$(/bin/date -u "+%Y%m%d%H%M%S")"
    shell: bash

    - name: Cache src repos
    uses: actions/cache@v1
    id: cache
    with:
    path: ${{ github.workspace }}/github-cache
    key: ${{ runner.os }}-hub-repos-cache-${{ steps.get-time.outputs.date }}
    restore-keys: ${{ runner.os }}-hub-repos-cache

    - name: sync github -> gitee
    uses: dislazy/hub-mirror-action@master
    if: env.dst_key && env.dst_token && env.gitee_user
    with:
    # 必选,需要同步的 Github 用户(源)
    src: 'github/${{ github.repository_owner }}'
    # 必选,需要同步到的 Gitee 用户(目的)
    dst: 'gitee/${{ secrets.GITEE_USER }}'
    # 必选,Gitee公钥对应的私钥,https://gitee.com/profile/sshkeys
    dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
    # 必选,Gitee对应的用于创建仓库的token,https://gitee.com/profile/personal_access_tokens
    dst_token: ${{ secrets.GITEE_TOKEN }}
    # 如果是组织,指定组织即可,默认为用户 user
    account_type: user
    # 需要同步的仓库列表
    static_list: "repo-a,repo-b,repo-c"
    #启用git push -f强制同步,注意:开启后,会强制覆盖目的端仓库。
    clone_style: ssh
    #默认为https,可以设置为ssh或者https。当设置为ssh时,你需要将dst_key所对应的公钥同时配置到源端和目的端
    force_update: true
    #配置cache
    cache_path: ${{ github.workspace }}/github-cache
    #默认创建仓库为私有仓库
    dst_private: true
    - name: Print cache path
    run: |
    ls -la ${{ github.workspace }}/github-cache
  2. 针对单个仓库,因为需要进行及时进行后续的devops流程,所以针对它需要在push完之后进行同步。

我们去调研一下github的github action文档之后发现可以直接进行webhook触发,这个就可以直接帮助我们实现对应的实时同步过程。

可以先行查看对应的 文档

此时分为两步走,在此之前先创建一个github的token,点击 申请一个 token,配置repos的所有权限即可,后面会用到。

  • 在上面的仓库里再创建一个单仓库的action,只不过这个触发方式是webhook事件(github_push这个自定义事件)触发此时同步的是github.event.client_payload.repo 这个参数的对应的仓库,它由wenhook传递过来,见代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# This is a basic workflow to help you get started with Actions

name: signle_repo_github2gitee

# Controls when the workflow will run
on:
repository_dispatch:
types:
- github_push

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
repo-sync:
env:
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
gitee_user: ${{ secrets.GITEE_USER }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false

- name: sync github -> gitee
uses: Yikun/hub-mirror-action@master
if: env.dst_key && env.dst_token && env.gitee_user
with:
# 必选,需要同步的 Github 用户(源)
src: 'github/${{ github.repository_owner }}'
# 必选,需要同步到的 Gitee 用户(目的)
dst: 'gitee/${{ secrets.GITEE_USER }}'
# 必选,Gitee公钥对应的私钥,https://gitee.com/profile/sshkeys
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
# 必选,Gitee对应的用于创建仓库的token,https://gitee.com/profile/personal_access_tokens
dst_token: ${{ secrets.GITEE_TOKEN }}
# 如果是组织,指定组织即可,默认为用户 user
account_type: user
# 直接取当前项目的仓库名
static_list: ${{ github.event.client_payload.repo }}
#启用git push -f强制同步,注意:开启后,会强制覆盖目的端仓库。
clone_style: ssh
#默认为https,可以设置为ssh或者https。当设置为ssh时,你需要将dst_key所对应的公钥同时配置到源端和目的端
force_update: true
#配置cache
cache_path: /github/workspace/${{ github.event.client_payload.repo }}
  • 你需要同步的仓库内创建一个webhook对应的action,如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# This is a basic workflow to help you get started with Actions

name: webhook

# Controls when the workflow will run
on:
# 注释代表所有分支
push:
# branches: [ main ]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3

# Runs a set of commands using the runners shell
- name: Run a multi-line script
run: |
curl \
-X POST \
-H "Accept: application/vnd.github.v3+json" \
-H "Authorization: token {{githubToken}}" \
https://api.github.com/repos/:owner/:repo/dispatches \
-d '{"event_type":"github_push","client_payload":{"repo":"${{ github.event.repository.name }}","message":"github action sync"}}'
echo 'success'

其中,owner 是你的用户名,替换即可,repo 是你上面创建仓库的仓库名, githubToken 是上面申请的 Token 凭证,前面的token单词要保留githubToken存到仓库的secrets中,然后将,event_type 是自定义的事件名字,client_payload是一个对象,它可以传递你需要传递的参数,我上面就传递了repo这个参数。

然后提交代码到对应仓库,查看webhook是否发送成功,再校验webhook触发的task是否执行成功即可。

结果

通过以上方案解决了多个仓库配置不便和单个仓库繁琐配置的问题,还有隐私安全的问题,大大节省了配置的时间和你花费的精力,如果针对上面的方案有疑问,欢迎与我多多交流。

评论