change build.yml 3

This commit is contained in:
zi2ven
2026-02-04 20:28:41 +08:00
parent 558ea194c7
commit ecc1bd1cc2

View File

@@ -95,58 +95,68 @@ jobs:
COMMIT_MSG="${{ env.COMMIT_MSG }}" COMMIT_MSG="${{ env.COMMIT_MSG }}"
API="https://git.fig-lang.cn/api/v1/repos/${{ github.repository }}" API="https://git.fig-lang.cn/api/v1/repos/${{ github.repository }}"
echo "正在为Linux版本创建/更新发布 $VERSION ..." echo "正在检查版本 $VERSION 的发布状态..."
# 确保正确转义 # 准备 JSON 数据
VERSION="$VERSION" COMMIT_MSG="$COMMIT_MSG" python3 -c "import json, os; print(json.dumps({'tag_name': os.environ.get('VERSION', ''), 'name': 'Fig ' + os.environ.get('VERSION', ''), 'body': os.environ.get('COMMIT_MSG', ''), 'draft': False, 'prerelease': False}))" > release_body.json VERSION="$VERSION" COMMIT_MSG="$COMMIT_MSG" python3 -c "import json, os; print(json.dumps({'tag_name': os.environ.get('VERSION', ''), 'name': 'Fig ' + os.environ.get('VERSION', ''), 'body': os.environ.get('COMMIT_MSG', ''), 'draft': False, 'prerelease': False}))" > release_body.json
RESPONSE=$(curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ # 1. 尝试获取已有发布
-H "Content-Type: application/json" \ RESPONSE_TAG=$(curl -sS -H "Authorization: token $GITEA_TOKEN" "$API/releases/tags/$VERSION" 2>/dev/null || echo '{"id":0}')
-d @release_body.json \ RELEASE_ID=$(echo "$RESPONSE_TAG" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)
"$API/releases" 2>/dev/null || echo '{"id":0}')
RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2) if [ -n "$RELEASE_ID" ] && [ "$RELEASE_ID" != "0" ]; then
echo "✅ 找到已有发布 (ID: $RELEASE_ID),正在更新说明..."
curl -sS -X PATCH -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d @release_body.json \
"$API/releases/$RELEASE_ID" > /dev/null
else
echo "未找到已有发布,准备创建新发布..."
RESPONSE=$(curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/json" \
-d @release_body.json \
"$API/releases" 2>/dev/null || echo '{"id":0}')
if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "0" ]; then RELEASE_ID=$(echo "$RESPONSE" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)
echo "尝试通过标签获取已有发布的ID..."
RESPONSE_TAG=$(curl -sS -H "Authorization: token $GITEA_TOKEN" "$API/releases/tags/$VERSION")
RELEASE_ID=$(echo "$RESPONSE_TAG" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)
# 发布存在,更新它以包含最新的提交消息 if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "0" ]; then
if [ -n "$RELEASE_ID" ] && [ "$RELEASE_ID" != "0" ]; then # 再次尝试获取,防止并发冲突
echo "更新已有发布的说明..." RESPONSE_TAG=$(curl -sS -H "Authorization: token $GITEA_TOKEN" "$API/releases/tags/$VERSION" 2>/dev/null || echo '{"id":0}')
curl -sS -X PATCH -H "Authorization: token $GITEA_TOKEN" \ RELEASE_ID=$(echo "$RESPONSE_TAG" | grep -o '"id":[0-9]*' | head -1 | cut -d':' -f2)
-H "Content-Type: application/json" \
-d @release_body.json \
"$API/releases/$RELEASE_ID" > /dev/null
fi fi
fi fi
if [ -z "$RELEASE_ID" ]; then if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "0" ]; then
echo "错误:无法获取或创建发布 ID" echo "错误:无法获取或创建发布 ID"
exit 1 exit 1
fi fi
echo "使用发布 ID: $RELEASE_ID 进行上传" echo "使用发布 ID: $RELEASE_ID 进行上传"
# 上传语言包 # 上传资产
PACKAGE_ZIP="Fig-$VERSION-linux-x86_64.tar.gz"
PACKAGE_SHA="Fig-$VERSION-linux-x86_64.sha256"
echo "正在上传 $PACKAGE_ZIP ..."
curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/octet-stream" \ -H "Content-Type: application/octet-stream" \
--data-binary @Fig-$VERSION-linux-x86_64.tar.gz \ --data-binary "@$PACKAGE_ZIP" \
"$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-linux-x86_64.tar.gz" "$API/releases/$RELEASE_ID/assets?name=$PACKAGE_ZIP" > /dev/null
echo "正在上传 $PACKAGE_SHA ..."
curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: text/plain" \ -H "Content-Type: text/plain" \
--data-binary @Fig-$VERSION-linux-x86_64.sha256 \ --data-binary "@$PACKAGE_SHA" \
"$API/releases/$RELEASE_ID/assets?name=Fig-$VERSION-linux-x86_64.sha256" "$API/releases/$RELEASE_ID/assets?name=$PACKAGE_SHA" > /dev/null
# 🔧 新增:上传Linux安装器 # 🔧 上传Linux安装器
if [ -f "Installer/ConsoleInstaller/dist/linux/FigSetup-Linux" ]; then INSTALLER="Installer/ConsoleInstaller/dist/linux/FigSetup-Linux"
if [ -f "$INSTALLER" ]; then
echo "正在上传Linux安装器..." echo "正在上传Linux安装器..."
curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \ curl -sS -X POST -H "Authorization: token $GITEA_TOKEN" \
-H "Content-Type: application/octet-stream" \ -H "Content-Type: application/octet-stream" \
--data-binary @Installer/ConsoleInstaller/dist/linux/FigSetup-Linux \ --data-binary "@$INSTALLER" \
"$API/releases/$RELEASE_ID/assets?name=FigSetup-Linux" "$API/releases/$RELEASE_ID/assets?name=FigSetup-Linux" > /dev/null
fi fi
echo "✅ Linux版本发布完成" echo "✅ Linux版本发布完成"
@@ -259,10 +269,9 @@ jobs:
$VERSION = $env:VERSION $VERSION = $env:VERSION
$COMMIT_MSG = $env:COMMIT_MSG $COMMIT_MSG = $env:COMMIT_MSG
# 如果环境变量获取失败,尝试直接使用上下文变量
if (-not $VERSION) { if (-not $VERSION) {
$VERSION = "${{ github.ref_name }}" $VERSION = "${{ github.ref_name }}"
Write-Host "⚠️ 警告:从环境变量获取 VERSION 失败,尝试回退到 github.ref_name: $VERSION" Write-Host "⚠️ 警告:从环境变量获取 VERSION 失败,回退到 github.ref_name: $VERSION"
} }
if (-not $VERSION) { if (-not $VERSION) {
@@ -270,30 +279,23 @@ jobs:
exit 1 exit 1
} }
if (-not $COMMIT_MSG) {
Write-Host "⚠️ 警告:从环境变量获取 COMMIT_MSG 失败"
}
Write-Host "正在上传Windows版本到发布: $VERSION"
$REPO = $env:GITHUB_REPOSITORY $REPO = $env:GITHUB_REPOSITORY
$API = "https://git.fig-lang.cn/api/v1/repos/$REPO" $API = "https://git.fig-lang.cn/api/v1/repos/$REPO"
$TOKEN = $env:GITEA_TOKEN $TOKEN = $env:GITEA_TOKEN
$HEADERS = @{
Authorization = "token $TOKEN"
'Content-Type' = 'application/json'
}
# 🔧 新增:检查必需的文件是否存在
$ZIP_FILE = "Fig-$VERSION-windows-x86_64.zip" $ZIP_FILE = "Fig-$VERSION-windows-x86_64.zip"
$HASH_FILE = "Fig-$VERSION-windows-x86_64.sha256" $HASH_FILE = "Fig-$VERSION-windows-x86_64.sha256"
$INSTALLER_PATH = "Installer\ConsoleInstaller\dist\windows\FigSetup.exe" $INSTALLER_PATH = "Installer\ConsoleInstaller\dist\windows\FigSetup.exe"
if (-not (Test-Path $ZIP_FILE)) { if (-not (Test-Path $ZIP_FILE)) {
Write-Host "❌ 错误找不到ZIP文件 $ZIP_FILE" Write-Host "❌ 错误找不到ZIP文件 $ZIP_FILE"
Get-ChildItem *.zip
exit 1 exit 1
} }
Write-Host "正在为Windows版本创建/更新发布 $VERSION ..."
# 🔧 关键修改直接创建发布不先检查与Linux逻辑一致
$CREATE_BODY = @{ $CREATE_BODY = @{
tag_name = $VERSION tag_name = $VERSION
name = "Fig $VERSION" name = "Fig $VERSION"
@@ -302,66 +304,62 @@ jobs:
prerelease = $false prerelease = $false
} | ConvertTo-Json -Compress } | ConvertTo-Json -Compress
Write-Host "创建发布请求体: $CREATE_BODY" Write-Host "正在检查版本 $VERSION 的发布状态..."
$RELEASE_ID = $null
# 直接创建发布Gitea会自动处理重复创建 try {
$RESPONSE = Invoke-RestMethod -Method Post -Uri "$API/releases" ` $EXISTING = Invoke-RestMethod -Uri "$API/releases/tags/$VERSION" -Headers $HEADERS -ErrorAction Stop
-Headers @{ if ($EXISTING -and $EXISTING.id) {
Authorization = "token $TOKEN" $RELEASE_ID = $EXISTING.id
'Content-Type' = 'application/json' Write-Host "✅ 找到已有发布 (ID: $RELEASE_ID),正在更新..."
} -Body $CREATE_BODY -ErrorAction SilentlyContinue Invoke-RestMethod -Method Patch -Uri "$API/releases/$RELEASE_ID" -Headers $HEADERS -Body $CREATE_BODY -ErrorAction Stop | Out-Null
}
} catch {
Write-Host "未找到已有发布,准备创建新发布..."
}
if (-not $RESPONSE -or -not $RESPONSE.id) { if (-not $RELEASE_ID) {
# 如果创建失败尝试通过标签获取已有发布的ID try {
Write-Host "创建失败,尝试获取已有发布..." Write-Host "正在创建新发布: $VERSION ..."
$RESPONSE = Invoke-RestMethod -Uri "$API/releases/tags/$VERSION" ` $RESPONSE = Invoke-RestMethod -Method Post -Uri "$API/releases" -Headers $HEADERS -Body $CREATE_BODY -ErrorAction Stop
-Headers @{Authorization = "token $TOKEN" } ` $RELEASE_ID = $RESPONSE.id
-ErrorAction SilentlyContinue Write-Host "✅ 发布创建成功 (ID: $RELEASE_ID)"
} catch {
# 发布存在,更新它以包含最新的提交消息 $err = $_.Exception.Message
if ($RESPONSE -and $RESPONSE.id) { Write-Host "❌ 创建发布失败: $err"
Write-Host "更新已有发布的说明..." # 最后一次尝试:再次尝试按标签获取,防止由于并发导致的冲突
Invoke-RestMethod -Method Patch -Uri "$API/releases/$($RESPONSE.id)" ` try {
-Headers @{ $RETRY = Invoke-RestMethod -Uri "$API/releases/tags/$VERSION" -Headers $HEADERS -ErrorAction Stop
Authorization = "token $TOKEN" $RELEASE_ID = $RETRY.id
'Content-Type' = 'application/json' Write-Host "✅ 重试获取发布成功 (ID: $RELEASE_ID)"
} -Body $CREATE_BODY -ErrorAction SilentlyContinue | Out-Null } catch {
Write-Host "❌ 无法获取或创建发布 ID"
exit 1
}
} }
} }
if ($RESPONSE -and $RESPONSE.id) { # 上传资产
$RELEASE_ID = $RESPONSE.id Write-Host "正在上传文件..."
Write-Host "✅ 使用发布 ID: $RELEASE_ID 进行上传" $ASSETS = @(
} else { @{ Name = $ZIP_FILE; Path = $ZIP_FILE; ContentType = "application/octet-stream" },
Write-Host "❌ 错误:无法获取或创建发布 ID" @{ Name = $HASH_FILE; Path = $HASH_FILE; ContentType = "text/plain" }
exit 1 )
if (Test-Path $INSTALLER_PATH) {
$ASSETS += @{ Name = "FigSetup.exe"; Path = $INSTALLER_PATH; ContentType = "application/octet-stream" }
} }
# 上传资产 foreach ($asset in $ASSETS) {
Write-Host "正在上传 ZIP 文件..." Write-Host "正在上传 $($asset.Name) ..."
Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=$ZIP_FILE" ` try {
-Headers @{ # 如果资产已存在Gitea 可能会报错,这里简单处理
Authorization = "token $TOKEN" Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=$($asset.Name)" `
'Content-Type' = 'application/octet-stream' -Headers @{ Authorization = "token $TOKEN"; 'Content-Type' = $asset.ContentType } `
} -InFile $ZIP_FILE -ErrorAction SilentlyContinue -InFile $asset.Path -ErrorAction SilentlyContinue | Out-Null
} catch {
Write-Host "正在上传校验文件..." Write-Host "⚠️ 上传 $($asset.Name) 失败,可能已存在。"
Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=$HASH_FILE" ` }
-Headers @{
Authorization = "token $TOKEN"
'Content-Type' = 'text/plain'
} -InFile $HASH_FILE -ErrorAction SilentlyContinue
# 上传Windows安装器
if (Test-Path $INSTALLER_PATH) {
Write-Host "正在上传Windows安装器..."
Invoke-RestMethod -Method Post -Uri "$API/releases/$RELEASE_ID/assets?name=FigSetup.exe" `
-Headers @{
Authorization = "token $TOKEN"
'Content-Type' = 'application/octet-stream'
} -InFile $INSTALLER_PATH -ErrorAction SilentlyContinue
} else {
Write-Host "⚠️ 警告:未找到安装器文件 $INSTALLER_PATH"
} }
Write-Host "✅ Windows版本发布完成" Write-Host "✅ Windows版本发布完成"