From eb4a50779278fe63b910e165e855281e1ed3b969 Mon Sep 17 00:00:00 2001 From: Dorian Percic Date: Tue, 7 May 2024 13:29:46 +0200 Subject: [PATCH] Implement CI for MacOS/iOS export --- .github/workflows/macos_export.yml | 126 +++++++++++++++++++++++++++++ export/macos/.gitkeep | 0 godot/rust.gdextension | 4 + justfile | 14 ++-- 4 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/macos_export.yml create mode 100644 export/macos/.gitkeep diff --git a/.github/workflows/macos_export.yml b/.github/workflows/macos_export.yml new file mode 100644 index 0000000..5e8c401 --- /dev/null +++ b/.github/workflows/macos_export.yml @@ -0,0 +1,126 @@ +name: MacOS Export + +on: [push] + +env: + CARGO_TERM_COLOR: always + RUSTFLAGS: -Dwarnings + CARGO_INCREMENTAL: 0 + PROJECT_NAME: Godot Spike + WORKING_DIRECTORY: godot + IOS_APPLE_ID_USERNAME: ${{ secrets.IOS_APPLE_ID_USERNAME }} + IOS_APPLE_ID_PASSWORD: ${{ secrets.IOS_APPLE_ID_PASSWORD }} + + BUILD_CERTIFICATE_BASE64: ${{ secrets.IOS_BUILD_CERTIFICATE_BASE64 }} + P12_PASSWORD: ${{ secrets.P12_PASSWORD }} + BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.BUILD_PROVISION_PROFILE_BASE64 }} + KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} + +jobs: + export-macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + components: rustfmt, clippy + - uses: rui314/setup-mold@v1 + - uses: chickensoft-games/setup-godot@v1 + name: Setup Godot + with: + version: 4.2.2 + include-templates: true + use-dotnet: false + - uses: Swatinem/rust-cache@v2 + with: + workspaces: "rust -> target" + cache-all-crates: "true" + + - name: Install just + run: cargo install just + + - name: just Check + run: just --version + + - name: Godot Check + run: | + godot --version + + - name: Godot Export + run: | + set -x + touch godot/.godot/extension_list.cfg + echo "res://rust.gdextension" >> godot/.godot/extension_list.cfg + just macos-release + + export-ios: + runs-on: macos-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/checkout@v2 + + - uses: actions-rs/toolchain@v1 + with: + toolchain: stable + override: true + components: rustfmt, clippy + - uses: rui314/setup-mold@v1 + - uses: chickensoft-games/setup-godot@v1 + name: Setup Godot + with: + version: 4.2.2 + include-templates: true + use-dotnet: false + - uses: Swatinem/rust-cache@v2 + with: + workspaces: "rust -> target" + cache-all-crates: "true" + + - name: Install just + run: cargo install just + + - name: just Check + run: just --version + + - name: Godot Check + run: | + godot --version + + - name: Godot Export + + run: | + set -x + touch godot/.godot/extension_list.cfg + echo "res://rust.gdextension" >> godot/.godot/extension_list.cfg + + # create variables + CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 + PP_PATH=$RUNNER_TEMP/build_pp.mobileprovision + KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db + + # import certificate and provisioning profile from secrets + echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode -o $CERTIFICATE_PATH + echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode -o $PP_PATH + + # create temporary keychain + security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + security set-keychain-settings -lut 21600 $KEYCHAIN_PATH + security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH + + # import certificate to keychain + security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH + security list-keychain -d user -s $KEYCHAIN_PATH + + # apply provisioning profile + mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles + cp $PP_PATH ~/Library/MobileDevice/Provisioning\ Profiles + + xcrun xcodebuild -exportArchive \ + -allowProvisioningUpdates \ + -authenticationKeyID $(IOS_APPLE_ID_USERNAME) \ + -authenticationKeyIssuerID $(IOS_APPLE_ID_PASSWORD) + + just setup-ios + just ios-debug diff --git a/export/macos/.gitkeep b/export/macos/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/godot/rust.gdextension b/godot/rust.gdextension index bc7aa54..d78f2ae 100644 --- a/godot/rust.gdextension +++ b/godot/rust.gdextension @@ -12,3 +12,7 @@ android.debug.arm64 = "res://../rust/target/aarch64-linux-android/debug/libgo android.release.arm64 = "res://../rust/target/aarch64-linux-android/release/libgodot_plugin.so" windows.debug.x86_64 = "res://../rust/target/x86_64-pc-windows-msvc/debug/godot_plugin.dll" windows.release.x86_64 = "res://../rust/target/x86_64-pc-windows-msvc/release/godot_plugin.dll" +macos.debug.arm64 = "res://../rust/target/debug/libgodot_plugin.dylib" +macos.release.arm64 = "res://../rust/target/release/libgodot_plugin.dylib" +ios.debug.arm64 = "res://../rust/target/aarch64-apple-ios/debug/libgodot_plugin.dylib" +ios.release.arm64 = "res://../rust/target/aarch64-apple-ios/release/libgodot_plugin.dylib" diff --git a/justfile b/justfile index e30eb0a..d555037 100644 --- a/justfile +++ b/justfile @@ -56,19 +56,20 @@ windows-release: [macos] macos-debug: - {{rustdir}} cargo build + {{rustdir}} cargo build {{godotdir}} godot --headless --export-debug "macOS" "../export/macos/Godot Spike.dmg" [macos] macos-release: - {{rustdir}} cargo build --release - {{godotdir}} godot --headless --export-release "macOS" "../export/macos/Godot Spike.dmg" + {{rustdir}} cargo build + {{rustdir}} cargo build --release + {{godotdir}} godot --headless --export-release "macOS" "../export/macos/Godot Spike.dmg" [macos] ios-debug: - # NOTE: can only work on MacOS with xcode + {{rustdir}} cargo build {{rustdir}} cargo build --target aarch64-apple-ios - {{godotdir}} godot --headless --export-debug "iOS" "../export/ios/Godot Spike.ipa" + {{godotdir}} godot --headless --import --export-debug "iOS" "../export/ios/Godot Spike.ipa" [macos] ios-release: @@ -82,7 +83,6 @@ setup: just _setup-verify-dependencies _setup-precommit _setup-rust setup-{{os()}} # ------------------------------------------------- -# Execute to verify if all dependencies are installed _setup-verify-dependencies: @ {{message}} "Verifying all required programs are installed...\nAll programs need to be in \$PATH!" rustup --version @@ -106,7 +106,7 @@ setup-windows: rustup target add x86_64-pc-windows-gnu [macos] -setup-macos: +setup-ios: @ {{message}} "Installing Rust tools for iOS builds..." rustup target add aarch64-apple-ios cargo install cargo-lipo