Flutter CI CD Pipeline Using Github Actions.
When running xcodebuild -workspace Runner.xcworkspace -scheme Runner -configuration "Release-staging" DEVELOPMENT_TEAM=XXXXXXXX -sdk 'iphoneos' -destination 'generic/platform=iOS' -archivePath build-output/app.xcarchive clean archive CODE_SIGN_IDENTITY="Apple Development"
/Users/runner/work/AppName/AppName/ios/Pods/Pods.xcodeproj: error: No signing certificate "iOS Development" found: No "iOS Development" signing certificate matching team ID "XXXXXXXXX" with a private key was found. (in target 'firebase_core' from project 'Pods')
/Users/runner/work/AppName/AppName/ios/Pods/Pods.xcodeproj: error: No signing certificate "iOS Development" found: No "iOS Development" signing certificate matching team ID "XXXXXXXX" with a private key was found. (in target 'flutter_phone_direct_caller' from project 'Pods')
/Users/runner/work/AppName/AppName/ios/Pods/Pods.xcodeproj: error: No signing certificate "iOS Development" found: No "iOS Development" signing certificate matching team ID "XXXXXXX" with a private key was found. (in target 'device_info' from project 'Pods')
. . . . (For all other 3rd party dependencies) . .
** ARCHIVE FAILED **
Error: Process completed with exit code 65.
Full Pipeline .yml
name: Deploy iOS to Firebase App Distribution on merge on: push: branches: - dev jobs: build-ios: runs-on: macos-latest defaults: run: working-directory: ios
steps:
- uses: actions/checkout@v3
- uses: subosito/flutter-action@v2
- name: Install Dependencies
run: flutter packages get
- name: Install the Apple certificate and provisioning profile
env:
BUILD_CERTIFICATE_BASE64: ${{ secrets.STAGING_BUILD_CERTIFICATE_BASE64 }}
P12_PASSWORD: ${{ secrets.STAGING_P12_PASSWORD }}
BUILD_PROVISION_PROFILE_BASE64: ${{ secrets.STAGING_BUILD_PROVISION_PROFILE_BASE64 }}
KEYCHAIN_PASSWORD: ${{ secrets.STAGING_KEYCHAIN_PASSWORD }}
run: |
# 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 --output $CERTIFICATE_PATH
echo -n "$BUILD_PROVISION_PROFILE_BASE64" | base64 --decode --output $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
- name: Build
run: flutter build ios --release --no-codesign
- name: Build resolve Swift dependencies
run: xcodebuild -resolvePackageDependencies -workspace Runner.xcworkspace -scheme Runner -configuration "Release"
- name: Build xArchive
run: |
xcodebuild -workspace Runner.xcworkspace -scheme Runner -configuration "Release-staging" DEVELOPMENT_TEAM=XXXXXXXXXX -sdk 'iphoneos' -destination 'generic/platform=iOS' -archivePath build-output/app.xcarchive clean archive CODE_SIGN_IDENTITY="Apple Development"
- name: Export ipa
run: |
xcodebuild -exportArchive -archivePath build-output/app.xcarchive -exportPath build-output/ios -exportOptionsPlist ios/ExportOption.plist
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: App.ipa
path: /Users/runner/work/MyMobileApp/MyMobileApp/app/build-output/ios/MyMobileApp.ipa
retention-days: 1
if-no-files-found: error
- name: Clean up keychain and provisioning profile
if: ${{ always() }}
run: |
security delete-keychain $RUNNER_TEMP/app-signing.keychain-db
rm ~/Library/MobileDevice/Provisioning\ Profiles/build_pp.mobileprovision
distribute-ios: needs: build-ios runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/download-artifact@v2 with: name: App.ipa
- name: Firebase App Distribution
uses: wzieba/[email protected]
with:
appId: ${{secrets.IOS_FIREBASE_APP_ID_STAGING}}
token: ${{secrets.FIREBASE_TOKEN}}
groups: internal-testing-ios
file: MyMobileApp.ipa