diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 64c65d9..de65198 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,6 +5,7 @@ on: env: SCHEME: DevLog + XCODE_VERSION: latest permissions: contents: read @@ -22,7 +23,7 @@ jobs: - name: Set up Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: latest + xcode-version: ${{ env.XCODE_VERSION }} - name: Cache SwiftPM uses: actions/cache@v4 @@ -230,4 +231,4 @@ jobs: repo: context.repo.repo, issue_number: context.payload.pull_request.number, body - }); \ No newline at end of file + }); diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 9620784..cc77a12 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -7,6 +7,18 @@ on: branches: - main +env: + RUBY_VERSION: "3.2" + XCODE_VERSION: latest + APP_STORE_TEAM_ID: ${{ secrets.APP_STORE_TEAM_ID }} + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + ASC_KEY_PATH: fastlane/AuthKey.p8 + SPACESHIP_CONNECT_API_IN_HOUSE: "false" + MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + permissions: contents: read @@ -15,15 +27,6 @@ jobs: if: github.event.pull_request.merged == true && github.event.pull_request.base.ref == 'main' && github.event.pull_request.head.ref == 'develop' runs-on: macos-latest timeout-minutes: 45 - env: - APP_STORE_TEAM_ID: ${{ secrets.APP_STORE_TEAM_ID }} - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY_PATH: fastlane/AuthKey.p8 - SPACESHIP_CONNECT_API_IN_HOUSE: "false" - MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }} - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} steps: - name: Checkout merge commit @@ -35,12 +38,12 @@ jobs: uses: ruby/setup-ruby@v1 with: bundler-cache: true - ruby-version: "3.2" + ruby-version: ${{ env.RUBY_VERSION }} - name: Set up Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: latest + xcode-version: ${{ env.XCODE_VERSION }} - name: Write App Store Connect API key env: @@ -48,5 +51,9 @@ jobs: run: | printf '%s' "$ASC_KEY_CONTENT" | base64 -D > "$ASC_KEY_PATH" + - name: Debug ASC key fingerprint + run: | + shasum -a 256 "$ASC_KEY_PATH" + - name: Release to App Store Connect run: bundle exec fastlane release diff --git a/.github/workflows/testflight.yml b/.github/workflows/testflight.yml index 5d877ce..eb87281 100644 --- a/.github/workflows/testflight.yml +++ b/.github/workflows/testflight.yml @@ -6,22 +6,25 @@ on: - develop workflow_dispatch: +env: + RUBY_VERSION: "3.2" + XCODE_VERSION: latest + APP_STORE_TEAM_ID: ${{ secrets.APP_STORE_TEAM_ID }} + ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} + ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} + ASC_KEY_PATH: fastlane/AuthKey.p8 + SPACESHIP_CONNECT_API_IN_HOUSE: "false" + MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }} + MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} + MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} + permissions: contents: read jobs: - beta: + testflight: runs-on: macos-latest timeout-minutes: 45 - env: - APP_STORE_TEAM_ID: ${{ secrets.APP_STORE_TEAM_ID }} - ASC_KEY_ID: ${{ secrets.ASC_KEY_ID }} - ASC_ISSUER_ID: ${{ secrets.ASC_ISSUER_ID }} - ASC_KEY_PATH: fastlane/AuthKey.p8 - SPACESHIP_CONNECT_API_IN_HOUSE: "false" - MATCH_GIT_URL: ${{ secrets.MATCH_GIT_URL }} - MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} - MATCH_GIT_BASIC_AUTHORIZATION: ${{ secrets.MATCH_GIT_BASIC_AUTHORIZATION }} steps: - name: Checkout @@ -31,12 +34,12 @@ jobs: uses: ruby/setup-ruby@v1 with: bundler-cache: true - ruby-version: "3.2" + ruby-version: ${{ env.RUBY_VERSION }} - name: Set up Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: latest + xcode-version: ${{ env.XCODE_VERSION }} - name: Write App Store Connect API key env: @@ -44,5 +47,9 @@ jobs: run: | printf '%s' "$ASC_KEY_CONTENT" | base64 -D > "$ASC_KEY_PATH" + - name: Debug ASC key fingerprint + run: | + shasum -a 256 "$ASC_KEY_PATH" + - name: Upload to TestFlight - run: bundle exec fastlane beta + run: bundle exec fastlane deploy_testflight diff --git a/.gitignore b/.gitignore index 328aec7..650d110 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ vendor/bundle/ # Fastlane .fastlane/ +fastlane/README.md fastlane/report.xml fastlane/test_output/ fastlane/logs/ diff --git a/fastlane/Fastfile b/fastlane/Fastfile index b118be5..d491150 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -1,6 +1,39 @@ +XCODE_PROJ = "DevLog.xcodeproj" +APP_IDENTIFIER = "opfic.DevLog" +TARGET_NAME = "DevLog" + default_platform(:ios) platform :ios do + private_lane :fetch_latest_testflight_build_number do |options| + require "spaceship" + + apiKey = options[:api_key] + versionNumber = options[:version] + + Spaceship::ConnectAPI.token = Spaceship::ConnectAPI::Token.create(**apiKey) + + 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, + "platform" => Spaceship::ConnectAPI::Platform.map("ios") + } + + build = Spaceship::ConnectAPI.get_build_uploads( + app_id: app.id, + filter: filter, + sort: "-uploadedDate", + limit: 1 + ).first + + next 0 if build.nil? + + next build.cf_build_version.to_i + end + private_lane :asc_api_key do app_store_connect_api_key( key_id: ENV["ASC_KEY_ID"], @@ -11,16 +44,38 @@ platform :ios do end private_lane :build_for_store do + if ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"].to_s.strip.empty? + ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "30" + end + + if ENV["FASTLANE_XCODEBUILD_SETTINGS_RETRIES"].to_s.strip.empty? + ENV["FASTLANE_XCODEBUILD_SETTINGS_RETRIES"] = "5" + end + api_key = asc_api_key + versionNumber = get_version_number( + xcodeproj: XCODE_PROJ, + target: TARGET_NAME + ) + + latestTestflightBuildNumber = fetch_latest_testflight_build_number( + api_key: api_key, + version: versionNumber + ) + setup_ci if ENV["CI"] - if ENV["GITHUB_RUN_NUMBER"] - increment_build_number( - xcodeproj: "DevLog.xcodeproj", - build_number: ENV["GITHUB_RUN_NUMBER"] - ) - end + increment_build_number( + xcodeproj: XCODE_PROJ, + build_number: latestTestflightBuildNumber + 1 + ) + + match( + api_key: api_key, + type: "development", + readonly: ENV["CI"] == "true" + ) match( api_key: api_key, @@ -28,16 +83,33 @@ platform :ios do readonly: ENV["CI"] == "true" ) + 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? + + update_code_signing_settings( + use_automatic_signing: false, + path: XCODE_PROJ, + sdk: "iphoneos*", + team_id: ENV["APP_STORE_TEAM_ID"], + targets: [TARGET_NAME], + build_configurations: ["Release"], + code_sign_identity: "Apple Distribution", + profile_name: provisioningProfileSpecifier + ) + end + build_app( - project: "DevLog.xcodeproj", - scheme: "DevLog", - export_method: "app-store" + project: XCODE_PROJ, + scheme: TARGET_NAME, + export_method: "app-store", + xcargs: "-skipPackagePluginValidation" ) next api_key end - lane :beta do + lane :deploy_testflight do api_key = build_for_store upload_to_testflight( @@ -46,6 +118,10 @@ platform :ios do ) end + lane :testflight_build_only do + build_for_store + end + lane :release do api_key = build_for_store diff --git a/fastlane/README.md b/fastlane/README.md deleted file mode 100644 index 761f24b..0000000 --- a/fastlane/README.md +++ /dev/null @@ -1,40 +0,0 @@ -fastlane documentation ----- - -# Installation - -Make sure you have the latest version of the Xcode command line tools installed: - -```sh -xcode-select --install -``` - -For _fastlane_ installation instructions, see [Installing _fastlane_](https://docs.fastlane.tools/#installing-fastlane) - -# Available Actions - -## iOS - -### ios beta - -```sh -[bundle exec] fastlane ios beta -``` - - - -### ios release - -```sh -[bundle exec] fastlane ios release -``` - - - ----- - -This README.md is auto-generated and will be re-generated every time [_fastlane_](https://fastlane.tools) is run. - -More information about _fastlane_ can be found on [fastlane.tools](https://fastlane.tools). - -The documentation of _fastlane_ can be found on [docs.fastlane.tools](https://docs.fastlane.tools).