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

前言

写这篇文章的初衷是昨天晚上记录一下我从gitee迁移到codeup的一系列过程,其中最后一步涉及到了github与codeup代码的双向同步,所以记录趁热记录一下我的github action如何使用。

More Hub Mirror Action

我给这个github action起名叫做More Hub Mirror Action,代表它能在多个hub托管平台之上相互同步代码,主要用来做代码备份以及开源镜像同步。

我的介绍大概是这样写的:

一个用于在hub间(例如Github,Gitee、Coding,不局限,可以是所有)账户代码仓库同步的action,这个项目脱胎于Yikun/hub-mirror-action@master。

  1. 由于我是想要一个纯粹的不同的hub之间 同步的脚本,所以将该脚本进行了删减,不是作者做的不好,只是我仅仅需要简单的功能罢了

  2. 目前只支持,也只会支持两个仓库必须在两个hub之间存在的情况,不再创建新的仓库(由于创建仓库需要api支持,但是为了更通用,所以决定不支持对应的功能)

  3. 根据能量守恒定律,失去些什么,必然能得到些什么,这样就可以在不同的hub之间同步数据,不管是 从 github->gitee 还是 gitee-github 都可以支持到

  4. src、dst 都需要写全路径了,例如:github.com/kunpengcompute

  5. static_list 是必传参数,因为不会再动态获取对应的repos了

  6. dst_key 也是必传参数,因为为了安全考虑,我决定全部使用ssh的方式进行同步,如果后期有需要,可以兼容https

怎么用

同步过程主要分为两步:

  1. 使用定时任务同步或者使用github的webhook触发同步
  2. 配置好对应的项目,然后让github action跑起来即可。

创建一个单独仓库,专门用来跑github action

创建好对应的github action,有两个,可以使用同一个action进行操作,我创建的仓库名是:github-sync,下面我都以该仓库名作为github action的webhook进行请求。

先要做几个准备:

  1. 创建一个ssh密钥,在github和你创建的仓库都进行配置,不会创建ssh密钥的话参考文档即可。
  2. 创建一个github的token它的作用主要是给你的webhook做安全验证的,点击创建token。

该仓库下的github 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# This is a basic workflow to help you get started with Actions

name: signle_repo_codeup2github

# Controls when the workflow will run
on:
#定时任务自动触发(最好和webhook的拆分为两个)
#schedule:
# - cron: 0 */12 * * *
#使用github的webhook触发
repository_dispatch:
types:
- codeup_push

#手动触发
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.GIT_PRIVATE_KEY }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false

- name: sync codeup repo to github repo
uses: dislazy/hub-mirror-action@v2.0.0
if: env.dst_key
with:
# 必选,需要同步的 git 用户(源)
src: 'codeup.aliyun.com/dislazy'
# 必选,需要同步到的 git 用户(目的)
dst: 'github.com/dislazy'
# 必选,公钥对应的私钥,https://gitee.com/profile/sshkeys
dst_key: ${{ secrets.GIT_PRIVATE_KEY }}
#必选,同步的仓库列表,多个用,分开即可
static_list: ${{ github.event.client_payload.repo }}
#启用git push -f强制同步,注意:开启后,会强制覆盖目的端仓库。
force_update: true
#配置cache
cache_path: /codeup/workspace

简单说明:

  • codeup_push,这个是webhook和github约定好的event,填已有的即可

  • secrets.GIT_PRIVATE_KEY 这个是上面提到的ssh密钥,及时放在github的secrets中

  • srcdst使用除了https之外的个人路径全路径,src和dst可以随便填你想要同步的两个hub,甚至可以不是github(身在曹营心在汉的即视感)

  • github.event.client_payload.repo 这个是你在webhook中提到的你要同步的仓库

在任意处创建对应的webhook请求github api同步仓库

1
curl -X POST -H 'Accept: application/vnd.github.v3+json' -H 'Authorization: token ${github-token}' https://api.github.com/repos/dislazy/github-sync/dispatches -d '{"event_type":"codeup_push","client_payload":{"repo":"${repos_name}","message":"github action sync"}}'

简单说明:

  • github-token 替换为你准备工作中创建的github token
  • repos_name 你需要同步的仓库列表,多个用,分隔开即可
  • event_type 就是上面约定的event密钥,保持一致即可

总结

我目前使用以上的脚本基本上分为两个大块:

  1. 使用定时任务执行github api,用来同步一些固定需要同步的仓库,如果仓库新增了直接改webhook的请求参数即可
  2. 当codeup提交代码的时候使用对应的flow工作流触发github api请求,异步完成github 同步请求

开源的工具有很多,大多数都是为不同的需求不同的人群定制的,如果找不到合适的,如果有能力改一改也是极好的。

评论