From ed23209c8aec40bcb8131e39ebd4500e81f6644d Mon Sep 17 00:00:00 2001 From: Andrew Vineyard Date: Mon, 16 Feb 2026 13:57:54 -0600 Subject: [PATCH 1/5] Testing publish of builds --- .github/workflows/build-exes.yml | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/.github/workflows/build-exes.yml b/.github/workflows/build-exes.yml index f87fcc3..1466ad5 100644 --- a/.github/workflows/build-exes.yml +++ b/.github/workflows/build-exes.yml @@ -3,9 +3,7 @@ name: Build Windows EXEs on: push: branches: - - main - tags: - - 'v*' + - dev pull_request: workflow_dispatch: @@ -87,8 +85,8 @@ jobs: if-no-files-found: error release: - name: Publish Release - if: startsWith(github.ref, 'refs/tags/v') + name: Publish Rolling Release + if: github.ref == 'refs/heads/dev' needs: build-windows-x64 runs-on: ubuntu-latest permissions: @@ -99,14 +97,26 @@ jobs: uses: actions/download-artifact@v4 with: name: fca-exes-windows-x64 + path: dist/windows-x64 + + - name: Remove existing rolling assets + shell: bash + run: | + gh release view rolling --json assets -q '.assets[].name' \ + | xargs -r -I {} gh release delete-asset rolling "{}" -y + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: Create Release and upload assets + - name: Create or update rolling release and upload assets uses: softprops/action-gh-release@v2 with: - tag_name: ${{ github.ref_name }} - name: Release ${{ github.ref_name }} + tag_name: rolling + name: Rolling Release + target_commitish: ${{ github.sha }} files: dist/windows-x64/* - generate_release_notes: true + generate_release_notes: false allow_updates: true + make_latest: true + fail_on_unmatched_files: true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 8f5c9fa6540ee0caf43d0d4f57f395fd76991976 Mon Sep 17 00:00:00 2001 From: Andrew Vineyard Date: Mon, 16 Feb 2026 14:01:58 -0600 Subject: [PATCH 2/5] test 2. --- .github/workflows/build-exes.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/build-exes.yml b/.github/workflows/build-exes.yml index 1466ad5..bce27c9 100644 --- a/.github/workflows/build-exes.yml +++ b/.github/workflows/build-exes.yml @@ -106,6 +106,7 @@ jobs: | xargs -r -I {} gh release delete-asset rolling "{}" -y env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} - name: Create or update rolling release and upload assets uses: softprops/action-gh-release@v2 From b266a9ee2c2d1702da5cf5ac631b4eb42d4b2ad8 Mon Sep 17 00:00:00 2001 From: Andrew Vineyard Date: Mon, 16 Feb 2026 14:05:17 -0600 Subject: [PATCH 3/5] test 3: previous failure was expecting data to exist, failing when it couldn't delete what doesn't exist. --- .github/workflows/build-exes.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build-exes.yml b/.github/workflows/build-exes.yml index bce27c9..df94f4e 100644 --- a/.github/workflows/build-exes.yml +++ b/.github/workflows/build-exes.yml @@ -102,8 +102,11 @@ jobs: - name: Remove existing rolling assets shell: bash run: | - gh release view rolling --json assets -q '.assets[].name' \ - | xargs -r -I {} gh release delete-asset rolling "{}" -y + if gh release view rolling --json assets -q '.assets[].name' > /tmp/rolling_assets.txt; then + cat /tmp/rolling_assets.txt | xargs -r -I {} gh release delete-asset rolling "{}" -y + else + echo "Rolling release not found yet; skipping asset cleanup." + fi env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} GH_REPO: ${{ github.repository }} From b5a0a9abd9a598a32ce624ea4798817eedfdeea4 Mon Sep 17 00:00:00 2001 From: Andrew Vineyard Date: Mon, 16 Feb 2026 14:08:55 -0600 Subject: [PATCH 4/5] test4. Previous succeeded, now to test if rolling will work with updated actions. --- .github/workflows/build-exes.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build-exes.yml b/.github/workflows/build-exes.yml index df94f4e..7933a87 100644 --- a/.github/workflows/build-exes.yml +++ b/.github/workflows/build-exes.yml @@ -119,7 +119,7 @@ jobs: target_commitish: ${{ github.sha }} files: dist/windows-x64/* generate_release_notes: false - allow_updates: true + overwrite_files: true make_latest: true fail_on_unmatched_files: true env: From 0ce2341c04f2ebc59aea8f0f729158e686bce4a7 Mon Sep 17 00:00:00 2001 From: Andrew Vineyard Date: Mon, 16 Feb 2026 14:19:43 -0600 Subject: [PATCH 5/5] Last push before merging back into Main. --- .github/workflows/build-exes.yml | 4 + .github/workflows/manual-release.yml | 135 +++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 .github/workflows/manual-release.yml diff --git a/.github/workflows/build-exes.yml b/.github/workflows/build-exes.yml index 7933a87..a0bc83b 100644 --- a/.github/workflows/build-exes.yml +++ b/.github/workflows/build-exes.yml @@ -117,6 +117,10 @@ jobs: tag_name: rolling name: Rolling Release target_commitish: ${{ github.sha }} + body: | + Build from ${{ github.sha }} + + ${{ github.event.head_commit.message }} files: dist/windows-x64/* generate_release_notes: false overwrite_files: true diff --git a/.github/workflows/manual-release.yml b/.github/workflows/manual-release.yml new file mode 100644 index 0000000..7a5460a --- /dev/null +++ b/.github/workflows/manual-release.yml @@ -0,0 +1,135 @@ +name: Manual Release + +on: + workflow_dispatch: + inputs: + release_tag: + description: "Release tag (e.g., v1.2.3)" + required: true + type: string + release_name: + description: "Release title" + required: true + type: string + release_notes: + description: "Release notes (optional; leave blank to auto-generate)" + required: false + type: string + prerelease: + description: "Mark this release as a prerelease" + required: true + type: boolean + default: false + +jobs: + test: + name: Test (unittest + pytest) + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.ref }} + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install dependencies + working-directory: python + run: | + python -m pip install --upgrade pip + pip install -r requirements-build.txt + pip install pytest + + - name: Run unit tests + working-directory: python + run: python -m unittest discover -s tests -v + + - name: Run pytest + working-directory: python + run: pytest tests/ -v + + build-windows-x64: + name: Build (windows-x64) + needs: test + runs-on: windows-latest + timeout-minutes: 30 + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + ref: ${{ github.ref }} + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install build dependencies + working-directory: python + run: | + python -m pip install --upgrade pip + python -m pip install -r requirements-build.txt + + - name: Run parity smoke test + working-directory: python + run: | + python -m unittest tests.test_fca_unittest.TestFCAToolParity.test_tool_encode_decode_matches_standalone -v + + - name: Ensure icon file exists + working-directory: python + run: | + if (!(Test-Path small-logo.ico)) { + python build_icon.py --input-file small-logo.png --output-file small-logo.ico + } + + - name: Build executables + working-directory: python + run: | + python -m PyInstaller --clean --noconfirm --onefile --icon small-logo.ico --name fca-encode --distpath ../dist/windows-x64 fca_encode.py + python -m PyInstaller --clean --noconfirm --onefile --icon small-logo.ico --name fca-decode --distpath ../dist/windows-x64 fca_decode.py + python -m PyInstaller --clean --noconfirm --onefile --icon small-logo.ico --name fca-tool --distpath ../dist/windows-x64 fca_tool.py + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: fca-exes-windows-x64 + path: dist/windows-x64 + if-no-files-found: error + + release: + name: Publish Release + needs: build-windows-x64 + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Download windows-x64 artifacts + uses: actions/download-artifact@v4 + with: + name: fca-exes-windows-x64 + path: dist/windows-x64 + + - name: Create release and upload assets + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ inputs.release_tag }} + name: ${{ inputs.release_name }} + target_commitish: ${{ github.sha }} + body: ${{ inputs.release_notes }} + generate_release_notes: ${{ inputs.release_notes == '' }} + files: dist/windows-x64/* + overwrite_files: true + make_latest: true + prerelease: ${{ inputs.prerelease }} + fail_on_unmatched_files: true + # Placeholder for custom changelog input: + # append_body: true + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}