前段时间对github同步到gitee并且实现自动化devops写了一篇简单版的文章,后期也遇到了很多问题,这篇文章主要解决遇到的痛点。
痛点
- 仓库数量多的情况下每个都需要配置,十分繁琐。
- 如果统一配置在一个github action中时单个仓库提交无法被感知。
- github的私有仓库如果gitee没有则会被原来的github action创建为公有仓库,隐私信息容易被泄露。
解决方案
遇到问题是正常的,我们需要思考如何去解决问题,也需要针对具体的问题去解决问题,如果可以一劳永逸当然是最好的,然而大多数情况下不能,只能一步一步的探索。
Q3解决方案
先从问题3开始解决,只需要去查看对应的api文档,看看有没有对应参数,查看了文档之后发现有,然后去分析对应的github action的代码然后fork到自己的账户下面,去改动对应的代码即可,我这边已经改动完了,提交到PR但是因为理念原因目前没有被merge,可以直接上github查看我的fix。
Q1和Q2解决方案
多个仓库配置和单个仓库配置其实是冲突但是又不冲突的,可以分开来实现,创建一个新的github仓库,然后专门来做这件事,这样就不用一个一个去进行繁琐的配置了。
针对多个仓库的同步,这种同步实际上不需要实时,定时同步即可,这样可以用一个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针对单个仓库,因为需要进行及时进行后续的devops流程,所以针对它需要在push完之后进行同步。
我们去调研一下github的github action文档之后发现可以直接进行webhook触发,这个就可以直接帮助我们实现对应的实时同步过程。
可以先行查看对应的 文档。
此时分为两步走,在此之前先创建一个github的token,点击 申请一个 token,配置repos
的所有权限即可,后面会用到。
- 在上面的仓库里再创建一个单仓库的action,只不过这个触发方式是webhook事件(github_push这个自定义事件)触发此时同步的是
github.event.client_payload.repo
这个参数的对应的仓库,它由wenhook传递过来,见代码:
1 | # This is a basic workflow to help you get started with Actions |
- 在你需要同步的仓库内创建一个webhook对应的action,如下:
1 | # This is a basic workflow to help you get started with Actions |
其中,owner 是你的用户名,替换即可,repo 是你上面创建仓库的仓库名, githubToken 是上面申请的 Token 凭证,前面的token
单词要保留githubToken存到仓库的secrets中,然后将,event_type 是自定义的事件名字,client_payload是一个对象,它可以传递你需要传递的参数,我上面就传递了repo这个参数。
然后提交代码到对应仓库,查看webhook是否发送成功,再校验webhook触发的task是否执行成功即可。
结果
通过以上方案解决了多个仓库配置不便和单个仓库繁琐配置的问题,还有隐私安全的问题,大大节省了配置的时间和你花费的精力,如果针对上面的方案有疑问,欢迎与我多多交流。