Skip to content

Commit 39ca12b

Browse files
committed
feat: 功能全部实现
1 parent 65b978c commit 39ca12b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+2970
-2857
lines changed

.eslintignore

Lines changed: 0 additions & 8 deletions
This file was deleted.

.github/dependabot.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Docs: https://git.io/JCUAY
2+
version: 2
3+
updates:
4+
- package-ecosystem: "npm"
5+
directory: "/"
6+
schedule:
7+
interval: "monthly"
8+
reviewers:
9+
- "jetsung"
10+
commit-message:
11+
prefix: "dep:"

.github/workflows/docker-dev.yml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
name: Docker-Dev
2+
3+
on:
4+
push:
5+
branches:
6+
- dev*
7+
paths:
8+
- docker-bake.hcl
9+
- "Dockerfile"
10+
- ".github/workflows/docker-dev.yml"
11+
- "src/**"
12+
13+
env:
14+
# DOCKER_CLI_EXPERIMENTAL: enabled
15+
# DOCKER_CONTENT_TRUST: 0 # 关闭 DCT
16+
# BUILDX_NO_DEFAULT_ATTESTATIONS: 1 # 关键:全局禁用 attestation
17+
package_name: shortener-frontend
18+
GHCR_SLUG: ghcr.io/${{ github.repository }}
19+
20+
jobs:
21+
build:
22+
strategy:
23+
matrix:
24+
arch: [amd64, arm64]
25+
include:
26+
- arch: amd64
27+
runner: ubuntu-24.04
28+
tag: dev-amd64
29+
- arch: arm64
30+
runner: ubuntu-24.04-arm
31+
tag: dev-arm64
32+
runs-on: ${{ matrix.runner }}
33+
steps:
34+
- name: Checkout Source Code
35+
uses: actions/checkout@v4
36+
37+
- name: Login to GitHub Container Registry (ghcr.io)
38+
uses: docker/login-action@v3
39+
with:
40+
registry: ghcr.io
41+
username: ${{ github.actor }}
42+
password: ${{ secrets.GITHUB_TOKEN }}
43+
44+
- name: Docker meta
45+
id: meta
46+
uses: docker/metadata-action@v5
47+
with:
48+
images: ${{ env.GHCR_SLUG }}
49+
labels: |
50+
org.opencontainers.image.title=Shortener
51+
org.opencontainers.image.description=Shortener is a URL shortening service.
52+
org.opencontainers.image.vendor=Jetsung Chan
53+
tags: ${{ matrix.tag }}
54+
55+
- name: Set up Docker Buildx
56+
uses: docker/setup-buildx-action@v3
57+
58+
- name: Build (without push)
59+
uses: docker/bake-action@v6
60+
with:
61+
files: |
62+
./docker-bake.hcl
63+
cwd://${{ steps.meta.outputs.bake-file }}
64+
targets: ${{ matrix.tag }}
65+
push: ${{ github.event_name != 'pull_request' }}

.github/workflows/docker-main.yml

Lines changed: 247 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,247 @@
1+
name: Docker-Main
2+
3+
on:
4+
push:
5+
branches:
6+
- main
7+
paths:
8+
- docker-bake.hcl
9+
- "Dockerfile"
10+
- ".github/workflows/docker-main.yml"
11+
- "src/**"
12+
13+
env:
14+
branch: main
15+
package_name: shortener-frontend
16+
acr_registry: registry.cn-guangzhou.aliyuncs.com
17+
hcr_registry: swr.ap-southeast-3.myhuaweicloud.com
18+
tcr_registry: ccr.ccs.tencentyun.com
19+
20+
jobs:
21+
main:
22+
runs-on: ubuntu-latest
23+
steps:
24+
- name: Checkout Source Code
25+
uses: actions/checkout@v4
26+
27+
- name: Login to GitHub Container Registry (ghcr.io)
28+
uses: docker/login-action@v3
29+
with:
30+
registry: ghcr.io
31+
username: ${{ github.actor }}
32+
password: ${{ secrets.GITHUB_TOKEN }}
33+
- name: Verify GHCR Docker Login
34+
run: |
35+
if ! docker info > /dev/null 2>&1; then
36+
echo "ghcr.io Docker login failed!"
37+
echo "GHCRIO_LOGIN_STATUS=failed" >> $GITHUB_ENV
38+
else
39+
echo "ghcr.io Docker login succeeded."
40+
echo "GHCRIO_LOGIN_STATUS=success" >> $GITHUB_ENV
41+
fi
42+
- name: Generate Github Container Registry Tags
43+
id: ghcr_ver
44+
if: env.GHCRIO_LOGIN_STATUS == 'success'
45+
env:
46+
IMAGE_REPO: ghcr.io/${{ github.repository_owner }}/${{ env.package_name }}
47+
run: |
48+
echo "IMAGE_REPO=$IMAGE_REPO" >> $GITHUB_OUTPUT
49+
50+
- name: Check Docker Hub Credentials
51+
id: check_docker_creds
52+
run: |
53+
if [[ -n "${{ secrets.DOCKERHUB_USERNAME }}" && -n "${{ secrets.DOCKERHUB_TOKEN }}" ]]; then
54+
echo "creds_exist=true" >> $GITHUB_OUTPUT
55+
else
56+
echo "creds_exist=false" >> $GITHUB_OUTPUT
57+
fi
58+
- name: Login to Docker Hub
59+
if: steps.check_docker_creds.outputs.creds_exist == 'true'
60+
uses: docker/login-action@v3
61+
with:
62+
registry: docker.io
63+
username: ${{ secrets.DOCKERHUB_USERNAME }}
64+
password: ${{ secrets.DOCKERHUB_TOKEN }}
65+
- name: Verify Docker Login
66+
if: steps.check_docker_creds.outputs.creds_exist == 'true'
67+
run: |
68+
if ! docker info > /dev/null 2>&1; then
69+
echo "docker.io Docker login failed!"
70+
echo "DOCKERIO_LOGIN_STATUS=failed" >> $GITHUB_ENV
71+
else
72+
echo "docker.io Docker login succeeded."
73+
echo "DOCKERIO_LOGIN_STATUS=success" >> $GITHUB_ENV
74+
fi
75+
- name: Generate Docker Hub Tags
76+
id: docker_ver
77+
if: env.DOCKERIO_LOGIN_STATUS == 'success'
78+
env:
79+
IMAGE_REPO: ${{ github.repository_owner }}/${{ env.package_name }}
80+
run: |
81+
echo "IMAGE_REPO=$IMAGE_REPO" >> $GITHUB_OUTPUT
82+
83+
- name: Check Aliyun Credentials
84+
id: check_aliyun_creds
85+
run: |
86+
if [[ -n "${{ secrets.ALIYUN_USERNAME }}" && -n "${{ secrets.ALIYUN_TOKEN }}" ]]; then
87+
echo "creds_exist=true" >> $GITHUB_OUTPUT
88+
else
89+
echo "creds_exist=false" >> $GITHUB_OUTPUT
90+
fi
91+
- name: Login to Aliyun
92+
if: steps.check_aliyun_creds.outputs.creds_exist == 'true'
93+
uses: docker/login-action@v3
94+
with:
95+
registry: ${{ env.acr_registry }}
96+
username: ${{ secrets.ALIYUN_USERNAME }}
97+
password: ${{ secrets.ALIYUN_TOKEN }}
98+
- name: Verify Aliyun Docker Login
99+
if: steps.check_aliyun_creds.outputs.creds_exist == 'true'
100+
run: |
101+
if ! docker info > /dev/null 2>&1; then
102+
echo "aliyun Docker login failed!"
103+
echo "ALIYUN_LOGIN_STATUS=failed" >> $GITHUB_ENV
104+
else
105+
echo "aliyun Docker login succeeded."
106+
echo "ALIYUN_LOGIN_STATUS=success" >> $GITHUB_ENV
107+
fi
108+
- name: Generate Aliyun Container Registry Tags
109+
id: acr_ver
110+
if: env.ALIYUN_LOGIN_STATUS == 'success'
111+
env:
112+
IMAGE_REPO: ${{ env.acr_registry }}/${{ github.repository_owner }}/${{ env.package_name }}
113+
run: |
114+
echo "IMAGE_REPO=$IMAGE_REPO" >> $GITHUB_OUTPUT
115+
116+
- name: 华为云无法推送
117+
run: |
118+
echo "华为云无法推送:"
119+
echo "buildx failed with: ERROR: failed to solve: failed to push xxx: failed commit on ref "index-sha256:xxx": unexpected status from PUT request to https://xxx: 400 Bad Request"
120+
- name: Check Huawei Cloud Credentials
121+
id: check_huawei_creds
122+
run: |
123+
if [[ -n "${{ secrets.HUAWEI_USERNAME }}" && -n "${{ secrets.HUAWEI_TOKEN }}" ]]; then
124+
echo "creds_exist=true" >> $GITHUB_OUTPUT
125+
else
126+
echo "creds_exist=false" >> $GITHUB_OUTPUT
127+
fi
128+
- name: Login to Huawei Cloud
129+
if: steps.check_huawei_creds.outputs.creds_exist == 'true'
130+
uses: docker/login-action@v3
131+
with:
132+
registry: ${{ env.hcr_registry }}
133+
username: ${{ secrets.HUAWEI_USERNAME }}
134+
password: ${{ secrets.HUAWEI_TOKEN }}
135+
- name: Verify Huawei Docker Login
136+
if: steps.check_huawei_creds.outputs.creds_exist == 'true'
137+
run: |
138+
if ! docker info > /dev/null 2>&1; then
139+
echo "huawei Docker login failed!"
140+
echo "HUAWEI_LOGIN_STATUS=failed" >> $GITHUB_ENV
141+
else
142+
echo "huawei Docker login succeeded."
143+
echo "HUAWEI_LOGIN_STATUS=success" >> $GITHUB_ENV
144+
fi
145+
- name: Generate Huawei Cloud Container Registry Tags
146+
id: hcr_ver
147+
if: env.HUAWEI_LOGIN_STATUS == 'success'
148+
env:
149+
IMAGE_REPO: ${{ env.hcr_registry }}/${{ github.repository_owner }}/${{ env.package_name }}
150+
run: |
151+
echo "IMAGE_REPO=$IMAGE_REPO" >> $GITHUB_OUTPUT
152+
153+
- name: Check Tencent Cloud Credentials
154+
id: check_tencent_creds
155+
run: |
156+
if [[ -n "${{ secrets.TENCENT_USERNAME }}" && -n "${{ secrets.TENCENT_TOKEN }}" ]]; then
157+
echo "creds_exist=true" >> $GITHUB_OUTPUT
158+
else
159+
echo "creds_exist=false" >> $GITHUB_OUTPUT
160+
fi
161+
- name: Login to Tencent Cloud
162+
if: steps.check_tencent_creds.outputs.creds_exist == 'true'
163+
uses: docker/login-action@v3
164+
with:
165+
registry: ${{ env.tcr_registry }}
166+
username: ${{ secrets.TENCENT_USERNAME }}
167+
password: ${{ secrets.TENCENT_TOKEN }}
168+
- name: Verify Tencent Docker Login
169+
if: steps.check_tencent_creds.outputs.creds_exist == 'true'
170+
run: |
171+
if ! docker info > /dev/null 2>&1; then
172+
echo "tencent Docker login failed!"
173+
echo "TENCENT_LOGIN_STATUS=failed" >> $GITHUB_ENV
174+
else
175+
echo "tencent Docker login succeeded."
176+
echo "TENCENT_LOGIN_STATUS=success" >> $GITHUB_ENV
177+
fi
178+
- name: Generate Tencent Cloud Container Registry Tags
179+
id: tcr_ver
180+
if: env.TENCENT_LOGIN_STATUS == 'success'
181+
env:
182+
IMAGE_REPO: ${{ env.tcr_registry }}/${{ github.repository_owner }}/${{ env.package_name }}
183+
run: |
184+
echo "IMAGE_REPO=$IMAGE_REPO" >> $GITHUB_OUTPUT
185+
186+
- name: Set up QEMU
187+
uses: docker/setup-qemu-action@v3
188+
189+
- name: Set up Docker Buildx
190+
uses: docker/setup-buildx-action@v3
191+
192+
- name: Tags
193+
id: tags
194+
run: |
195+
if [[ -n "${{ steps.ghcr_ver.outputs.IMAGE_REPO }}" ]]; then
196+
echo "ghcr=${{ steps.ghcr_ver.outputs.IMAGE_REPO }}" >> $GITHUB_OUTPUT
197+
fi
198+
199+
if [[ -n "${{ steps.docker_ver.outputs.IMAGE_REPO }}" ]]; then
200+
echo "docker=${{ steps.docker_ver.outputs.IMAGE_REPO }}" >> $GITHUB_OUTPUT
201+
fi
202+
203+
if [[ -n "${{ steps.acr_ver.outputs.IMAGE_REPO }}" ]]; then
204+
echo "acr=${{ steps.acr_ver.outputs.IMAGE_REPO }}" >> $GITHUB_OUTPUT
205+
fi
206+
207+
if [[ -n "${{ steps.hcr_ver.outputs.IMAGE_REPO }}" ]]; then
208+
echo "hcr=${{ steps.hcr_ver.outputs.IMAGE_REPO }}" >> $GITHUB_OUTPUT
209+
fi
210+
211+
if [[ -n "${{ steps.tcr_ver.outputs.IMAGE_REPO }}" ]]; then
212+
echo "tcr=${{ steps.tcr_ver.outputs.IMAGE_REPO }}" >> $GITHUB_OUTPUT
213+
fi
214+
215+
- name: Docker meta
216+
id: meta
217+
uses: docker/metadata-action@v5
218+
with:
219+
images: |
220+
${{ steps.tags.outputs.ghcr || '' }}
221+
${{ steps.tags.outputs.docker || '' }}
222+
${{ steps.tags.outputs.acr || '' }}
223+
${{ steps.tags.outputs.hcr || '' }}
224+
${{ steps.tags.outputs.tcr || '' }}
225+
labels: |
226+
org.opencontainers.image.title=Shortener
227+
org.opencontainers.image.description=Shortener is a URL shortening service.
228+
org.opencontainers.image.vendor=Jetsung Chan
229+
tags: |
230+
${{ env.branch }}
231+
232+
- name: Build
233+
uses: docker/bake-action@v6
234+
with:
235+
files: |
236+
./docker-bake.hcl
237+
cwd://${{ steps.meta.outputs.bake-file }}
238+
targets: release
239+
push: ${{ github.event_name != 'pull_request' }}
240+
241+
- uses: actions/delete-package-versions@v5
242+
continue-on-error: true
243+
with:
244+
package-name: ${{ env.package_name }}
245+
package-type: 'container'
246+
min-versions-to-keep: 2
247+
delete-only-untagged-versions: 'true'

0 commit comments

Comments
 (0)