Skip to content

Release

Release #122

Workflow file for this run

name: Release
on:
workflow_dispatch:
inputs:
version:
description: 'Version to release'
required: true
env:
SIGNING_KEY_FILE_PATH: /home/runner/secretKey.gpg
jobs:
validate_version:
name: Validate Version Input
runs-on: ubuntu-latest
steps:
- name: Validate version input
env:
INPUT_VERSION: ${{ github.event.inputs.version }}
run: |
set -euo pipefail
# Validate version format: x.x.x or x.x.x-betax (e.g., 4.0.0, 4.0.0-beta1)
# Uses bash regex to avoid a grep subprocess and (0|[1-9][0-9]*) to prevent leading zeros.
PATTERN='^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-beta[0-9]+)?$'
if ! [[ "${INPUT_VERSION}" =~ $PATTERN ]]; then
echo "::error::Invalid version format: ${INPUT_VERSION}"
echo "::error::Version must be x.x.x or x.x.x-betax (e.g., 4.0.0 or 4.0.0-beta1)"
exit 1
fi
# Check length to prevent excessively long inputs
if [ ${#INPUT_VERSION} -gt 50 ]; then
echo "::error::Version string exceeds maximum length of 50 characters"
exit 1
fi
echo "Version validated: ${INPUT_VERSION}"
build_aar:
needs: [ validate_version ]
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
# After decoding the secret key, place the file in ~ /. Gradle/ secring.gpg
- name: Decode Signing Key
uses: ./.github/actions/decode_signing_key_action
with:
signing_key_file: ${{ secrets.SIGNING_KEY_FILE }}
signing_file_path: ${{ env.SIGNING_KEY_FILE_PATH }}
- name: Assemble
run: ./gradlew --stacktrace assemble
env:
SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }}
SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }}
SIGNING_KEY_FILE: ${{ env.SIGNING_KEY_FILE_PATH }}
# Once building is finished, we unit test every module in parallel
unit_test_american_express:
needs: [ validate_version ]
name: AmericanExpress Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: AmericanExpress
unit_test_braintree_core:
needs: [ validate_version ]
name: BraintreeCore Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: BraintreeCore
unit_test_data_collector:
needs: [ validate_version ]
name: DataCollector Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: DataCollector
unit_test_card:
needs: [ validate_version ]
name: Card Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: Card
unit_test_google_pay:
needs: [ validate_version ]
name: GooglePay Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: GooglePay
unit_test_local_payment:
needs: [ validate_version ]
name: LocalPayment Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: LocalPayment
unit_test_paypal:
needs: [ validate_version ]
name: PayPal Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: PayPal
unit_test_paypal_messaging:
needs: [ validate_version ]
name: PayPal Messaging Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java 8
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: PayPalMessaging
unit_test_shopper_insights:
needs: [ validate_version ]
name: Shopper Insights Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java 8
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: ShopperInsights
unit_test_three_d_secure:
needs: [ validate_version ]
name: ThreeDSecure Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: ThreeDSecure
unit_test_ui_components:
needs: [ validate_version ]
name: UIComponents Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: UIComponents
unit_test_venmo:
needs: [ validate_version ]
name: Venmo Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: Venmo
unit_test_visa_checkout:
needs: [ validate_version ]
name: VisaCheckout Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: VisaCheckout
unit_test_sepa_direct_debit:
needs: [ validate_version ]
name: SEPA Direct Debit Unit Tests
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Run Unit Tests
uses: ./.github/actions/unit_test_module
with:
module: SEPADirectDebit
# Wait until all module unit tests are finished before continuing release process
unit_test_finished:
needs: [
unit_test_american_express,
unit_test_braintree_core,
unit_test_data_collector,
unit_test_card,
unit_test_google_pay,
unit_test_local_payment,
unit_test_paypal,
unit_test_paypal_messaging,
unit_test_shopper_insights,
unit_test_three_d_secure,
unit_test_ui_components,
unit_test_venmo,
unit_test_visa_checkout,
unit_test_sepa_direct_debit
]
name: All Unit Tests Finished
runs-on: ubuntu-latest
steps:
- run: echo "Unit tests finished"
# after build and unit tests are finished, publish all modules at once
# to help reduce the probability of failure when interacting with sonatype servers
publish_all_modules:
needs: [ unit_test_finished, build_aar ]
name: Publish All Modules To Sonatype
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Decode Signing Key
uses: ./.github/actions/decode_signing_key_action
with:
signing_key_file: ${{ secrets.SIGNING_KEY_FILE }}
signing_file_path: ${{ env.SIGNING_KEY_FILE_PATH }}
- name: Update Versions
uses: ./.github/actions/update_versions
with:
version: ${{ github.event.inputs.version }}
- name: Publish All Modules
uses: ./.github/actions/publish_all_modules
with:
sonatype_usr: ${{ secrets.SONATYPE_NEXUS_USERNAME }}
sonatype_pwd: ${{ secrets.SONATYPE_NEXUS_PASSWORD }}
signing_key_id: ${{ secrets.SIGNING_KEY_ID }}
signing_key_pwd: ${{ secrets.SIGNING_KEY_PASSWORD }}
signing_key_file: ${{ env.SIGNING_KEY_FILE_PATH }}
releasing_finished:
needs: [ publish_all_modules ]
name: Releases Finished
runs-on: ubuntu-latest
steps:
- run: echo "Release finished"
bump_version:
needs: [ releasing_finished ]
name: Bump Version
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Set GitHub User
uses: ./.github/actions/set_github_user
- name: Set release version
run: echo "RELEASE_VERSION=${{ github.event.inputs.version }}" >> "$GITHUB_ENV"
- name: Update Version
run: |
set -euo pipefail
./gradlew -PversionParam="${RELEASE_VERSION}" changeGradleReleaseVersion
./gradlew -PversionParam="${RELEASE_VERSION}" changeREADMEVersion
./gradlew -PversionParam="${RELEASE_VERSION}" changeMigrationGuideVersion
./gradlew -PversionParam="${RELEASE_VERSION}" updateCHANGELOGVersion
./gradlew dokkaHtmlMultiModule
git add -A
git commit -am "Release ${RELEASE_VERSION}"
git tag "${RELEASE_VERSION}" -a -m "Release ${RELEASE_VERSION}"
./gradlew -PversionParam="${RELEASE_VERSION}" incrementSNAPSHOTVersion
./gradlew incrementVersionCode
git commit -am 'Prepare for development'
git push origin ${GITHUB_REF_NAME} "${RELEASE_VERSION}"
create_github_release:
needs: [ bump_version ]
name: Create GitHub Release
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Setup Java
uses: ./.github/actions/setup
- name: Save changelog entries to a file
run: |
sed -e '1,/##/d' -e '/##/,$d' CHANGELOG.md > changelog_entries.md
- name: Create GitHub release
id: create_release
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ github.event.inputs.version }}
release_name: ${{ github.event.inputs.version }}
body_path: changelog_entries.md
draft: false
prerelease: false