diff --git a/.github/workflows/public-release-with-apk.yml b/.github/workflows/public-release-with-apk.yml new file mode 100644 index 0000000..929b561 --- /dev/null +++ b/.github/workflows/public-release-with-apk.yml @@ -0,0 +1,25 @@ +name: Create or Update Release + +on: + workflow_dispatch: + repository_dispatch: + types: [publish-apk] + +jobs: + create-or-update-release: + runs-on: ubuntu-latest + steps: + - name: Checkout script in repo + uses: actions/checkout@v3 + + - name: Run publish-release + uses: actions/github-script@v7 + id: gh-script + env: + RELEASE_ID: ${{ github.event.client_payload.release_id }} + with: + github-token: ${{ secrets.SOURCE_GH_TOKEN }} + result-encoding: string + script: | + const script = require('./publish-release.js') + await script({github, context, core}) diff --git a/publish-release.js b/publish-release.js new file mode 100644 index 0000000..db75bd6 --- /dev/null +++ b/publish-release.js @@ -0,0 +1,74 @@ +module.exports = async ({ github, context, core }) => { + const { RELEASE_ID } = process.env; + + const publish = async () => { + // Fetch release assets from the source repo + const assets = await github.rest.repos.listReleaseAssets({ + owner: context.repo.owner, + repo: 'fedi', + release_id: RELEASE_ID, + }); + + console.log(`assets: ${JSON.stringify(assets)}`); + + // Find the APK file + const apkAsset = assets.data.find((asset) => asset.name.endsWith('.apk')); + if (!apkAsset) { + throw new Error('APK file not found'); + } + + // Extract version and commit hash from the APK filename + const regex = /app-production-release-(\d+\.\d+\.\d+)-([0-9a-f]+)\.apk/; + const match = apkAsset.name.match(regex); + if (!match) { + throw new Error('Invalid APK filename format'); + } + + const [fullMatch, version, commitHash] = match; + + // Prepare new release details + const newTagName = `v${version}`; + const newTitle = `Fedi Alpha v${version.split('.').slice(0, 2).join('.')} - APK Download`; + const truncatedCommitHash = commitHash.substring(0, 6); + const newFileName = `app-production-release-${version}-${truncatedCommitHash}.apk`; + const newDescription = `Download & Test Fedi Alpha

Download: [${newFileName}](https://github.com/${context.repo.owner}/fedi-alpha/releases/download/${newTagName}/${newFileName})`; + + // Check if a release with the same title exists in the target repo + const releases = await github.rest.repos.listReleases({ + owner: context.repo.owner, + repo: 'fedi-alpha', + }); + + const existingRelease = releases.data.find((release) => release.name === newTitle); + + if (existingRelease) { + // Update existing release + await github.rest.repos.updateRelease({ + owner: context.repo.owner, + repo: 'fedi-alpha', + release_id: existingRelease.id, + tag_name: newTagName, + name: newTitle, + body: newDescription, + }); + // TODO: Upload new APK and delete old APK + } else { + // Create a new release + await github.rest.repos.createRelease({ + owner: context.repo.owner, + repo: 'fedi-alpha', + tag_name: newTagName, + name: newTitle, + body: newDescription, + }); + // TODO: Upload APK + } + }; + + try { + publish(); + } catch (error) { + console.error(error); + process.exit(1); + } +};