Skip to content

Generate artifacts for PR #7

Generate artifacts for PR

Generate artifacts for PR #7

Workflow file for this run

name: PR Artifacts
run-name: Generate artifacts for PR
on:
pull_request:
branches:
- main
paths:
- 'android/**'
- 'ios/**'
- 'src/**'
- 'src-tauri/**'
- 'static/**'
- 'package.json'
- '.vercelignore'
- 'svelte.config.js'
- 'tailwind.config.js'
- 'capacitor.config.ts'
- 'vite/config.prod.mjs'
- '.github/workflows/pr-artifacts.yml'
workflow_dispatch:
defaults:
run:
shell: bash
jobs:
metadata:
name: Retrieve metadata
runs-on: ubuntu-22.04
concurrency:
group: 'pr-artifacts'
cancel-in-progress: false
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Specify version
id: version
run: echo "VERSION=$(jq -r '.version' package.json)" >> $GITHUB_OUTPUT
- name: Specify current datetime
id: current-datetime
run: echo "CURRENT_DATETIME=$(date +'%m%d-%H%M%S')" >> $GITHUB_OUTPUT
outputs:
version: ${{ steps.version.outputs.VERSION }}
current-datetime: ${{ steps.current-datetime.outputs.CURRENT_DATETIME }}
version-name: ${{ steps.version.outputs.VERSION }}_${{ steps.current-datetime.outputs.CURRENT_DATETIME }}
generate-capacitor-ios:
name: Build for iOS
runs-on: macos-15
needs: metadata
permissions:
contents: write
concurrency:
group: 'pr-artifacts-ios'
cancel-in-progress: false
steps:
- name: Confirm build version and datetime
run: |
echo "Version: ${{ needs.metadata.outputs.version }}"
echo "Build datetime: ${{ needs.metadata.outputs.current-datetime }}"
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Ruby
uses: ruby/setup-ruby@v1
with:
ruby-version: '3.3'
- name: Install dependencies
run: pnpm i
- name: Install iOS dependencies
run: |
cd ios/App
pod install
- name: Create build
run: pnpm build
env:
PUBLIC_SENTRY_DSN: ${{ vars.PUBLIC_SENTRY_DSN }}
- name: Generate icons and splash screen
run: if [ -d "./resources" ]; then pnpm i -D @capacitor/assets && pnpm capacitor-assets generate --ios; fi
- name: Install code-signing certificate, provisioning profiles and API key
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.APPLE_CERTIFICATE }}
P12_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
PROVISIONING_PROFILE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE }}
PROVISIONING_PROFILE_SE_BASE64: ${{ secrets.APPLE_PROVISIONING_PROFILE_SHARE_EXTENSION }}
KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
ASC_API_KEY_BASE64: ${{ secrets.APPLE_ASC_API_KEY }}
ASC_API_KEY_ID: ${{ secrets.APPLE_ASC_API_KEY_ID }}
run: |
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
PP_PATH=$RUNNER_TEMP/app.mobileprovision
PPSE_PATH=$RUNNER_TEMP/share-extension.mobileprovision
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
ASC_API_KEY_PATH=$RUNNER_TEMP/AuthKey_${ASC_API_KEY_ID}.p8
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH
echo -n "$PROVISIONING_PROFILE_BASE64" | base64 --decode -o $PP_PATH
echo -n "$PROVISIONING_PROFILE_SE_BASE64" | base64 --decode -o $PPSE_PATH
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: -k "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH
security list-keychain -d user -s $KEYCHAIN_PATH
mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
cp $PP_PATH $PPSE_PATH ~/Library/MobileDevice/Provisioning\ Profiles
echo -n "$ASC_API_KEY_BASE64" | base64 --decode -o $ASC_API_KEY_PATH
- name: Build project
run: |
xcodebuild -workspace ios/App/App.xcworkspace -scheme App \
-archivePath $RUNNER_TEMP/App.xcarchive \
-destination generic/platform=iOS \
-sdk iphoneos \
clean archive
- name: Assemble IPA
env:
EXPORT_OPTIONS_PLIST: ${{ secrets.APPLE_EXPORT_OPTIONS_IPA }}
ASC_API_KEY_ID: ${{ secrets.APPLE_ASC_API_KEY_ID }}
ASC_API_KEY_ISSUER_ID: ${{ secrets.APPLE_ASC_API_KEY_ISSUER_ID }}
run: |
EXPORT_OPTIONS_PATH=$RUNNER_TEMP/ExportOptionsIPA.plist
ASC_API_KEY_PATH=$RUNNER_TEMP/AuthKey_${ASC_API_KEY_ID}.p8
echo -n "$EXPORT_OPTIONS_PLIST" | base64 --decode -o $EXPORT_OPTIONS_PATH
xcodebuild archive -archivePath $RUNNER_TEMP/App.xcarchive \
-exportArchive -exportOptionsPlist $EXPORT_OPTIONS_PATH \
-exportPath $RUNNER_TEMP/build \
-allowProvisioningUpdates \
-authenticationKeyID $ASC_API_KEY_ID \
-authenticationKeyIssuerID $ASC_API_KEY_ISSUER_ID \
-authenticationKeyPath $ASC_API_KEY_PATH
- name: Move and rename build
run: |
mkdir -p ~/artifacts/ios/
mv $RUNNER_TEMP/build/App.ipa ~/artifacts/ios/PhiZone.Player_${{ needs.metadata.outputs.version-name }}.ipa
ls -l ~/artifacts/ios/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: capacitor-ios-${{ needs.metadata.outputs.version-name }}
path: ~/artifacts/ios/*
- name: Clean up keychain, provisioning profiles and artifacts
if: ${{ always() }}
run: |
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
rm ~/Library/MobileDevice/Provisioning\ Profiles/app.mobileprovision
rm ~/Library/MobileDevice/Provisioning\ Profiles/share-extension.mobileprovision
rm -rf ~/artifacts/
generate-capacitor-android:
name: Build for Android
runs-on: ubuntu-22.04
needs: metadata
permissions:
contents: write
concurrency:
group: 'pr-artifacts-android'
cancel-in-progress: false
steps:
- name: Confirm build version and datetime
run: |
echo "Version: ${{ needs.metadata.outputs.version }}"
echo "Build datetime: ${{ needs.metadata.outputs.current-datetime }}"
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Setup Java
uses: actions/setup-java@v4
with:
distribution: 'zulu'
java-version: '21'
- name: Install dependencies
run: pnpm i
- name: Create build
run: pnpm build
env:
PUBLIC_SENTRY_DSN: ${{ vars.PUBLIC_SENTRY_DSN }}
- name: Generate icons and splash screen
run: if [ -d "./resources" ]; then pnpm i -D @capacitor/assets && pnpm capacitor-assets generate --android; fi
- name: Build app bundle
run: cd android && chmod +x ./gradlew && ./gradlew bundle && ./gradlew assembleRelease
- name: Sign APK
id: sign-apk
uses: kevin-david/zipalign-sign-android-release@v2
with:
releaseDirectory: android/app/build/outputs/apk/release/
signingKeyBase64: ${{ secrets.RELEASE_KEYSTORE }}
keyStorePassword: ${{ secrets.RELEASE_KEYSTORE_PASSWORD }}
zipAlign: true
- name: Move and rename builds
run: |
mkdir -p ~/artifacts/android/
mv android/app/build/outputs/bundle/release/app-release.aab ~/artifacts/android/PhiZone.Player_${{ needs.metadata.outputs.version-name }}.aab
mv ${{ steps.sign-apk.outputs.signedReleaseFile }} ~/artifacts/android/PhiZone.Player_${{ needs.metadata.outputs.version-name }}.apk
ls -l ~/artifacts/android/
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: capacitor-android-${{ needs.metadata.outputs.version-name }}
path: ~/artifacts/android/*
- name: Clean up artifacts
if: ${{ always() }}
run: |
rm -rf ~/artifacts/
generate-tauri:
name: Build with Tauri
needs: metadata
permissions:
contents: write
concurrency:
group: 'pr-artifacts-tauri-${{ matrix.platform }}-${{ matrix.args }}'
cancel-in-progress: false
strategy:
fail-fast: false
matrix:
include:
- platform: 'ubuntu-22.04'
args: ''
- platform: 'ubuntu-22.04-arm'
args: ''
- platform: 'windows-latest'
args: ''
- platform: 'windows-latest'
args: '--target aarch64-pc-windows-msvc'
- platform: 'macos-latest'
args: '--target aarch64-apple-darwin'
- platform: 'macos-latest'
args: '--target x86_64-apple-darwin'
runs-on: ${{ matrix.platform }}
steps:
- name: Confirm build version and datetime
run: |
echo "Version: ${{ needs.metadata.outputs.version }}"
echo "Build datetime: ${{ needs.metadata.outputs.current-datetime }}"
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: lts/*
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10
- name: Install Rust stable
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.platform == 'macos-latest' && 'aarch64-apple-darwin,x86_64-apple-darwin' || (matrix.platform == 'windows-latest' && 'aarch64-pc-windows-msvc' || '') }}
- name: Install dependencies (Ubuntu only)
if: startsWith(matrix.platform, 'ubuntu-')
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf xdg-utils
- name: Install frontend dependencies
run: pnpm i
- name: Build
id: build
uses: tauri-apps/tauri-action@v0
env:
GITHUB_TOKEN: ${{ secrets.ACCESS_TOKEN }}
PUBLIC_SENTRY_DSN: ${{ vars.PUBLIC_SENTRY_DSN }}
with:
includeDebug: true
args: ${{ matrix.args }}
- name: Move and rename builds
run: |
IFS=','
SPACE='.SPACE_PLACEHOLDER.'
mkdir -p ~/artifacts/tauri/
artifact_paths=$(echo '${{ steps.build.outputs.artifactPaths }}' | sed -e 's/\[//g; s/\]//g' -e 's/["]//g' -e 's/ /$SPACE/g')
for artifact_path in $artifact_paths; do
original_path=$(echo "$artifact_path" | sed -e 's/$SPACE/ /g')
if [[ "$original_path" == *.app ]]; then
echo "Skipping $original_path"
continue
fi
renamed_path=$(echo "$original_path" | sed -E "s/PhiZone Player[_-]${{ needs.metadata.outputs.version }}(-1)?/PhiZone.Player_${{ needs.metadata.outputs.version-name }}/g")
echo "Renaming: $original_path -> $renamed_path"
mv "$original_path" "$renamed_path"
mv "$renamed_path" ~/artifacts/tauri/
done
- name: Generate artifact info
id: info
run: echo "NAME=tauri-${{ matrix.platform }}-$(echo ${{ matrix.args || '--target x86_64' }} | sed 's/.* //')-${{ needs.metadata.outputs.version-name }}" >> $GITHUB_OUTPUT
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ steps.info.outputs.NAME }}
path: ~/artifacts/tauri/*
- name: Clean up artifacts
if: ${{ always() }}
run: |
rm -rf ~/artifacts/