Repository navigation
160 lines (152 loc) · 6.99 KB
/
Copy pathmirror-gitcode.yml
File metadata and controls
160 lines (152 loc) · 6.99 KB
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
name: Mirror to GitCode
# 国内镜像:把已公开的 GitHub Release 同步到 GitCode(设置步骤见 docs/gitcode-mirror.md)。
# - release.yml 的 publish 成功后经 workflow_call 自动调用;
# - 也可手动运行:补镜像某个已公开 tag,或一次性镜像 Kokoro 离线语音包(tts-models)。
# 未配置 secret GITCODE_TOKEN 时所有 job 干净跳过。这里只读 GitHub Release,
# 任何失败都不会撤回、修改或阻止 GitHub Release(它在调用本流程前已公开)。
on:
workflow_call:
inputs:
tag:
description: '已公开的 GitHub Release tag'
type: string
required: true
mirror_tts_models:
description: '同时镜像 tts-models(自动调用时不用)'
type: boolean
required: false
default: false
workflow_dispatch:
inputs:
tag:
description: '补镜像的已公开版本 tag(如 v1.8.0);留空则不镜像版本'
type: string
required: false
default: ''
mirror_tts_models:
description: '同时创建/补全 GitCode Release tts-models(Kokoro 离线语音包)'
type: boolean
required: false
default: false
permissions:
contents: read
env:
GITCODE_REPO: ${{ vars.GITCODE_REPO || 'langgpt/LightRead' }}
jobs:
gate:
runs-on: ubuntu-22.04
outputs:
enabled: ${{ steps.check.outputs.enabled }}
steps:
- name: 检查是否已开通 GitCode 镜像
id: check
env:
GITCODE_TOKEN: ${{ secrets.GITCODE_TOKEN }}
run: |
if [ -z "$GITCODE_TOKEN" ]; then
echo "enabled=false" >> "$GITHUB_OUTPUT"
echo "::notice::未配置 GITCODE_TOKEN,跳过 GitCode 镜像(GitHub Release 不受影响)"
echo "### GitCode 镜像:未开通,已跳过(GitHub Release 不受影响)" >> "$GITHUB_STEP_SUMMARY"
exit 0
fi
[[ "$GITCODE_REPO" =~ ^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$ ]] || { echo "::error::GITCODE_REPO 应为 owner/repo"; exit 1; }
echo "enabled=true" >> "$GITHUB_OUTPUT"
release:
needs: gate
if: ${{ needs.gate.outputs.enabled == 'true' && inputs.tag != '' }}
runs-on: ubuntu-22.04
timeout-minutes: 120
concurrency:
group: gitcode-mirror-${{ inputs.tag }}
cancel-in-progress: false
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
RELEASE_TAG: ${{ inputs.tag }}
steps:
- uses: actions/checkout@v4
with:
# 需要完整历史与 tag,才能把 tag 及其提交推送到 GitCode。
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: 22
- name: 自检镜像脚本
run: node scripts/mirror-gitcode.mjs --self-test
- name: 下载并校验已公开的 GitHub Release
run: |
if [ "$(gh release view "$RELEASE_TAG" --json isDraft --jq .isDraft)" != false ]; then
# 例如对草稿做 Android 修补:草稿不镜像,等公开后再补跑。
echo "::notice::$RELEASE_TAG 尚未公开,跳过 GitCode 镜像"
echo "### GitCode 镜像 $RELEASE_TAG:草稿未公开,已跳过" >> "$GITHUB_STEP_SUMMARY"
echo "MIRROR_SKIP=true" >> "$GITHUB_ENV"
exit 0
fi
mkdir release-assets
gh release download "$RELEASE_TAG" --dir release-assets
(cd release-assets && sha256sum -c SHA256SUMS)
gh release view "$RELEASE_TAG" --json name --jq .name > "$RUNNER_TEMP/release-title.txt"
gh release view "$RELEASE_TAG" --json body --jq .body > "$RUNNER_TEMP/release-notes.md"
git rev-parse --verify "refs/tags/$RELEASE_TAG^{commit}" > "$RUNNER_TEMP/release-commit.txt"
# 仅当它是 GitHub 上的最新正式版时,在 GitCode 也标为 latest(补镜像旧版本不抢 latest)。
LATEST_TAG=$(gh api "repos/$GH_REPO/releases/latest" --jq .tag_name || true)
if [ "$LATEST_TAG" = "$RELEASE_TAG" ]; then echo "LATEST_FLAG=--latest" >> "$GITHUB_ENV"; fi
- name: 同步到 GitCode 并回下载校验
if: ${{ env.MIRROR_SKIP != 'true' }}
env:
GITCODE_TOKEN: ${{ secrets.GITCODE_TOKEN }}
GITCODE_USER: ${{ vars.GITCODE_USER }}
run: |
# shellcheck disable=SC2086 # LATEST_FLAG 为空或单个参数
node scripts/mirror-gitcode.mjs release \
--repo "$GITCODE_REPO" --tag "$RELEASE_TAG" --dir release-assets \
--title "$(cat "$RUNNER_TEMP/release-title.txt")" \
--notes-file "$RUNNER_TEMP/release-notes.md" \
--commit "$(cat "$RUNNER_TEMP/release-commit.txt")" $LATEST_FLAG
- name: 镜像失败说明
if: ${{ failure() }}
run: |
{
echo "### GitCode 镜像 $RELEASE_TAG:失败"
echo
echo "GitHub Release 已公开且未受影响;应用内更新在 GitCode 版本带上 SHA256SUMS 前不会使用该镜像版本。"
echo "排查后在 Actions → Mirror to GitCode 手动运行,tag 填 \`$RELEASE_TAG\`(上传与校验均幂等)。"
} >> "$GITHUB_STEP_SUMMARY"
tts-models:
needs: gate
if: ${{ needs.gate.outputs.enabled == 'true' && inputs.mirror_tts_models }}
runs-on: ubuntu-22.04
timeout-minutes: 90
concurrency:
group: gitcode-mirror-tts-models
cancel-in-progress: false
env:
MODEL_FILE: kokoro-multi-lang-v1_1.tar.bz2
MODEL_URL: https://github.com/k2-fsa/sherpa-onnx/releases/download/tts-models/kokoro-multi-lang-v1_1.tar.bz2
MODEL_SHA256: a3f4c73d043860e3fd2e5b06f36795eb81de0fc8e8de6df703245edddd87dbad
MODEL_SIZE: '364816464'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
- name: 下载并校验 Kokoro 语音包
run: |
mkdir tts-assets
curl --fail --location --retry 5 --retry-all-errors --connect-timeout 30 -o "tts-assets/$MODEL_FILE" "$MODEL_URL"
test "$(stat -c %s "tts-assets/$MODEL_FILE")" = "$MODEL_SIZE" || { echo "::error::$MODEL_FILE 大小不符"; exit 1; }
echo "$MODEL_SHA256 $MODEL_FILE" > tts-assets/SHA256SUMS
(cd tts-assets && sha256sum -c SHA256SUMS)
cat > "$RUNNER_TEMP/tts-notes.md" <<EOF
LightRead 离线听书使用的 Kokoro 多语言语音包,原样镜像自 [k2-fsa/sherpa-onnx tts-models]($MODEL_URL)(Apache-2.0)。
SHA-256: \`$MODEL_SHA256\`($MODEL_SIZE 字节)
EOF
- name: 同步到 GitCode 并回下载校验
env:
GITCODE_TOKEN: ${{ secrets.GITCODE_TOKEN }}
run: |
# 不传 --commit:GitCode 创建 Release 时在默认分支上生成 tts-models tag。
node scripts/mirror-gitcode.mjs release \
--repo "$GITCODE_REPO" --tag tts-models --dir tts-assets \
--title "Kokoro TTS models (mirror of sherpa-onnx tts-models)" \
--notes-file "$RUNNER_TEMP/tts-notes.md"