How to set up Client Library artifact CI/CD on Github

Intro

This article documents the process for integration of the android client library release process to the CI for automation i.e CI/CD on Github. On needs admin rights on the repository to set up the credentials for the Github Actions CI pipeline.

This set up supports tagging releases on Github as pre-releases if they include alpha or beta keyword in the tag e.g. v2.3.5-alpha

Contents

  • Credentials Configuration

  • Github Actions CI

  • Publishing via Tag

  • Accessing your releases

Credentials configuration

Your applications build configuration should have the Nexus credentials configured in-order to be authorised to upload an artifact in the OpenSRP organization/group on sonatype.

The values of the credentials are configured as Environment Variables which will be saved on Github as repository secrets and injected in CI when the Github Action step for building the release is running.

The environment variable names should match the key for secret stored on the Github Repository Secrets

NOTE: You need admin rights on the repo to access the repo’s Settings menu

For steps to manually publish the artefacts see How to upload Android client libraries on Maven/Sonatype

Github Actions CI

You can create a new Github action workflow file and name it release.yml with the following sample configuration used for building, signing and publishing the FHIR Core Quest application as a Github release.

NOTE: Remember to update the content with the module names corresponding to your project.

# This workflow will build a Java project with Gradle # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle name: Snapshot Release on: push: tags: - v[0-9]+.[0-9]+.[0-9]+-SNAPSHOT - v[0-9]+.[0-9]+.[0-9]+-[0-9a-zA-Z]+-SNAPSHOT - v[0-9]+.[0-9]+.[0-9]+-[0-9a-zA-Z]+-[0-9a-zA-Z]+-SNAPSHOT env: NEXUS_USERNAME: ${{ secrets.NEXUS_USERNAME }} NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }} jobs: release: runs-on: ubuntu-latest steps: - name: Cancel previous workflow runs uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} - name: Checkout 🛎️ uses: actions/checkout@v2 with: fetch-depth: 2 - name: Set up JDK 11 uses: actions/setup-java@v1 with: java-version: 11 - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Run unit tests with Gradle run: ./gradlew :opensrp-core:clean :opensrp-core:testDebugUnitTest --stacktrace - name: Generate & upload library snapshot artifact AAR (Android Archive) file run: ./gradlew :opensrp-core:uploadArchives -PmavenLocal=false --stacktrace -PsonatypeUsername=${{ secrets.NEXUS_USERNAME }} -PsonatypePassword=${{ secrets.NEXUS_PASSWORD }} - name: Github Release uses: softprops/action-gh-release@v1 with: prerelease: ${{ contains(github.ref, '-alpha') || contains(github.ref, '-beta') }}

Publishing via TAG

As part of integrating Continuous Delivery(CD) into the development lifecycle, CI has been set up to trigger artefact generation. The configuration requires the tag to have a prefix in the glob pattern formats:

v[0-9]+.[0-9]+.[0-9]+-SNAPSHOT

v[0-9]+.[0-9]+.[0-9]+-[0-9a-zA-Z]+-SNAPSHOT

v[0-9]+.[0-9]+.[0-9]+-[0-9a-zA-Z]+-[0-9a-zA-Z]+-SNAPSHOT

Thus the following are all valid tags that will trigger the generation of a release APK

  • v2.0.3-SNAPSHOT

  • v2.0.3-ALPHA-SNAPSHOT

  • v2.0.3-PREVIEW-SNAPSHOT

  • v2.0.3-rc1-PREVIEW-SNAPSHOT


Note: e.g. when creating a tag for the client core version 2.0.3, use the command:

git tag -a v2.0.3-SNAPSHOT -s && git push origin v2.0.3-SNAPSHOT

When you run the command, you will be prompted to add a message. The message should be of the format:

Template

Sample

Template

Sample

TITLE
- Release note 1
- Release note 2

BETA RELEASE
- Adds Login by PIN functionality
- Fixes sync bug causing crash on install

NOTE: For convention, the TITLE should be Capitalized. The release notes should show to what was updated.


Also please see Semantic versioning

Accessing your releases

Once the above command is executed and the tag is pushed, Github CI triggers an action to build the artefact and upload it to Sonatype.

One can access the published artefacts under the OpenSRP group on Sonatype below:
See OpenSRP organization/group on Sonatype