diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml index b8ed0b016..e2416fc2b 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -98,7 +98,7 @@ jobs: sed -i "s/implementation 'com.iterable:iterableapi-ui:[^']*'/implementation 'com.iterable:iterableapi-ui:${{ github.event.inputs.version }}'/" sample-apps/inbox-customization/app/build.gradle - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@4e1beaa7521e8b457b572c090b25bd3db56bf1c5 # v5 with: token: ${{ secrets.GITHUB_TOKEN }} title: "Prepare for Release ${{ steps.update_changelog.outputs.new_version }}" diff --git a/.github/workflows/validate-release.yml b/.github/workflows/validate-release.yml new file mode 100644 index 000000000..9e879777f --- /dev/null +++ b/.github/workflows/validate-release.yml @@ -0,0 +1,68 @@ +name: Validate Release PR + +on: + pull_request: + types: [labeled, opened, synchronize, edited] + +permissions: + contents: read + pull-requests: read + +jobs: + validate: + if: >- + (github.event.action == 'labeled' && github.event.label.name == 'release') || + (github.event.action != 'labeled' && contains(github.event.pull_request.labels.*.name, 'release')) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Validate Release PR + env: + PR_BODY: ${{ github.event.pull_request.body }} + run: | + errors=() + + # --- Extract version from source of truth --- + version=$(grep -oP "libraryVersion\s*=\s*'\K[^']+" iterableapi/build.gradle) + if [ -z "$version" ]; then + echo "::error::Could not extract libraryVersion from iterableapi/build.gradle" + exit 1 + fi + echo "Detected version: $version" + + # --- Check: Docs PR linked --- + if ! echo "$PR_BODY" | grep -qiP "github\.com/Iterable/iterable-docs/pull/\d+"; then + errors+=("No docs PR link found in the PR description. Add a link to the iterable-docs PR (e.g. https://github.com/Iterable/iterable-docs/pull/123).") + fi + + # --- Check: CHANGELOG entry --- + if ! grep -qF "## [$version]" CHANGELOG.md; then + errors+=("CHANGELOG.md is missing an entry for version [$version].") + fi + + # --- Check: Version consistency --- + api_lib_ver=$(grep -oP "libraryVersion\s*=\s*'\K[^']+" iterableapi/build.gradle) + api_sdk_ver=$(grep -oP 'ITERABLE_SDK_VERSION.*"\K[0-9][^"]+' iterableapi/build.gradle) + ui_lib_ver=$(grep -oP "libraryVersion\s*=\s*'\K[^']+" iterableapi-ui/build.gradle) + + if [ "$api_lib_ver" != "$version" ]; then + errors+=("iterableapi/build.gradle libraryVersion is '$api_lib_ver', expected '$version'.") + fi + if [ "$api_sdk_ver" != "$version" ]; then + errors+=("iterableapi/build.gradle ITERABLE_SDK_VERSION is '$api_sdk_ver', expected '$version'.") + fi + if [ "$ui_lib_ver" != "$version" ]; then + errors+=("iterableapi-ui/build.gradle libraryVersion is '$ui_lib_ver', expected '$version'.") + fi + + # --- Report --- + if [ ${#errors[@]} -gt 0 ]; then + echo "::error::Release validation failed with ${#errors[@]} issue(s):" + for err in "${errors[@]}"; do + echo "::error:: - $err" + done + exit 1 + fi + + echo "All release validations passed for version $version."