174 lines
6.0 KiB
YAML
174 lines
6.0 KiB
YAML
name: 构建服务端镜像
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
inputs:
|
||
runner_os:
|
||
description: 选择运行器系统
|
||
type: choice
|
||
required: true
|
||
default: 'ubuntu-latest'
|
||
options:
|
||
- ubuntu-latest
|
||
- ubuntu-24.04
|
||
- ubuntu-host
|
||
push_to_docker:
|
||
description: 推送到 Docker Hub
|
||
type: boolean
|
||
default: false
|
||
required: true
|
||
output_path:
|
||
description: 镜像输出路径
|
||
type: string
|
||
required: false
|
||
|
||
env:
|
||
IMAGE_TAG_FILE: image_tag.txt
|
||
IMAGE_FILE: spt-server-image.tar
|
||
|
||
jobs:
|
||
build-server:
|
||
runs-on: ${{ inputs.runner_os }}
|
||
|
||
steps:
|
||
- name: 检出代码
|
||
uses: actions/checkout@v4
|
||
|
||
- name: 设置 Docker Buildx
|
||
uses: docker/setup-buildx-action@v3
|
||
|
||
- name: 检查 Docker Hub 配置
|
||
id: docker-config
|
||
run: |
|
||
if [ "${{ inputs.push_to_docker }}" = "true" ]; then
|
||
if [ -z "${{ secrets.DOCKERHUB_USERNAME }}" ] || [ -z "${{ secrets.DOCKERHUB_TOKEN }}" ]; then
|
||
echo "Docker Hub 用户名或令牌未配置,无法推送镜像"
|
||
echo "push_available=false" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "Docker Hub 配置检查通过"
|
||
echo "push_available=true" >> $GITHUB_OUTPUT
|
||
fi
|
||
else
|
||
echo "用户选择不推送到 Docker Hub"
|
||
echo "push_available=false" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: 登录 Docker Hub
|
||
if: steps.docker-config.outputs.push_available == 'true'
|
||
uses: docker/login-action@v3
|
||
with:
|
||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||
|
||
- name: 设置构建脚本执行权限
|
||
run: chmod +x build-server.sh
|
||
|
||
- name: 构建 Docker 镜像
|
||
run: |
|
||
# 运行构建脚本
|
||
if [ -n "${{ secrets.DOCKERHUB_USERNAME }}" ]; then
|
||
echo "使用 secrets 中的 Docker Hub 用户名"
|
||
./build-server.sh "${{ secrets.DOCKERHUB_USERNAME }}"
|
||
else
|
||
echo "使用默认 Docker Hub 用户名"
|
||
./build-server.sh
|
||
fi
|
||
|
||
- name: 获取镜像标签
|
||
id: exist-tag
|
||
run: |
|
||
# 从文件中读取镜像标签
|
||
if [ -f ${{ env.IMAGE_TAG_FILE }} ]; then
|
||
TAG=$(cat ${{ env.IMAGE_TAG_FILE }} | head -1)
|
||
echo "从文件读取镜像标签: $TAG"
|
||
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "错误:${{ env.IMAGE_TAG_FILE }} 文件不存在,构建可能失败"
|
||
exit 1
|
||
fi
|
||
|
||
- name: 导出构建镜像
|
||
if: inputs.output_path != ''
|
||
run: |
|
||
# 临时导出镜像
|
||
docker save -o ${{ env.IMAGE_FILE }} ${{ steps.exist-tag.outputs.tag }}
|
||
echo "镜像已临时导出为: ${{ env.IMAGE_FILE }}"
|
||
|
||
- name: 复制镜像到输出目录
|
||
if: inputs.output_path != ''
|
||
run: |
|
||
# 创建输出目录并复制镜像
|
||
mkdir -p ${{ inputs.output_path }}
|
||
cp ${{ env.IMAGE_FILE }} ${{ inputs.output_path }}/
|
||
echo "镜像已复制到: ${{ inputs.output_path }}/${{ env.IMAGE_FILE }}"
|
||
|
||
- name: 清理临时文件
|
||
if: inputs.output_path != ''
|
||
run: |
|
||
# 删除临时文件
|
||
rm -f ${{ env.IMAGE_FILE }}
|
||
echo "已清理临时镜像文件"
|
||
|
||
- name: 推送 Docker 镜像
|
||
if: steps.docker-config.outputs.push_available == 'true'
|
||
run: |
|
||
docker push ${{ steps.exist-tag.outputs.tag }}
|
||
|
||
- name: 构建结果
|
||
run: |
|
||
echo "=== 构建结果 ==="
|
||
echo "运行器操作系统: ${{ inputs.runner_os }}"
|
||
echo "镜像标签: ${{ steps.exist-tag.outputs.tag }}"
|
||
echo "用户选择推送到 Docker Hub: ${{ inputs.push_to_docker }}"
|
||
echo "实际是否推送到 Docker Hub: ${{ steps.docker-config.outputs.push_available }}"
|
||
if [ "${{ inputs.output_path }}" != "" ]; then
|
||
echo "镜像文件保存到: ${{ inputs.output_path }}/${{ env.IMAGE_FILE }}"
|
||
else
|
||
echo "未提供输出路径,镜像文件未保存"
|
||
fi
|
||
if [ "${{ steps.docker-config.outputs.push_available }}" = "true" ]; then
|
||
echo "已推送到 Docker Hub"
|
||
echo "推送的标签: ${{ steps.exist-tag.outputs.tag }}"
|
||
else
|
||
if [ "${{ inputs.push_to_docker }}" = "true" ]; then
|
||
echo "推送失败:Docker Hub 用户名或令牌未配置"
|
||
else
|
||
echo "镜像仅本地构建,用户选择不推送到 Docker Hub"
|
||
fi
|
||
fi
|
||
|
||
- name: 清理 Docker 镜像和缓存
|
||
run: |
|
||
echo "=== 开始清理 Docker 资源 ==="
|
||
|
||
# 1. 删除构建的镜像
|
||
IMAGE_TAG="${{ steps.exist-tag.outputs.tag }}"
|
||
if [ -n "$IMAGE_TAG" ]; then
|
||
echo "删除构建的镜像: $IMAGE_TAG"
|
||
docker rmi $IMAGE_TAG 2>/dev/null || echo "镜像已删除或不存在"
|
||
else
|
||
echo "未获取到镜像标签,跳过镜像删除"
|
||
fi
|
||
|
||
# 2. 清理所有悬空镜像
|
||
echo "清理悬空镜像..."
|
||
DANGLING_IMAGES=$(docker images -f "dangling=true" -q)
|
||
if [ -n "$DANGLING_IMAGES" ]; then
|
||
docker rmi $DANGLING_IMAGES 2>/dev/null || true
|
||
echo "已清理悬空镜像"
|
||
else
|
||
echo "无悬空镜像需要清理"
|
||
fi
|
||
|
||
# 3. 在磁盘空间不足时清理构建缓存
|
||
echo "检查磁盘使用情况..."
|
||
DISK_USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
||
if [ "$DISK_USAGE" -gt 90 ]; then
|
||
echo "磁盘使用率 ${DISK_USAGE}%,清理构建缓存"
|
||
docker buildx prune -f
|
||
echo "构建缓存已清理"
|
||
else
|
||
echo "磁盘使用率 ${DISK_USAGE}%,保留构建缓存"
|
||
fi
|
||
|
||
echo "资源清理完成" |