From 9f3bf1bf2c444830b8aa2ec292e88717a30ba2f4 Mon Sep 17 00:00:00 2001 From: Brandon Stalnaker <33703490+BrandonStalnaker@users.noreply.github.com> Date: Wed, 13 Sep 2023 10:04:16 -0400 Subject: [PATCH] ci: Add iOS Kit Release Workflow (#10) --- .github/workflows/ios-kit-release.yml | 141 ++++++++++++++++++++++++++ Scripts/release.sh | 18 ++++ release.config.js | 37 +++++++ 3 files changed, 196 insertions(+) create mode 100644 .github/workflows/ios-kit-release.yml create mode 100755 Scripts/release.sh create mode 100644 release.config.js diff --git a/.github/workflows/ios-kit-release.yml b/.github/workflows/ios-kit-release.yml new file mode 100644 index 0000000..3397790 --- /dev/null +++ b/.github/workflows/ios-kit-release.yml @@ -0,0 +1,141 @@ +name: iOS Kit Release + +on: + workflow_dispatch: + inputs: + dryRun: + description: Do a dry run to preview instead of a real release [true/false] + required: true + default: "true" + +jobs: + # SDK release is done from main branch. + confirm-main-branch: + name: Confirm release is run from main branch + uses: mParticle/mparticle-workflows/.github/workflows/sdk-release-repo-branch-check.yml@stable + + create-release-branch: + name: Create release branch + runs-on: macOS-12 + needs: confirm-main-branch + steps: + - name: Checkout development branch + uses: actions/checkout@v3 + with: + repository: ${{ github.repository }} + token: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }} + ref: development + + - name: Create and push release branch + run: | + git checkout -b release/${{ github.run_number }} + git push origin release/${{ github.run_number }} + + release: + name: Perform release + runs-on: macOS-12 + needs: create-release-branch + env: + GITHUB_ACCESS_TOKEN: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }} + COCOAPODS_TRUNK_TOKEN: ${{ secrets.COCOAPODS_TRUNK_TOKEN }} + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Validate environment + run: | + env | grep -q '^GITHUB_ACCESS_TOKEN=' || (echo "Required environment variable GITHUB_ACCESS_TOKEN is not set" && exit 1) + env | grep -q '^COCOAPODS_TRUNK_TOKEN=' || (echo "Required environment variable COCOAPODS_TRUNK_TOKEN is not set" && exit 1) + + - name: Setup git config + run: | + git config user.email "developers@mparticle.com" + git config user.name "mParticle Automation" + + - name: Checkout main branch + uses: actions/checkout@v3 + with: + fetch-depth: 0 + repository: ${{ github.repository }} + token: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }} + ref: main + + - name: Merge release branch into main branch + run: | + git pull origin release/${{ github.run_number }} + + - name: Release --dry-run + if: ${{ github.event.inputs.dryRun == 'true'}} + env: + GITHUB_TOKEN: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }} + GIT_AUTHOR_NAME: mparticle-bot + GIT_AUTHOR_EMAIL: developers@mparticle.com + GIT_COMMITTER_NAME: mparticle-bot + GIT_COMMITTER_EMAIL: developers@mparticle.com + run: | + npx \ + -p lodash \ + -p semantic-release@17 \ + -p @semantic-release/changelog@5 \ + -p @semantic-release/git@9 \ + -p @semantic-release/exec@5 \ + semantic-release --dry-run + + - name: Release + if: ${{ github.event.inputs.dryRun == 'false'}} + env: + GITHUB_TOKEN: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }} + GIT_AUTHOR_NAME: mparticle-bot + GIT_AUTHOR_EMAIL: developers@mparticle.com + GIT_COMMITTER_NAME: mparticle-bot + GIT_COMMITTER_EMAIL: developers@mparticle.com + run: | + npx \ + -p lodash \ + -p semantic-release@17 \ + -p @semantic-release/changelog@5 \ + -p @semantic-release/git@9 \ + -p @semantic-release/exec@5 \ + semantic-release + + - name: Push automated release commits to release branch + if: ${{ github.event.inputs.dryRun == 'false' }} + run: | + ls + git status + git push origin HEAD:release/${{ github.run_number }} + + - name: Release to CocoaPods + if: ${{ github.event.inputs.dryRun == 'false'}} + run: | + sudo gem install xcodeproj + pod trunk push --allow-warnings + + sync-repository: + name: Finalize release + needs: release + runs-on: macOS-12 + steps: + - name: Checkout main branch + uses: actions/checkout@v3 + with: + fetch-depth: 0 + repository: ${{ github.repository }} + token: ${{ secrets.MP_SEMANTIC_RELEASE_BOT }} + ref: main + + - name: Merge release branch into main branch + if: ${{ github.event.inputs.dryRun == 'false' }} + run: | + git pull origin release/${{ github.run_number }} + + - name: Push release commits to main and development branches + if: ${{ github.event.inputs.dryRun == 'false'}} + run: | + git push origin HEAD:main + git push origin HEAD:development + + - name: Delete release branch + if: ${{ github.event.inputs.dryRun == 'false' }} + run: | + git push --delete origin release/${{ github.run_number }} diff --git a/Scripts/release.sh b/Scripts/release.sh new file mode 100755 index 0000000..12108de --- /dev/null +++ b/Scripts/release.sh @@ -0,0 +1,18 @@ +VERSION="$1" +PREFIXED_VERSION="v$1" +NOTES="$2" + +# Update version number +# + +# Update CocoaPods podspec file +sed -i '' 's/\(^ s.version[^=]*= \).*/\1"'"$VERSION"'"/' mParticle-Apptimize.podspec + +# Make the release commit in git +# + +git add mParticle-Apptimize.podspec +git add CHANGELOG.md +git commit -m "chore(release): $VERSION [skip ci] + +$NOTES" diff --git a/release.config.js b/release.config.js new file mode 100644 index 0000000..90b9a81 --- /dev/null +++ b/release.config.js @@ -0,0 +1,37 @@ +module.exports = { + branches: ["main"], + tagFormat: "v${version}", + plugins: [ + [ + "@semantic-release/commit-analyzer", + { + preset: "angular", + }, + ], + [ + "@semantic-release/release-notes-generator", + { + preset: "angular", + }, + ], + [ + "@semantic-release/changelog", + { + changelogFile: "CHANGELOG.md", + }, + ], + [ + "@semantic-release/exec", + { + prepareCmd: "sh ./Scripts/release.sh ${nextRelease.version} \"${nextRelease.notes}\"", + }, + ], + [ + "@semantic-release/github", + { + assets: [ + ], + }, + ], + ], + };