@@ -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
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