Time to merge #3
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: Build Release and Upload to TestFlight (iOS) | |
on: | |
push: | |
branches: | |
- master | |
pull_request: | |
types: [opened, reopened, synchronize, labeled] | |
branches: | |
- master | |
workflow_dispatch: | |
jobs: | |
build: | |
runs-on: macos-14 | |
timeout-minutes: 180 | |
outputs: | |
new_build_number: ${{ steps.generate_build_number.outputs.build_number }} | |
project_version: ${{ steps.determine_marketing_version.outputs.project_version }} | |
latest_commit_message: ${{ steps.get_latest_commit_message.outputs.commit_message }} | |
env: | |
APPLE_ID: ${{ secrets.APPLE_ID }} | |
steps: | |
- name: Checkout project | |
uses: actions/checkout@v4 | |
with: | |
fetch-depth: 0 # Fetches all history | |
- name: Specify node version | |
uses: actions/setup-node@v4 | |
with: | |
node-version: 20 | |
- uses: maxim-lobanov/setup-xcode@v1 | |
with: | |
xcode-version: 15.4 | |
- name: Set up Ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
ruby-version: 3.1.6 | |
bundler-cache: true | |
- name: Install dependencies with Bundler | |
run: bundle install | |
- name: Install node_modules | |
run: npm install | |
- name: Install CocoaPods Dependencies | |
run: | | |
gem install cocoapods | |
bundle exec pod install | |
working-directory: ./ios | |
- name: Cache CocoaPods Pods | |
uses: actions/cache@v2 | |
with: | |
path: ios/Pods | |
key: ${{ runner.os }}-pods-${{ hashFiles('**/Podfile.lock') }} | |
- name: Display release-notes.txt | |
run: cat release-notes.txt | |
- name: Get Latest Commit Message | |
id: get_latest_commit_message | |
run: | | |
LATEST_COMMIT_MESSAGE=$(git log -1 --pretty=format:"%s") | |
echo "LATEST_COMMIT_MESSAGE=${LATEST_COMMIT_MESSAGE}" >> $GITHUB_ENV | |
echo "::set-output name=commit_message::$LATEST_COMMIT_MESSAGE" | |
- name: Set up Git Authentication | |
env: | |
ACCESS_TOKEN: ${{ secrets.GIT_ACCESS_TOKEN }} | |
run: | | |
git config --global credential.helper 'cache --timeout=3600' | |
git config --global http.https://github.com/.extraheader "AUTHORIZATION: basic $(echo -n x-access-token:${ACCESS_TOKEN} | base64)" | |
- name: Create Temporary Keychain | |
run: bundle exec fastlane ios create_temp_keychain | |
working-directory: ./ios | |
env: | |
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} | |
- name: Setup Provisioning Profiles | |
env: | |
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} | |
GIT_ACCESS_TOKEN: ${{ secrets.GIT_ACCESS_TOKEN }} | |
GIT_URL: ${{ secrets.GIT_URL }} | |
ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }} | |
ITC_TEAM_NAME: ${{ secrets.ITC_TEAM_NAME }} | |
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} | |
run: | | |
bundle exec fastlane ios setup_provisioning_profiles | |
working-directory: ./ios | |
- name: Cache Provisioning Profiles | |
id: cache_provisioning_profiles | |
uses: actions/cache@v2 | |
with: | |
path: ~/Library/MobileDevice/Provisioning Profiles | |
key: ${{ runner.os }}-provisioning-profiles-${{ github.sha }} | |
restore-keys: | | |
${{ runner.os }}-provisioning-profiles- | |
- name: Check Cache Status for Provisioning Profiles | |
run: | | |
if [ -n "${{ steps.cache_provisioning_profiles.outputs.cache-hit }}" ]; then | |
echo "Provisioning profiles were restored from cache." | |
else | |
echo "No cache found for provisioning profiles. A new cache will be created." | |
fi | |
- name: Verify Provisioning Profiles Exist | |
run: | | |
if [ -d "~/Library/MobileDevice/Provisioning Profiles" ]; then | |
echo "Provisioning profiles are available in the cache." | |
ls -la ~/Library/MobileDevice/Provisioning Profiles | |
else | |
echo "Provisioning profiles directory does not exist." | |
fi | |
- name: Generate Build Number based on timestamp | |
id: generate_build_number | |
run: | | |
NEW_BUILD_NUMBER=$(date +%s) | |
echo "NEW_BUILD_NUMBER=$NEW_BUILD_NUMBER" >> $GITHUB_ENV | |
echo "::set-output name=build_number::$NEW_BUILD_NUMBER" | |
- name: Set Build Number | |
run: bundle exec fastlane ios increment_build_number_lane | |
working-directory: ./ios | |
- name: Determine Marketing Version | |
id: determine_marketing_version | |
run: | | |
MARKETING_VERSION=$(grep MARKETING_VERSION ios/BlueWallet.xcodeproj/project.pbxproj | awk -F '= ' '{print $2}' | tr -d ' ;' | head -1) | |
echo "PROJECT_VERSION=$MARKETING_VERSION" >> $GITHUB_ENV | |
echo "::set-output name=project_version::$MARKETING_VERSION" | |
- name: Expected IPA file name | |
run: | | |
echo "IPA file name: BlueWallet.${{env.PROJECT_VERSION}}(${{env.NEW_BUILD_NUMBER}}).ipa" | |
- name: Build App | |
run: bundle exec fastlane ios build_app_lane | |
working-directory: ./ios | |
- name: Upload IPA as Artifact | |
uses: actions/upload-artifact@v2 | |
with: | |
name: BlueWallet.${{env.PROJECT_VERSION}}(${{env.NEW_BUILD_NUMBER}}).ipa | |
path: ./ios/build/BlueWallet.${{env.PROJECT_VERSION}}(${{env.NEW_BUILD_NUMBER}}).ipa | |
testflight-upload: | |
needs: build | |
runs-on: macos-14 | |
if: github.event_name == 'push' || contains(github.event.pull_request.labels.*.name, 'testflight') | |
env: | |
APPLE_ID: ${{ secrets.APPLE_ID }} | |
NEW_BUILD_NUMBER: ${{ needs.build.outputs.new_build_number }} | |
PROJECT_VERSION: ${{ needs.build.outputs.project_version }} | |
LATEST_COMMIT_MESSAGE: ${{ needs.build.outputs.latest_commit_message }} | |
steps: | |
- name: Checkout project | |
uses: actions/checkout@v4 | |
- name: Set up Ruby | |
uses: ruby/setup-ruby@v1 | |
with: | |
ruby-version: 3.1.6 | |
bundler-cache: true | |
- name: Cache Ruby Gems | |
uses: actions/cache@v2 | |
with: | |
path: vendor/bundle | |
key: ${{ runner.os }}-gems-${{ hashFiles('**/Gemfile.lock') }} | |
restore-keys: | | |
${{ runner.os }}-gems- | |
- name: Install dependencies with Bundler | |
run: | | |
bundle config path vendor/bundle | |
bundle install --jobs 4 --retry 3 --quiet | |
- name: Download IPA from Artifact | |
uses: actions/download-artifact@v2 | |
with: | |
name: BlueWallet.${{ needs.build.outputs.project_version }}(${{ needs.build.outputs.new_build_number }}).ipa | |
path: ./ios/build | |
- name: Create App Store Connect API Key JSON | |
run: echo '${{ secrets.APP_STORE_CONNECT_API_KEY_CONTENT }}' > ./ios/appstore_api_key.json | |
- name: Upload to TestFlight | |
env: | |
APP_STORE_CONNECT_API_KEY_PATH: $(pwd)/ios/appstore_api_key.p8 | |
MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }} | |
GIT_ACCESS_TOKEN: ${{ secrets.GIT_ACCESS_TOKEN }} | |
GIT_URL: ${{ secrets.GIT_URL }} | |
ITC_TEAM_ID: ${{ secrets.ITC_TEAM_ID }} | |
ITC_TEAM_NAME: ${{ secrets.ITC_TEAM_NAME }} | |
APP_STORE_CONNECT_API_KEY_KEY_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_KEY_ID }} | |
APP_STORE_CONNECT_API_KEY_ISSUER_ID: ${{ secrets.APP_STORE_CONNECT_API_KEY_ISSUER_ID }} | |
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} | |
run: bundle exec fastlane ios upload_to_testflight_lane | |
working-directory: ./ios | |
- name: Post PR Comment | |
if: success() && github.event_name == 'pull_request' | |
uses: actions/github-script@v6 | |
env: | |
BUILD_NUMBER: ${{ needs.build.outputs.new_build_number }} | |
LATEST_COMMIT_MESSAGE: ${{ needs.build.outputs.latest_commit_message }} | |
with: | |
script: | | |
const buildNumber = process.env.BUILD_NUMBER; | |
const message = `The build ${buildNumber} has been uploaded to TestFlight.`; | |
const prNumber = context.payload.pull_request.number; | |
const repo = context.repo; | |
github.rest.issues.createComment({ | |
...repo, | |
issue_number: prNumber, | |
body: message, | |
}); |