chore: 添加自动编译并发布的工作流

This commit is contained in:
知一一 2025-05-29 14:29:27 +08:00
parent b93eec024e
commit 7eaf734b8b
3 changed files with 494 additions and 155 deletions

View File

@ -0,0 +1,337 @@
name: Compile AHK 2.0 and Release
on:
push:
tags:
- "v**"
workflow_dispatch:
jobs:
build-and-release:
runs-on: windows-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: List all files in the repository for debugging
shell: pwsh
run: |
Write-Host "--- Listing all files in the repository root ($(Get-Location)) after checkout ---"
Get-ChildItem -Path (Get-Location) -Recurse | Select-Object FullName, Name, DirectoryName, Mode | Sort-Object FullName
Write-Host "--- End of repository file listing ---"
- name: Download and Setup AutoHotkey v2 Core (v2.0.19)
shell: pwsh
run: |
$ahkTag = "v2.0.19" # GitHub release tag name, usually starts with 'v'
$ahkFileNameVersion = "2.0.19" # File name part, usually without 'v'
# 正确的文件名应该是 AutoHotkey_2.0.19.zip
$ahkZipFileName = "AutoHotkey_${ahkFileNameVersion}.zip"
$ahkZipUrl = "https://github.com/AutoHotkey/AutoHotkey/releases/download/$ahkTag/$ahkZipFileName"
$ahkExtractPath = "AutoHotkey_v2_Core_Files"
Write-Host "Downloading AutoHotkey v2 Core from ${ahkZipUrl}"
# 仍然保留 -UseBasicParsing 以防万一
Invoke-WebRequest -Uri $ahkZipUrl -OutFile "ahk-v2-core.zip" -ErrorAction Stop -UseBasicParsing
Write-Host "Extracting AutoHotkey v2 Core to ${ahkExtractPath}"
Expand-Archive -Path "ahk-v2-core.zip" -DestinationPath $ahkExtractPath -Force
Write-Host "Listing contents of ${ahkExtractPath} after extraction:"
Get-ChildItem -Path $ahkExtractPath -Recurse | Select-Object FullName, Name, DirectoryName | Sort-Object FullName
Write-Host "--- End of AutoHotkey v2 Core file listing ---"
$ahkMainPath = Join-Path $PWD $ahkExtractPath
$ahkUXPath = Join-Path $PWD $ahkExtractPath "UX"
if ((Test-Path "$ahkMainPath\AutoHotkey.exe") -or `
(Test-Path "$ahkMainPath\AutoHotkey64.exe") -or `
(Test-Path "$ahkUXPath\AutoHotkey.exe") -or `
(Test-Path "$ahkUXPath\AutoHotkey64.exe")) {
Write-Host "AutoHotkey interpreter found in main or UX directory."
Write-Host "Adding ${ahkMainPath} to PATH (for AutoHotkey interpreter)"
Add-Content $env:GITHUB_PATH "$ahkMainPath"
if (Test-Path $ahkUXPath) {
Write-Host "Adding ${ahkUXPath} to PATH (for AutoHotkey interpreter in UX folder)"
Add-Content $env:GITHUB_PATH "$ahkUXPath"
}
} else {
Write-Error "AutoHotkey interpreter (e.g., AutoHotkey.exe, AutoHotkey64.exe) not found in expected paths. Check the file listing above."
exit 1
}
- name: Download and Setup Ahk2Exe (using GitHub API)
shell: pwsh
run: |
$repoOwner = "AutoHotkey"
$repoName = "Ahk2Exe"
$ahk2ExeExtractPath = "AutoHotkey_Ahk2Exe_Files"
$maxRetries = 5
$retryDelaySeconds = 10 # 每次重试等待10秒
$attempt = 0
$success = $false
$ahk2ExeZipUrl = "" # 动态获取的下载链接
while ($attempt -lt $maxRetries -and -not $success) {
$attempt++
Write-Host "Attempt ${attempt} of ${maxRetries}: Fetching latest Ahk2Exe release information..."
try {
# 使用 Invoke-RestMethod 获取最新 release 信息
$releaseInfo = Invoke-RestMethod -Uri "https://api.github.com/repos/${repoOwner}/${repoName}/releases/latest" -Headers @{Authorization = "token ${{ secrets.GITHUB_TOKEN }}"} -ErrorAction Stop
# 从 assets 中找到 .zip 文件
$zipAsset = $releaseInfo.assets | Where-Object { $_.name -like "*.zip" }
if ($zipAsset) {
$ahk2ExeZipUrl = $zipAsset.browser_download_url
Write-Host "Found Ahk2Exe download URL: ${ahk2ExeZipUrl}"
# 下载文件
Write-Host "Downloading Ahk2Exe from ${ahk2ExeZipUrl}"
Invoke-WebRequest -Uri $ahk2ExeZipUrl -OutFile "ahk2exe.zip" -ErrorAction Stop -UseBasicParsing # 确保这里有 -UseBasicParsing
$success = $true
Write-Host "Ahk2Exe downloaded successfully."
} else {
Write-Warning "Could not find a .zip asset in the latest Ahk2Exe release."
if ($attempt -lt $maxRetries) {
Write-Host "Retrying in ${retryDelaySeconds} seconds..."
Start-Sleep -Seconds $retryDelaySeconds
}
}
} catch {
Write-Warning "Failed to fetch release info or download Ahk2Exe: $($_.Exception.Message)"
if ($attempt -lt $maxRetries) {
Write-Host "Retrying in ${retryDelaySeconds} seconds..."
Start-Sleep -Seconds $retryDelaySeconds
}
}
}
if (-not $success) {
Write-Error "Failed to download Ahk2Exe after ${maxRetries} attempts."
exit 1
}
Write-Host "Extracting Ahk2Exe to ${ahk2ExeExtractPath}"
Expand-Archive -Path "ahk2exe.zip" -DestinationPath $ahk2ExeExtractPath -Force
Write-Host "Listing contents of ${ahk2ExeExtractPath} after extraction:"
Get-ChildItem -Path $ahk2ExeExtractPath -Recurse | Select-Object FullName, Name, DirectoryName | Sort-Object FullName
Write-Host "--- End of Ahk2Exe file listing ---"
$ahk2ExeBinPath = Join-Path $PWD $ahk2ExeExtractPath
if (Test-Path "$ahk2ExeBinPath\Ahk2Exe.exe") {
Write-Host "Found Ahk2Exe.exe in: ${ahk2ExeBinPath}"
Write-Host "Adding ${ahk2ExeBinPath} to PATH (for Ahk2Exe.exe)"
Add-Content $env:GITHUB_PATH "$ahk2ExeBinPath"
} else {
Write-Error "Ahk2Exe.exe not found in '${ahk2ExeBinPath}'. Check the Ahk2Exe file listing above."
exit 1
}
- name: Verify Ahk2Exe in PATH
shell: pwsh
run: |
Write-Host "Verifying Ahk2Exe command in new PowerShell session..."
if (-not (Get-Command Ahk2Exe -ErrorAction SilentlyContinue)) {
Write-Error "Ahk2Exe.exe not found in PATH. This is unexpected after previous setup."
Write-Host "Current PATH: ${env:PATH}"
exit 1
}
Write-Host "Ahk2Exe found in PATH at: ${((Get-Command Ahk2Exe).Path)}"
- name: Test AutoHotkey Interpreter (Optional but good for debugging)
shell: pwsh
run: |
$scriptToTest = "test_compile.ahk" # 或者 DoroHelper.ahk
$ahkExeName = "AutoHotkey64.exe"
$ahkCoreExtractPath = "AutoHotkey_v2_Core_Files"
$ahkInterpreterPath = Join-Path $PWD $ahkCoreExtractPath $ahkExeName
if (-not (Test-Path $ahkInterpreterPath)) {
$ahkInterpreterPath = Join-Path $PWD $ahkCoreExtractPath "UX" $ahkExeName
}
if (-not (Test-Path $ahkInterpreterPath)) {
Write-Warning "64-bit interpreter (${ahkExeName}) not found for testing. Falling back to AutoHotkey32.exe."
$ahkExeName = "AutoHotkey32.exe"
$ahkInterpreterPath = Join-Path $PWD $ahkCoreExtractPath $ahkExeName
if (-not (Test-Path $ahkInterpreterPath)) {
$ahkInterpreterPath = Join-Path $PWD $ahkCoreExtractPath "UX" $ahkExeName
}
}
if (-not (Test-Path $ahkInterpreterPath)) {
Write-Error "Could not find any AutoHotkey interpreter for testing in '${ahkCoreExtractPath}'."
Get-ChildItem -Path (Join-Path $PWD $ahkCoreExtractPath) -Recurse | Select-Object FullName, Name
exit 1
}
Write-Host "Attempting to run ${scriptToTest} with ${ahkInterpreterPath}..."
$testOutput = (& "$ahkInterpreterPath" "$scriptToTest" 2>&1)
$testExitCode = $LASTEXITCODE
Write-Host "--- AutoHotkey Interpreter Test Output ---"
Write-Host $testOutput
Write-Host "Interpreter Exit Code: ${testExitCode}"
Write-Host "--- End of Interpreter Test Output ---"
if ($testExitCode -ne 0) {
Write-Warning "Interpreter test failed with exit code ${testExitCode}. This might indicate an issue with the script or interpreter setup."
} else {
Write-Host "Interpreter test successful."
}
- name: Compile AutoHotkey Script (Detailed Error Logging)
id: compile_script
shell: pwsh
run: |
$ahkCoreExtractPath = "AutoHotkey_v2_Core_Files"
$scriptFile = "DoroHelper.ahk" # 使用您的实际脚本名称
$iconFile = "doro.ico"
$outputExe = "DoroHelper.exe" # 输出 EXE 的名称
Write-Host "--- Diagnosing Ahk2Exe and Dependencies ---"
Write-Host "Attempting to run Ahk2Exe.exe without arguments to get usage info..."
# 运行 Ahk2Exe.exe 并捕获其所有输出
try {
$ahk2ExeHelpOutput = (& Ahk2Exe.exe 2>&1)
Write-Host "Ahk2Exe.exe no-arg output:"
Write-Host $ahk2ExeHelpOutput
} catch {
Write-Error "Failed to run Ahk2Exe.exe without arguments. Is it in PATH correctly? Error: $($_.Exception.Message)"
exit 1
}
if (-not (Test-Path $scriptFile)) {
Write-Error "AHK script file '${scriptFile}' not found at $(Resolve-Path $scriptFile -ErrorAction SilentlyContinue). Current working directory: $(Get-Location)."
exit 1
} else {
Write-Host "AHK script file found: $(Resolve-Path $scriptFile)"
}
if ($iconFile -and (Test-Path $iconFile)) {
Write-Host "Icon file found: $(Resolve-Path $iconFile)"
} else {
Write-Warning "Icon file '${iconFile}' not found. Proceeding without custom icon."
$iconFile = ""
}
Write-Host "Listing contents of current working directory ($(Get-Location)):"
Get-ChildItem -Path (Get-Location) -Recurse -Depth 1 | Select-Object FullName, Name, DirectoryName, Mode | Sort-Object FullName
Write-Host "--- End of current working directory listing ---"
# 优先尝试使用 64 位基础二进制文件进行编译
$baseBinaryName = "AutoHotkey64.exe"
$baseBinaryPath = Join-Path $PWD $ahkCoreExtractPath $baseBinaryName
if (-not (Test-Path $baseBinaryPath)) {
$baseBinaryPath = Join-Path $PWD $ahkCoreExtractPath "UX" $baseBinaryName
}
# 如果 64 位不存在,回退到 32 位
if (-not (Test-Path $baseBinaryPath)) {
Write-Warning "64-bit base binary (${baseBinaryName}) not found. Falling back to AutoHotkey32.exe."
$baseBinaryName = "AutoHotkey32.exe"
$baseBinaryPath = Join-Path $PWD $ahkCoreExtractPath $baseBinaryName
if (-not (Test-Path $baseBinaryPath)) {
$baseBinaryPath = Join-Path $PWD $ahkCoreExtractPath "UX" $baseBinaryName
}
}
if (-not (Test-Path $baseBinaryPath)) {
Write-Error "Could not find a suitable 64-bit or 32-bit base binary (${baseBinaryName}) in '${ahkCoreExtractPath}' or '$(${ahkCoreExtractPath})\UX'."
Write-Host "Listing contents of ${ahkCoreExtractPath}:"
Get-ChildItem -Path (Join-Path $PWD $ahkCoreExtractPath) -Recurse | Select-Object FullName
exit 1
}
Write-Host "Using Ahk2Exe from PATH."
Write-Host "Script: ${scriptFile}"
Write-Host "Output: ${outputExe}"
Write-Host "Icon: ${iconFile}"
Write-Host "Base Binary for compilation: ${baseBinaryPath}"
# 构建编译参数
$compileArgs = @("/in", "`"$scriptFile`"", "/out", "`"$outputExe`"", "/bin", "`"$baseBinaryPath`"", "/cp", "65001", "/debug")
if ($iconFile -and (Test-Path $iconFile)) {
$compileArgs += @("/icon", "`"$iconFile`"")
}
Write-Host "Attempting to compile with Ahk2Exe.exe..."
Write-Host "Compilation Arguments: $($compileArgs -join ' ')"
# !!! 关键改进:直接执行 Ahk2Exe 并捕获其所有输出和退出代码 !!!
$ahk2ExeOutput = ""
try {
$ahk2ExeOutput = (& Ahk2Exe.exe $compileArgs 2>&1 | Out-String) # 捕获所有输出
$ahk2ExeExitCode = $LASTEXITCODE
} catch {
Write-Error "Executing Ahk2Exe.exe failed. Error: $($_.Exception.Message)"
exit 1
}
Write-Host "--- Ahk2Exe Output Start (Actual Compilation) ---"
Write-Host $ahk2ExeOutput
Write-Host "--- Ahk2Exe Output End (Actual Compilation) ---"
Write-Host "Ahk2Exe Exit Code: ${ahk2ExeExitCode}"
if ($ahk2ExeExitCode -ne 0) {
Write-Error "Compilation failed with exit code ${ahk2ExeExitCode}. ${outputExe} not found. See Ahk2Exe output above for details."
exit 1 # 编译失败,终止工作流
}
# 再次验证文件是否存在,以防 Ahk2Exe 退出代码为0但文件未生成
if (-not (Test-Path $outputExe)) {
Write-Error "Ahk2Exe reported success (exit code 0), but '${outputExe}' was not found. This indicates an issue with Ahk2Exe itself."
exit 1
}
Write-Host "${outputExe} compiled successfully."
echo "EXE_NAME=$outputExe" >> $env:GITHUB_OUTPUT
- name: Extract Version from AHK script
id: get_version
shell: pwsh
run: |
$scriptPath = "DoroHelper.ahk" # 确保这里是您的主脚本文件路径
if (-not (Test-Path $scriptPath)) {
Write-Warning "Script file '${scriptPath}' not found for version extraction. Current directory: $(Get-Location)"
echo "VERSION_TAG=0.0.0" >> $env:GITHUB_OUTPUT
exit 0
}
$content = Get-Content -Path $scriptPath -Raw
$match = $content | Select-String -Pattern 'currentVersion\s*:=\s*"([^"]+)"'
if ($match) {
$version = $match.Matches[0].Groups[1].Value
Write-Host "Version found: ${version}"
echo "VERSION_TAG=$version" >> $env:GITHUB_OUTPUT
} else {
Write-Warning "Version pattern (currentVersion := \"...\") not found in ${scriptPath}. Using default '0.0.0'."
echo "VERSION_TAG=0.0.0" >> $env:GITHUB_OUTPUT
}
- name: Determine if Pre-release
id: prerelease_check
shell: bash
run: |
VERSION_TAG="${{ steps.get_version.outputs.VERSION_TAG }}"
IS_PRERELEASE="false"
if [[ "$VERSION_TAG" == *beta* ]]; then
IS_PRERELEASE="true"
fi
echo "IS_PRERELEASE=$IS_PRERELEASE" >> $GITHUB_OUTPUT
echo "Release version: ${VERSION_TAG}, Is Prerelease: ${IS_PRERELEASE}"
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ steps.get_version.outputs.VERSION_TAG }}
name: ${{ steps.get_version.outputs.VERSION_TAG }}
body: |
Automated release for DoroHelper ${{ steps.get_version.outputs.VERSION_TAG }}
Compiled from commit ${{ github.sha }}
draft: false
prerelease: ${{ steps.prerelease_check.outputs.IS_PRERELEASE }}
files: |
DoroHelper.exe # 确保这里与 Compile AutoHotkey Script 步骤的 'outputExe' 变量一致
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

File diff suppressed because it is too large Load Diff

2
test_compile.ahk Normal file
View File

@ -0,0 +1,2 @@
MsgBox "Hello from Compiled AHK!"
ExitApp