name: Release on: push: tags: - 'v*' # v1.0.0, v2.1.0 등 태그 push 시 트리거 jobs: build-and-release: runs-on: windows-latest steps: - uses: actions/checkout@v4 - name: Set up Python 3.10 uses: actions/setup-python@v5 with: python-version: '3.10' - name: Install dependencies + PyInstaller run: | python -m pip install --upgrade pip pip install -r requirements.txt pip install pyinstaller - name: Run unit tests env: QT_QPA_PLATFORM: offscreen run: | pip install pytest pytest tests -q - name: Run integration tests run: python _integration_test.py - name: Build main.exe run: python -m PyInstaller --clean main.spec - name: Build updater.exe run: python -m PyInstaller --clean updater.spec - name: Verify both exe exist run: | if (-not (Test-Path dist/main.exe)) { throw "main.exe missing" } if (-not (Test-Path dist/updater.exe)) { throw "updater.exe missing" } - name: Create release archive run: | New-Item -ItemType Directory -Path dist/release -Force Copy-Item dist/main.exe dist/release/ Copy-Item dist/updater.exe dist/release/ Compress-Archive -Path dist/release/* -DestinationPath dist/ClockOutCalculator.zip -Force - name: Publish Release (Gitea) uses: actions/release-action@main with: api_key: ${{ secrets.RELEASE_TOKEN }} files: | dist/main.exe dist/updater.exe dist/ClockOutCalculator.zip # GitHub Actions 호환 fallback (Gitea Actions에서 동작 안 할 경우) # 위 release-action이 실패하면 아래를 활용: # # - name: Publish Release (manual via API) # shell: pwsh # env: # GITEA_TOKEN: ${{ secrets.RELEASE_TOKEN }} # GITEA_HOST: https://kindnick-git.duckdns.org # OWNER: kindnick # REPO: Clock_out_Time_Calculator # run: | # $tag = $env:GITHUB_REF -replace 'refs/tags/', '' # $body = @{ tag_name = $tag; name = $tag; draft = $false } | ConvertTo-Json # $headers = @{ Authorization = "token $env:GITEA_TOKEN" } # $release = Invoke-RestMethod -Uri "$env:GITEA_HOST/api/v1/repos/$env:OWNER/$env:REPO/releases" ` # -Method Post -Headers $headers -ContentType 'application/json' -Body $body # $uploadUrl = "$env:GITEA_HOST/api/v1/repos/$env:OWNER/$env:REPO/releases/$($release.id)/assets" # foreach ($f in @('dist/main.exe', 'dist/updater.exe')) { # $name = [System.IO.Path]::GetFileName($f) # Invoke-RestMethod -Uri "$uploadUrl?name=$name" -Method Post ` # -Headers $headers -InFile $f -ContentType 'application/octet-stream' # }