Generate artifacts for PR #7
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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/ |