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