diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c8dc1fd..2c66bb9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -20,7 +20,7 @@ env: MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} permissions: - contents: read + contents: write jobs: release: @@ -62,3 +62,24 @@ jobs: - name: Release to App Store Connect run: bundle exec fastlane release + + - name: Read release version + id: release_version + run: | + version=$(ruby -e 'project = File.read("DevLog.xcodeproj/project.pbxproj"); match = project.match(/MARKETING_VERSION = ([^;]+);/); abort("MARKETING_VERSION not found") if match.nil?; puts match[1]') + echo "version=$version" >> "$GITHUB_OUTPUT" + echo "tag=v$version" >> "$GITHUB_OUTPUT" + + - name: Create GitHub Release + env: + GH_TOKEN: ${{ github.token }} + run: | + if gh release view "${{ steps.release_version.outputs.tag }}" >/dev/null 2>&1; then + echo "Release already exists for ${{ steps.release_version.outputs.tag }}" + exit 0 + fi + + gh release create "${{ steps.release_version.outputs.tag }}" \ + --target "${{ github.event.pull_request.merge_commit_sha }}" \ + --title "${{ steps.release_version.outputs.tag }}" \ + --generate-notes diff --git a/.github/workflows/testflight.yml b/.github/workflows/testflight.yml index 8da2b06..c53575d 100644 --- a/.github/workflows/testflight.yml +++ b/.github/workflows/testflight.yml @@ -2,8 +2,8 @@ name: iOS TestFlight on: push: - branches: - - develop + tags: + - "qa-*" workflow_dispatch: env: diff --git a/fastlane/Fastfile b/fastlane/Fastfile index d491150..e0b72a8 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -8,17 +8,17 @@ platform :ios do private_lane :fetch_latest_testflight_build_number do |options| require "spaceship" - apiKey = options[:api_key] - versionNumber = options[:version] + api_key = options[:api_key] + version_number = options[:version] - Spaceship::ConnectAPI.token = Spaceship::ConnectAPI::Token.create(**apiKey) + Spaceship::ConnectAPI.token = Spaceship::ConnectAPI::Token.create(**api_key) app = Spaceship::ConnectAPI::App.find(APP_IDENTIFIER) UI.user_error!("Could not find app for #{APP_IDENTIFIER}") if app.nil? filter = { "state" => "PROCESSING,FAILED,COMPLETE", - "cfBundleShortVersionString" => versionNumber, + "cfBundleShortVersionString" => version_number, "platform" => Spaceship::ConnectAPI::Platform.map("ios") } @@ -54,21 +54,21 @@ platform :ios do api_key = asc_api_key - versionNumber = get_version_number( + version_number = get_version_number( xcodeproj: XCODE_PROJ, target: TARGET_NAME ) - latestTestflightBuildNumber = fetch_latest_testflight_build_number( + latest_testflight_build_number = fetch_latest_testflight_build_number( api_key: api_key, - version: versionNumber + version: version_number ) setup_ci if ENV["CI"] increment_build_number( xcodeproj: XCODE_PROJ, - build_number: latestTestflightBuildNumber + 1 + build_number: latest_testflight_build_number + 1 ) match( @@ -84,8 +84,8 @@ platform :ios do ) if ENV["CI"] == "true" - provisioningProfileSpecifier = lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING][APP_IDENTIFIER].to_s - UI.user_error!("Missing App Store provisioning profile mapping for #{APP_IDENTIFIER}") if provisioningProfileSpecifier.empty? + provisioning_profile_specifier = lane_context[SharedValues::MATCH_PROVISIONING_PROFILE_MAPPING][APP_IDENTIFIER].to_s + UI.user_error!("Missing App Store provisioning profile mapping for #{APP_IDENTIFIER}") if provisioning_profile_specifier.empty? update_code_signing_settings( use_automatic_signing: false, @@ -95,7 +95,7 @@ platform :ios do targets: [TARGET_NAME], build_configurations: ["Release"], code_sign_identity: "Apple Distribution", - profile_name: provisioningProfileSpecifier + profile_name: provisioning_profile_specifier ) end @@ -123,13 +123,26 @@ platform :ios do end lane :release do - api_key = build_for_store + api_key = asc_api_key + version_number = get_version_number( + xcodeproj: XCODE_PROJ, + target: TARGET_NAME + ) + latest_testflight_build_number = fetch_latest_testflight_build_number( + api_key: api_key, + version: version_number + ) + + UI.user_error!("No existing TestFlight build found for #{version_number}") if latest_testflight_build_number <= 0 upload_to_app_store( api_key: api_key, + app_version: version_number, + build_number: latest_testflight_build_number.to_s, force: true, skip_metadata: true, skip_screenshots: true, + skip_binary_upload: true, submit_for_review: true, automatic_release: false )