name: Release on: push: branches: - main - master workflow_dispatch: permissions: contents: write jobs: build-release: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 - name: Build dist run: make dist - name: Package release zip run: | short_sha="${GITHUB_SHA::7}" archive="softwarekatalog-${short_sha}.zip" echo "SHORT_SHA=${short_sha}" >> "${GITHUB_ENV}" echo "ARCHIVE=${archive}" >> "${GITHUB_ENV}" rm -rf package mkdir -p package cp LICENSE package/LICENSE cp dist/setup.ps1 package/setup.ps1 cp -R PolicyDefinitions package/PolicyDefinitions (cd package && zip -r "../${archive}" LICENSE setup.ps1 PolicyDefinitions) - name: Create or update release uses: actions/github-script@v7 env: SHORT_SHA: ${{ env.SHORT_SHA }} ARCHIVE: ${{ env.ARCHIVE }} with: script: | const fs = require('fs'); const path = require('path'); const owner = context.repo.owner; const repo = context.repo.repo; const tag = process.env.SHORT_SHA; const archive = process.env.ARCHIVE; let release; try { const existing = await github.rest.repos.getReleaseByTag({ owner, repo, tag }); release = existing.data; } catch (error) { if (error.status !== 404) throw error; const created = await github.rest.repos.createRelease({ owner, repo, tag_name: tag, target_commitish: context.sha, name: tag, body: `Automated build for ${context.sha}.`, }); release = created.data; } const assetName = path.basename(archive); for (const asset of release.assets || []) { if (asset.name === assetName) { await github.rest.repos.deleteReleaseAsset({ owner, repo, asset_id: asset.id }); } } const data = fs.readFileSync(archive); await github.rest.repos.uploadReleaseAsset({ owner, repo, release_id: release.id, name: assetName, data, headers: { 'content-type': 'application/zip', 'content-length': data.length, }, });