mirror of
https://git.bjxgj.com/xgj/xgj-actions.git
synced 2025-10-14 06:33:37 +08:00
201 lines
5.9 KiB
YAML
201 lines
5.9 KiB
YAML
name: 'Web项目发布构建'
|
||
description: '自动化Web项目发布流程,包括版本发布、Docker镜像构建和推送'
|
||
author: 'Your Organization'
|
||
|
||
branding:
|
||
icon: 'upload-cloud'
|
||
color: 'green'
|
||
|
||
inputs:
|
||
gitea-token:
|
||
description: 'Gitea访问令牌'
|
||
required: true
|
||
|
||
app-env:
|
||
description: '应用环境 (development, production等)'
|
||
required: false
|
||
default: 'production'
|
||
|
||
|
||
release-command:
|
||
description: '发布命令,默认为 npm run release -- --release -V'
|
||
required: false
|
||
default: 'npm run release -- --release -V'
|
||
|
||
docker-registry:
|
||
description: 'Docker仓库地址'
|
||
required: false
|
||
default: 'docker-registry.bjxgj.com'
|
||
|
||
docker-context:
|
||
description: 'Docker构建上下文路径'
|
||
required: false
|
||
default: '.'
|
||
|
||
dockerfile-path:
|
||
description: 'Dockerfile路径'
|
||
required: false
|
||
default: './container/dev/Dockerfile'
|
||
|
||
docker-tags:
|
||
description: '额外的Docker标签 (每行一个标签)'
|
||
required: false
|
||
default: ''
|
||
|
||
enable-docker-build:
|
||
description: '是否执行Docker构建 (true/false)'
|
||
required: false
|
||
default: 'true'
|
||
|
||
node-debug:
|
||
description: '是否启用Node.js调试模式 (true/false)'
|
||
required: false
|
||
default: 'false'
|
||
|
||
outputs:
|
||
version:
|
||
description: '发布的版本号'
|
||
value: ${{ steps.get_var.outputs.version }}
|
||
|
||
version-with-dash:
|
||
description: '版本号(点号替换为横线)'
|
||
value: ${{ steps.get_var.outputs.version_with_dash }}
|
||
|
||
docker-image-digest:
|
||
description: 'Docker镜像摘要'
|
||
value: ${{ steps.build.outputs.digest }}
|
||
|
||
docker-image-tags:
|
||
description: 'Docker镜像标签列表'
|
||
value: ${{ steps.build.outputs.tags }}
|
||
|
||
runs:
|
||
using: 'composite'
|
||
steps:
|
||
- name: 验证必需参数
|
||
shell: bash
|
||
run: |
|
||
echo "🔍 验证输入参数..."
|
||
|
||
if [[ -z "${{ inputs.gitea-token }}" ]]; then
|
||
echo "❌ 错误: gitea-token 参数是必需的"
|
||
exit 1
|
||
fi
|
||
|
||
if [[ "${{ inputs.enable-docker-build }}" == "true" ]]; then
|
||
if [[ ! -f "${{ inputs.dockerfile-path }}" ]]; then
|
||
echo "❌ 错误: Dockerfile 不存在: ${{ inputs.dockerfile-path }}"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
echo "✅ 参数验证通过"
|
||
|
||
- name: 发布构建
|
||
shell: bash
|
||
run: |
|
||
echo "🚀 开始发布构建..."
|
||
echo "执行命令: ${{ inputs.release-command }}"
|
||
${{ inputs.release-command }}
|
||
echo "✅ 发布构建完成"
|
||
env:
|
||
NODE_DEBUG: ${{ inputs.node-debug == 'true' && 'release-it:*' || '' }}
|
||
GITEA_TOKEN: ${{ inputs.gitea-token }}
|
||
APP_ENV: ${{ inputs.app-env }}
|
||
|
||
- name: 获取版本信息
|
||
id: get_var
|
||
shell: bash
|
||
run: |
|
||
echo "📝 获取版本信息..."
|
||
|
||
if [[ ! -f "/tmp/last-version" ]]; then
|
||
echo "❌ 错误: 版本文件 /tmp/last-version 不存在"
|
||
echo "请确保发布命令正确执行并生成了版本文件"
|
||
exit 1
|
||
fi
|
||
|
||
VERSION=$(cat /tmp/last-version)
|
||
VERSION_WITH_DASH=$(echo "$VERSION" | sed 's/\./-/g')
|
||
|
||
echo "version=$VERSION" >> $GITHUB_OUTPUT
|
||
echo "version_with_dash=$VERSION_WITH_DASH" >> $GITHUB_OUTPUT
|
||
|
||
echo "📦 发布版本: $VERSION"
|
||
echo "📦 带横线版本: $VERSION_WITH_DASH"
|
||
|
||
- name: 准备Docker标签
|
||
if: ${{ inputs.enable-docker-build == 'true' }}
|
||
id: docker_tags
|
||
shell: bash
|
||
run: |
|
||
echo "🏷️ 准备Docker标签..."
|
||
|
||
REPO_NAME="${{ github.event.repository.name }}"
|
||
REGISTRY="${{ inputs.docker-registry }}"
|
||
VERSION="${{ steps.get_var.outputs.version }}"
|
||
|
||
# 基础标签(保留版本标签)
|
||
TAGS="${TAGS}\n${REGISTRY}/${REPO_NAME}:${VERSION}"
|
||
|
||
# 添加用户自定义标签
|
||
if [[ -n "${{ inputs.docker-tags }}" ]]; then
|
||
while IFS= read -r tag; do
|
||
if [[ -n "$tag" ]]; then
|
||
# 如果标签不包含仓库地址,则添加默认仓库前缀
|
||
if [[ "$tag" != *"/"* ]]; then
|
||
TAGS="${TAGS}\n${REGISTRY}/${REPO_NAME}:${tag}"
|
||
else
|
||
TAGS="${TAGS}\n${tag}"
|
||
fi
|
||
fi
|
||
done <<< "${{ inputs.docker-tags }}"
|
||
fi
|
||
|
||
echo "Docker标签列表:"
|
||
echo -e "$TAGS" | sed 's/^/ - /'
|
||
|
||
# 将标签转换为多行格式供后续步骤使用
|
||
echo -e "$TAGS" > /tmp/docker-tags.txt
|
||
|
||
# 输出标签给后续步骤使用
|
||
{
|
||
echo "tags<<EOF"
|
||
echo -e "$TAGS"
|
||
echo "EOF"
|
||
} >> $GITHUB_OUTPUT
|
||
|
||
- name: 构建并推送Docker镜像
|
||
if: ${{ inputs.enable-docker-build == 'true' }}
|
||
id: build
|
||
uses: docker/build-push-action@v6
|
||
with:
|
||
context: ${{ inputs.docker-context }}
|
||
file: ${{ inputs.dockerfile-path }}
|
||
push: true
|
||
tags: ${{ steps.docker_tags.outputs.tags }}
|
||
|
||
- name: 发布总结
|
||
shell: bash
|
||
run: |
|
||
echo "🎉 发布流程完成!"
|
||
echo ""
|
||
echo "📋 发布信息:"
|
||
echo " - 版本号: ${{ steps.get_var.outputs.version }}"
|
||
echo " - 应用环境: ${{ inputs.app-env }}"
|
||
echo " - Sentry启用: ${{ inputs.enable-sentry }}"
|
||
echo ""
|
||
|
||
if [[ "${{ inputs.enable-docker-build }}" == "true" ]]; then
|
||
echo "🐳 Docker信息:"
|
||
echo " - 仓库: ${{ inputs.docker-registry }}"
|
||
echo " - 项目名: ${{ github.event.repository.name }}"
|
||
echo " - 主要标签:"
|
||
echo " - ${{ steps.get_var.outputs.version }}"
|
||
if [[ -n "${{ steps.build.outputs.digest }}" ]]; then
|
||
echo " - 镜像摘要: ${{ steps.build.outputs.digest }}"
|
||
fi
|
||
else
|
||
echo "🐳 Docker构建已跳过"
|
||
fi
|