Xcode - Build #56
This file contains hidden or 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: Xcode - Build | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: Release version (e.g. 1.0.0) | |
| type: string | |
| required: true | |
| jobs: | |
| build: | |
| name: Build using xcodebuild command | |
| runs-on: macos-latest | |
| env: | |
| scheme: iRAM-Plus | |
| archive_path: archive | |
| outputs: | |
| scheme: ${{ steps.scheme.outputs.scheme }} | |
| archive_path: ${{ env.archive_path }} | |
| steps: | |
| - uses: maxim-lobanov/setup-xcode@v1 | |
| with: | |
| xcode-version: '26.4' | |
| - name: Checkout | |
| uses: actions/checkout@v3 | |
| with: | |
| submodules: recursive | |
| - name: Update App Version | |
| run: | | |
| # Update MARKETING_VERSION using sed | |
| sed -i '' "s/MARKETING_VERSION = .*/MARKETING_VERSION = ${{ inputs.version }};/g" iRAM-Plus.xcodeproj/project.pbxproj | |
| # Count non-alpha releases and increment | |
| release_count=$(gh release list --exclude-pre-releases --limit 100 | wc -l) | |
| build_number=$((release_count + 1)) | |
| # Update CURRENT_PROJECT_VERSION using sed | |
| sed -i '' "s/CURRENT_PROJECT_VERSION = .*/CURRENT_PROJECT_VERSION = $build_number;/g" iRAM-Plus.xcodeproj/project.pbxproj | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| - name: Set Scheme | |
| id: scheme | |
| run: | | |
| if [ $scheme = default ] | |
| then | |
| scheme_list=$(xcodebuild -list -json | tr -d "\n") | |
| scheme=$(echo $scheme_list | ruby -e "require 'json'; puts JSON.parse(STDIN.gets)['project']['targets'][0]") | |
| echo Using default scheme: $scheme | |
| else | |
| echo Using configured scheme: $scheme | |
| fi | |
| echo "scheme=$scheme" >> $GITHUB_OUTPUT | |
| - name: Set filetype_parameter | |
| id: filetype_parameter | |
| run: | | |
| filetype_parameter=`ls -A | grep -i \\.xcworkspace\$ && echo workspace || echo project` | |
| echo "filetype_parameter=$filetype_parameter" >> $GITHUB_OUTPUT | |
| - name: Set file_to_build | |
| id: file_to_build | |
| run: | | |
| file_to_build=`ls -A | grep -i \\.xcworkspace\$ || ls -A | grep -i \\.xcodeproj\$` | |
| file_to_build=`echo $file_to_build | awk '{$1=$1;print}'` | |
| echo "file_to_build=$file_to_build" >> $GITHUB_OUTPUT | |
| - name: Build | |
| env: | |
| scheme: ${{ steps.scheme.outputs.scheme }} | |
| filetype_parameter: ${{ steps.filetype_parameter.outputs.filetype_parameter }} | |
| file_to_build: ${{ steps.file_to_build.outputs.file_to_build }} | |
| run: xcodebuild clean build -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -sdk iphoneos -arch arm64 -configuration Release CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]} | |
| - name: Analyze | |
| env: | |
| scheme: ${{ steps.scheme.outputs.scheme }} | |
| filetype_parameter: ${{ steps.filetype_parameter.outputs.filetype_parameter }} | |
| file_to_build: ${{ steps.file_to_build.outputs.file_to_build }} | |
| run: xcodebuild analyze -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -sdk iphoneos -arch arm64 -configuration Release CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]} | |
| - name: Archive | |
| env: | |
| scheme: ${{ steps.scheme.outputs.scheme }} | |
| filetype_parameter: ${{ steps.filetype_parameter.outputs.filetype_parameter }} | |
| file_to_build: ${{ steps.file_to_build.outputs.file_to_build }} | |
| run: xcodebuild archive -archivePath "$archive_path" -scheme "$scheme" -"$filetype_parameter" "$file_to_build" -sdk iphoneos -arch arm64 -configuration Release CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO | xcpretty && exit ${PIPESTATUS[0]} | |
| - name: Tar Build Artifact | |
| run: tar -cvf "$archive_path.xcarchive.tar" "$archive_path.xcarchive" | |
| - name: Upload a Build Artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ env.archive_path }}.xcarchive.tar | |
| path: ${{ env.archive_path }}.xcarchive.tar | |
| package: | |
| name: Create fake-signed ipa | |
| runs-on: ubuntu-latest | |
| needs: [build] | |
| env: | |
| scheme: ${{ needs.build.outputs.scheme }} | |
| archive_path: ${{ needs.build.outputs.archive_path }} | |
| outputs: | |
| artifact: ${{ env.scheme }}.ipa | |
| steps: | |
| - name: Download a Build Artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: ${{ env.archive_path }}.xcarchive.tar | |
| - name: Extract Build Artifact | |
| run: tar -xf "$archive_path.xcarchive.tar" | |
| - name: Install ldid | |
| run: | | |
| if [ `uname -s` = "Linux" ]; then | |
| curl -sSL -o /usr/local/bin/ldid "${{ github.server_url }}/ProcursusTeam/ldid/releases/latest/download/ldid_linux_`uname -m`" | |
| chmod +x /usr/local/bin/ldid | |
| elif [ `uname -s` = "Darwin" ]; then | |
| brew install ldid | |
| else | |
| exit 1 | |
| fi | |
| - name: Fakesign | |
| run: | | |
| find "$archive_path.xcarchive/Products/Applications/$scheme.app" -type d -path '*/Frameworks/*.framework' -exec ldid -S \{\} \; | |
| ldid -S "$archive_path.xcarchive/Products/Applications/$scheme.app" | |
| - name: Create IPA | |
| run: | | |
| mv "$archive_path.xcarchive/Products/Applications" Payload | |
| zip -r "$scheme.ipa" "Payload" -x "._*" -x ".DS_Store" -x "__MACOSX" | |
| - name: Upload a Build Artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ env.scheme }}.ipa | |
| path: ${{ env.scheme }}.ipa | |
| release: | |
| name: Release | |
| permissions: | |
| contents: write | |
| runs-on: ubuntu-latest | |
| needs: [package] | |
| concurrency: | |
| group: release | |
| cancel-in-progress: true | |
| steps: | |
| - name: Download a Build Artifact | |
| uses: actions/download-artifact@v4 | |
| with: | |
| name: ${{ needs.package.outputs.artifact }} | |
| - name: Release | |
| uses: softprops/action-gh-release@v3 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| tag_name: v${{ inputs.version }} | |
| name: Alpha v${{ inputs.version }} | |
| prerelease: true | |
| update_existing: true | |
| body: | | |
| This is a release [created automatically with GitHub Actions workflow](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/attempts/${{ github.run_attempt }}). | |
| files: | | |
| ${{ needs.package.outputs.artifact }} |