# docs https://github.com/marketplace/actions/create-release # docs https://github.com/ncipollo/release-action # docs https://docs.github.com/en/actions/using-jobs/choosing-the-runner-for-a-job#choosing-github-hosted-runners name: release on: push: tags: - 'v*' jobs: linux: strategy: fail-fast: false matrix: arch: [x64, arm64] runs-on: ubuntu-22.04 permissions: contents: write steps: # electron build - uses: actions/checkout@v2 with: # needed for git commit history changelog fetch-depth: 0 - name: Setup Node.js v22 uses: actions/setup-node@v2 with: node-version: 22 - name: Install dependencies (with Node v22) run: yarn install --frozen-lockfile --ignore-engines # make sure the ipfs executable is executable - name: Download IPFS and set permissions (with Node v22) run: node electron/download-ipfs && sudo chmod +x bin/linux/ipfs - name: Build React app (with Node v22) run: CI='' NODE_ENV=production yarn build - name: Build Electron app for Linux (arm64) if: ${{ matrix.arch == 'arm64' }} run: yarn electron:build:linux:arm64 - name: Build Electron app for Linux (x64) if: ${{ matrix.arch == 'x64' }} run: yarn electron:build:linux:x64 - name: List dist directory run: ls dist # publish version release - name: Generate release body run: node scripts/release-body > release-body.txt - uses: ncipollo/release-action@v1 with: artifacts: 'dist/seedit*.AppImage,dist/seedit*-arm64.AppImage,dist/seedit-html*.zip' token: ${{ secrets.GITHUB_TOKEN }} replacesArtifacts: true omitBody: true allowUpdates: true mac: strategy: fail-fast: false matrix: include: - runner: macOS-13 # Intel x64 arch: x64 - runner: macOS-14 # Apple Silicon arm64 arch: arm64 runs-on: ${{ matrix.runner }} permissions: contents: write steps: # electron build - uses: actions/checkout@v2 with: # needed for git commit history changelog fetch-depth: 0 - name: Setup Node.js v22 uses: actions/setup-node@v2 with: node-version: 22 - name: Setup Python 3.12 uses: actions/setup-python@v5 with: python-version: '3.12' - name: Install dependencies (with Node v22) run: yarn install --frozen-lockfile --ignore-engines # make sure the ipfs executable is executable - name: Download IPFS and set permissions (with Node v22) run: node electron/download-ipfs && sudo chmod +x bin/mac/ipfs - name: Build React app (with Node v22) run: CI='' NODE_ENV=production yarn build - name: Build Electron app for Mac (with Node v22) env: CSC_IDENTITY_AUTO_DISCOVERY: 'false' run: | if [ "${{ matrix.arch }}" = "arm64" ]; then yarn electron:build:mac:arm64 else yarn electron:build:mac:x64 fi - name: List dist directory run: ls dist # publish version release - name: Generate release body run: node scripts/release-body > release-body.txt - uses: ncipollo/release-action@v1 with: artifacts: 'dist/seedit*.dmg,dist/seedit*-arm64.dmg' token: ${{ secrets.GITHUB_TOKEN }} replacesArtifacts: true omitBody: true allowUpdates: true windows: runs-on: windows-2022 permissions: contents: write steps: # electron build - uses: actions/checkout@v2 with: # needed for git commit history changelog fetch-depth: 0 - name: Setup Node.js v22 # electron-rebuild needs Node 22+ uses: actions/setup-node@v2 with: node-version: 22 - name: Install dependencies (with Node v22) # --network-timeout and --network-concurrency are yarn v1 flags. run: yarn install --frozen-lockfile --network-timeout 100000 --network-concurrency 1 - name: Build React app (with Node v22) run: npx cross-env NODE_ENV=production yarn build - name: Build Electron app for Windows (x64) run: yarn electron:build:windows - name: List dist directory run: dir dist # publish version release - name: Generate release body run: node scripts/release-body > release-body.txt - uses: ncipollo/release-action@v1 with: artifacts: 'dist/seedit*.exe' token: ${{ secrets.GITHUB_TOKEN }} replacesArtifacts: true omitBody: true allowUpdates: true android: runs-on: ubuntu-22.04 permissions: contents: write steps: - uses: actions/checkout@v2 with: # needed to use 'git tag' and get all tags and for git commit history changelog fetch-depth: 0 - uses: actions/setup-java@v3 with: distribution: 'zulu' java-version: '17' - uses: gradle/gradle-build-action@v2 with: gradle-version: 8.9 - uses: actions/setup-node@v2 with: node-version: 22 - run: sudo apt install -y apksigner zipalign # install all dependencies (including devDependencies needed for React build) - name: Install dependencies (with Node v22) run: yarn install --frozen-lockfile --ignore-engines # build react app - run: CI='' NODE_ENV=production yarn build # set android versionCode and versionName - run: sed -i "s/versionCode 1/versionCode $(git tag | wc -l)/" ./android/app/build.gradle - run: sed -i "s/versionName \"1.0\"/versionName \"$(node -e "console.log(require('./package.json').version)")\"/" ./android/app/build.gradle - run: cat ./android/app/build.gradle # build apk - run: npx cap update - run: npx cap copy - run: cd android && gradle bundle - run: cd android && ./gradlew assembleRelease --stacktrace # optimize apk - run: cd android/app/build/outputs/apk/release && zipalign 4 app-release-unsigned.apk app-release-unsigned-zip.apk # sign apk # to create keystore: keytool -genkey -v -keystore plebbit.keystore -keyalg RSA -keysize 2048 -validity 10000 -alias release - run: cd android/app/build/outputs/apk/release && apksigner sign --ks ../../../../../plebbit.keystore --ks-pass pass:${{ secrets.PLEBBIT_REACT_KEYSTORE_PASSWORD }} --ks-key-alias release --out app-release-signed.apk app-release-unsigned-zip.apk # move apk to dist folder - run: mkdir -p dist && mv android/app/build/outputs/apk/release/app-release-signed.apk dist/seedit-$(node -e "console.log(require('./package.json').version)").apk - run: ls dist # publish version release - run: node scripts/release-body > release-body.txt - uses: ncipollo/release-action@v1 with: artifacts: 'dist/seedit*.apk' token: ${{ secrets.GITHUB_TOKEN }} replacesArtifacts: true omitBody: true allowUpdates: true finalize-release: runs-on: ubuntu-22.04 needs: [linux, mac, windows, android] steps: - uses: actions/checkout@v2 with: fetch-depth: 0 - name: Setup Node.js v22 uses: actions/setup-node@v2 with: node-version: 22 - name: Install dependencies run: yarn install --frozen-lockfile --ignore-engines - name: Generate final release body from GitHub assets env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_REPOSITORY: ${{ github.repository }} GITHUB_REF_NAME: ${{ github.ref_name }} run: node scripts/release-body > release-body.txt - name: Update release body only uses: ncipollo/release-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} allowUpdates: true bodyFile: "release-body.txt"