Skip to content

Commit a24c8a7

Browse files
committed
[update]同步更新生产环境自动部署脚本
1 parent be00e86 commit a24c8a7

File tree

1 file changed

+44
-4
lines changed

1 file changed

+44
-4
lines changed

.github/workflows/prod_deploy.yml

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,23 @@ jobs:
2626
sudo apt-get update
2727
sudo apt-get install -y docker-compose
2828
29+
# 生成时间戳镜像标签
30+
- name: Generate image tag
31+
run: echo "IMAGE_TAG=latest-$(date +%Y%m%d%H%M%S)" >> $GITHUB_ENV
32+
2933
# 构建 Docker 镜像
3034
- name: Build Docker image
31-
run: docker-compose -f docker-compose-prod.yml build
35+
run: IMAGE_TAG=${{ env.IMAGE_TAG }} docker-compose -f docker-compose.yml build
3236

3337
# 检查镜像是否能成功启动一个容器
3438
- name: Run Docker container
35-
run: docker-compose -f docker-compose-prod.yml up -d
39+
run: IMAGE_TAG=${{ env.IMAGE_TAG }} docker-compose -f docker-compose.yml up -d
3640

3741
# 检查容器状态
3842
- name: Check container status
3943
id: container_status
4044
run: |
41-
CONTAINER_NAME=$(docker-compose -f docker-compose-prod.yml ps -q | head -n 1)
45+
CONTAINER_NAME=$(IMAGE_TAG=${{ env.IMAGE_TAG }} docker-compose -f docker-compose-prod.yml ps -q | head -n 1)
4246
if [ -z "$CONTAINER_NAME" ]; then
4347
echo "No containers found, failing the step."
4448
exit 1
@@ -57,8 +61,36 @@ jobs:
5761
# 推送镜像到 kworlds's Docker Hub
5862
- name: Push Docker image to Kworlds's Docker Hub
5963
if: success()
60-
run: docker push dockerhub.kworlds.cn/pure-drf-api:latest
64+
run: docker push dockerhub.kworlds.cn/pure-drf-api:${{ env.IMAGE_TAG }}
6165

66+
# 获取latest标签旧镜像的digest
67+
- name: Get old latest tag digest from Docker Hub
68+
run: |
69+
OLD_DIGEST=$(curl -sI -u ${{ vars.DOCKER_HUB_USERNAME }}:${{ secrets.DOCKER_HUB_PASSWORD }} \
70+
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
71+
https://dockerhub.kworlds.cn/v2/pure-drf-api/manifests/latest | \
72+
awk -F': ' '/^[Dd]ocker-[Cc]ontent-[Dd]igest:/ {gsub(/\r/, "", $2); print $2}')
73+
echo "OLD_DIGEST=$OLD_DIGEST" >> $GITHUB_ENV
74+
75+
# 将新镜像标签修改为latest并推送
76+
- name: Tag and push new image with latest tag
77+
if: success()
78+
run: |
79+
docker tag dockerhub.kworlds.cn/pure-drf-api:${{ env.IMAGE_TAG }} dockerhub.kworlds.cn/pure-drf-api:latest
80+
docker push dockerhub.kworlds.cn/pure-drf-api:latest
81+
82+
# 删除旧latest镜像manifest
83+
- name: Delete old latest tag manifest from Docker Hub
84+
if: success()
85+
run: |
86+
if [ -n ${{ env.OLD_DIGEST }} ]; then
87+
curl -X DELETE -u ${{ vars.DOCKER_HUB_USERNAME }}:${{ secrets.DOCKER_HUB_PASSWORD }} \
88+
https://dockerhub.kworlds.cn/v2/pure-drf-api/manifests/${{ env.OLD_DIGEST }}
89+
else
90+
echo "No old digest found to delete."
91+
exit 1
92+
fi
93+
6294
# 更新开发环境镜像并重启容器
6395
- name: Deploy to remote server
6496
if: success()
@@ -69,4 +101,12 @@ jobs:
69101
docker-compose pull
70102
docker-compose down
71103
docker-compose up -d
104+
EOF
105+
106+
# 清理香港hub服务器垃圾镜像
107+
- name: Clean up Docker Hub registry
108+
if: success()
109+
run: |
110+
sshpass -p "${{ secrets.HOST_USER_PASSWORD }}" ssh -o StrictHostKeyChecking=no ${{ vars.HOST_USER_NAME }}@${{ vars.HOST }} << EOF
111+
docker exec dockerhub registry garbage-collect /etc/docker/registry/config.yml
72112
EOF

0 commit comments

Comments
 (0)