Skip to content

ci: use gh release upload instead of softprops for asset uploads #31

ci: use gh release upload instead of softprops for asset uploads

ci: use gh release upload instead of softprops for asset uploads #31

Workflow file for this run

name: Release GUI
permissions:
contents: write
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
tag:
description: 'Tag name (e.g. v0.1.0)'
required: false
jobs:
create-release:
runs-on: ubuntu-latest
if: startsWith(github.ref, 'refs/tags/')
steps:
- name: Check if release exists
id: check
run: |
STATUS=$(curl -s -o /dev/null -w "%{http_code}" \
-H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
"https://api.github.com/repos/${{ github.repository }}/releases/tags/${{ github.ref_name }}")
echo "exists=$( [ "$STATUS" = "200" ] && echo true || echo false )" >> "$GITHUB_OUTPUT"
- name: Create GitHub Release
if: steps.check.outputs.exists == 'false'
uses: softprops/action-gh-release@v2
with:
draft: false
generate_release_notes: true
make_latest: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
build-windows:
needs: create-release
if: always() && (needs.create-release.result == 'success' || !startsWith(github.ref, 'refs/tags/'))
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Install proxy dependencies
run: cd copilot-proxy && npm install --ignore-scripts --no-package-lock
- name: Generate icons
run: node scripts/generate-icons.cjs
- name: Build frontend
run: npx vite build
- name: Bundle proxy server (JS)
run: node scripts/bundle-proxy.cjs
- name: Package with electron-builder
run: npx electron-builder --win --config electron-builder.yml
- name: Generate update manifest
run: |
node -e "
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const sha256 = f => crypto.createHash('sha256').update(fs.readFileSync(f)).digest('hex');
const asarPath = path.join('release', 'win-unpacked', 'resources', 'app.asar');
const bundlePath = path.join('build', 'copilot-proxy-bundle.mjs');
if (!fs.existsSync(asarPath) || !fs.existsSync(bundlePath)) { console.error('Missing assets'); process.exit(1); }
const pkg = require('./package.json');
const ePkg = require('./node_modules/electron/package.json');
const manifest = {
version: pkg.version,
minElectronVersion: ePkg.version.split('.')[0] + '.0.0',
assets: {
'app.asar': { size: fs.statSync(asarPath).size, sha256: sha256(asarPath) },
'copilot-proxy-bundle.mjs': { size: fs.statSync(bundlePath).size, sha256: sha256(bundlePath) },
},
};
fs.writeFileSync('release/update-manifest.json', JSON.stringify(manifest, null, 2));
fs.copyFileSync(asarPath, 'release/app.asar');
fs.copyFileSync(bundlePath, 'release/copilot-proxy-bundle.mjs');
console.log(JSON.stringify(manifest, null, 2));
"
- name: Upload to GitHub Release
if: startsWith(github.ref, 'refs/tags/')
run: gh release upload ${{ github.ref_name }} release/*.exe release/update-manifest.json release/app.asar release/copilot-proxy-bundle.mjs --clobber
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifacts (for non-tag builds)
if: "!startsWith(github.ref, 'refs/tags/')"
uses: actions/upload-artifact@v4
with:
name: windows-release
path: release/*.exe
retention-days: 30
build-macos:
needs: create-release
if: always() && (needs.create-release.result == 'success' || !startsWith(github.ref, 'refs/tags/'))
runs-on: macos-latest
strategy:
matrix:
arch: [arm64, x64]
steps:
- uses: actions/checkout@v4
with:
submodules: true
- uses: actions/setup-node@v4
with:
node-version: 20
- name: Install dependencies
run: npm ci
- name: Install proxy dependencies
run: cd copilot-proxy && npm install --ignore-scripts --no-package-lock
- name: Generate icons
run: node scripts/generate-icons.cjs
- name: Build frontend
run: npx vite build
- name: Bundle proxy server (JS)
run: node scripts/bundle-proxy.cjs
- name: Package with electron-builder
run: npx electron-builder --mac --${{ matrix.arch }} --config electron-builder.yml
env:
CSC_IDENTITY_AUTO_DISCOVERY: false
- name: Verify DMG integrity
run: |
for f in release/*.dmg; do
echo "Verifying: $f"
ls -lh "$f"
shasum -a 256 "$f"
hdiutil verify "$f"
done
- name: Upload to GitHub Release
if: startsWith(github.ref, 'refs/tags/')
run: gh release upload ${{ github.ref_name }} release/*.dmg --clobber
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload artifacts (for non-tag builds)
if: "!startsWith(github.ref, 'refs/tags/')"
uses: actions/upload-artifact@v4
with:
name: macos-release-${{ matrix.arch }}
path: release/*.dmg
retention-days: 30