From b382a0bca55c5a983d65c3be1b63a0db6343d7db Mon Sep 17 00:00:00 2001 From: PuqiAR Date: Sat, 3 Jan 2026 21:57:39 +0800 Subject: [PATCH] =?UTF-8?q?[CI]=20=E4=BF=AE=E5=A4=8D=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/build.yml | 142 ++++++++++++++++++++++++++++--------- 1 file changed, 108 insertions(+), 34 deletions(-) diff --git a/.gitea/workflows/build.yml b/.gitea/workflows/build.yml index 03a7615..0ef800f 100644 --- a/.gitea/workflows/build.yml +++ b/.gitea/workflows/build.yml @@ -68,31 +68,55 @@ jobs: echo "正在为Linux版本创建/更新发布 $VERSION ..." - # 创建发布 (如果已存在,忽略错误) - curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ + # 1. 创建发布并捕获响应,提取 Release ID + RESPONSE=$(curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"$VERSION\",\"name\":\"Fig $VERSION\",\"draft\":false,\"prerelease\":false}" \ - "$API/releases" 2>/dev/null || echo "发布已存在,继续上传..." + "$API/releases" 2>/dev/null || echo '{"id":0}') + # 从响应中提取 Release ID + RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2) + + if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "0" ]; then + # 如果创建失败或已存在,尝试通过标签获取 Release ID + echo "尝试通过标签获取已有发布的ID..." + RELEASE_ID=$(curl -sS -H "Authorization: token $GITEA_TOKEN" \ + "$API/releases/tags/$VERSION" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2) + fi + + if [ -z "$RELEASE_ID" ]; then + echo "错误:无法获取或创建发布 ID" + exit 1 + fi + + echo "使用发布 ID: $RELEASE_ID 进行上传" + + # 2. 使用 Release ID 上传资产 curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary @Fig-$VERSION-linux-x86_64.tar.gz \ - "$API/releases/$VERSION/assets?name=Fig-$VERSION-linux-x86_64.tar.gz" + "$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-linux-x86_64.tar.gz" curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: text/plain" \ --data-binary @Fig-$VERSION-linux-x86_64.sha256 \ - "$API/releases/$VERSION/assets?name=Fig-$VERSION-linux-x86_64.sha256" + "$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-linux-x86_64.sha256" echo "✅ Linux版本发布完成!" build-windows-x64: - # 关键:指定运行在带有 windows 标签的 Runner 上 runs-on: windows - # 移除 container 配置,因为将在宿主机直接运行 - # container: ... # 删除这整个 container 部分 steps: + - name: 验证Windows工具链 + run: | + # 检查 xmake 和 clang 是否在 PATH 中 + where xmake || echo "警告: xmake 未找到" + where clang++ || echo "警告: clang++ 未找到" + # 显示版本信息 + if (Get-Command xmake -ErrorAction SilentlyContinue) { xmake --version } + if (Get-Command clang++ -ErrorAction SilentlyContinue) { clang++ --version } + - name: 检出代码 run: | git clone https://git.fig-lang.cn/${{ github.repository }} . @@ -100,57 +124,107 @@ jobs: - name: 设置版本 run: | - if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then - VERSION="${{ inputs.version }}" - else - VERSION="${GITHUB_REF#refs/tags/}" - fi - echo "VERSION=$VERSION" >> $env:GITHUB_ENV + if ("${{ github.event_name }}" -eq "workflow_dispatch") { + $VERSION = "${{ inputs.version }}" + } else { + $VERSION = "${{ github.ref }}".Replace("refs/tags/", "") + } + echo "VERSION=$VERSION" | Out-File -FilePath $env:GITHUB_ENV -Append echo "Windows构建版本: $VERSION" - - name: 安装 xmake (Windows) + - name: 安装 xmake (Windows,可选) run: | - # 这里可以是你预先准备好的离线包,或从你的Gitea下载 - # 例如,如果你已将 xmake Windows 版放在仓库中 - # 或者,使用简单的网络下载(确保Runner能访问) - curl -fsSL https://xmake.io/shget.text -o xmake.ps1 - powershell -ExecutionPolicy Bypass -File xmake.ps1 + # 如果工具链验证步骤发现没有 xmake,再执行安装 + if (-not (Get-Command xmake -ErrorAction SilentlyContinue)) { + echo "正在安装 xmake..." + curl -fsSL https://xmake.io/shget.text -o xmake.ps1 + powershell -ExecutionPolicy Bypass -File xmake.ps1 + } else { + echo "xmake 已安装,跳过安装步骤。" + } - name: 构建项目 (Windows Native) run: | xmake f -p windows -a x86_64 -m release -y xmake build -j${env:NUMBER_OF_PROCESSORS} + echo "Windows构建成功。" - name: 打包Windows发布文件 run: | $VERSION = $env:VERSION $PACKAGE_NAME = "Fig-${VERSION}-windows-x86_64" New-Item -ItemType Directory -Force -Path $PACKAGE_NAME - Copy-Item build\windows\x86_64\release\Fig.exe $PACKAGE_NAME\ + + # 尝试查找可执行文件 (可能是 Fig 或 Fig.exe) + if (Test-Path "build\windows\x86_64\release\Fig.exe") { + Copy-Item build\windows\x86_64\release\Fig.exe $PACKAGE_NAME\ + } elseif (Test-Path "build\windows\x86_64\release\Fig") { + Copy-Item build\windows\x86_64\release\Fig $PACKAGE_NAME\Fig.exe + } else { + echo "错误:未找到构建输出文件" + Get-ChildItem -Recurse -Path build -Include "Fig*" | Select-Object -First 5 + exit 1 + } + if (Test-Path "src\Module\Library") { Copy-Item -Recurse src\Module\Library $PACKAGE_NAME\ } Compress-Archive -Path $PACKAGE_NAME -DestinationPath "${PACKAGE_NAME}.zip" - Get-FileHash "${PACKAGE_NAME}.zip" -Algorithm SHA256 | Out-File "${PACKAGE_NAME}.sha256" - echo "Windows打包完成." + Get-FileHash "${PACKAGE_NAME}.zip" -Algorithm SHA256 | Out-File "${PACKAGE_NAME}.sha256" -Encoding UTF8 + echo "Windows打包完成: ${PACKAGE_NAME}.zip" + - name: 发布Windows版本到Gitea env: GITEA_TOKEN: ${{ secrets.CI_TOKEN }} run: | - VERSION="${{ env.VERSION }}" - API="https://git.fig-lang.cn/api/v1/repos/${{ github.repository }}" + $VERSION = $env:VERSION + $API = "https://git.fig-lang.cn/api/v1/repos/${{ github.repository }}" echo "正在上传Windows版本到发布 $VERSION ..." - # 直接上传到同一个Release(Release已由Linux任务创建) - curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ - -H "Content-Type: application/octet-stream" \ - --data-binary @Fig-$VERSION-windows-x86_64.zip \ - "$API/releases/$VERSION/assets?name=Fig-$VERSION-windows-x86_64.zip" + # 1. 尝试通过标签获取 Release ID + $RELEASE_RESPONSE = Invoke-RestMethod -Uri "$API/releases/tags/$VERSION" -Headers @{ + Authorization = "token $env:GITEA_TOKEN" + } -ErrorAction SilentlyContinue - curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ - -H "Content-Type: text/plain" \ - --data-binary @Fig-$VERSION-windows-x86_64.sha256 \ - "$API/releases/$VERSION/assets?name=Fig-$VERSION-windows-x86_64.sha256" + if ($RELEASE_RESPONSE -and $RELEASE_RESPONSE.id) { + $RELEASE_ID = $RELEASE_RESPONSE.id + echo "找到已有发布 ID: $RELEASE_ID" + } else { + # 如果不存在,则创建新发布 + echo "发布不存在,正在创建..." + $CREATE_BODY = @{ + tag_name = $VERSION + name = "Fig $VERSION" + draft = $false + prerelease = $false + } | ConvertTo-Json + + $CREATE_RESPONSE = Invoke-RestMethod -Method Post -Uri "$API/releases" -Headers @{ + Authorization = "token $env:GITEA_TOKEN" + 'Content-Type' = 'application/json' + } -Body $CREATE_BODY -ErrorAction SilentlyContinue + + if ($CREATE_RESPONSE -and $CREATE_RESPONSE.id) { + $RELEASE_ID = $CREATE_RESPONSE.id + echo "创建新发布 ID: $RELEASE_ID" + } else { + echo "错误:无法获取或创建发布" + exit 1 + } + } + + # 2. 使用 Release ID 上传资产 + echo "正在上传 ZIP 文件..." + Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-windows-x86_64.zip" -Headers @{ + Authorization = "token $env:GITEA_TOKEN" + 'Content-Type' = 'application/octet-stream' + } -InFile "Fig-$VERSION-windows-x86_64.zip" -ErrorAction SilentlyContinue + + echo "正在上传校验文件..." + Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-windows-x86_64.sha256" -Headers @{ + Authorization = "token $env:GITEA_TOKEN" + 'Content-Type' = 'text/plain' + } -InFile "Fig-$VERSION-windows-x86_64.sha256" -ErrorAction SilentlyContinue echo "✅ Windows版本发布完成!" \ No newline at end of file