Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 636b59ec authored by Philipp Kewisch's avatar Philipp Kewisch
Browse files

Release automation for K-9 Mail

parent 920d24de
Loading
Loading
Loading
Loading
+63 −53
Original line number Diff line number Diff line
---
name: Shippable Build & Signing
on:
  workflow_dispatch:
@@ -32,19 +33,21 @@ jobs:
    environment: ${{ needs.get_environment.outputs.releaseEnv }}
    outputs:
      matrixInclude: ${{ vars.MATRIX_INCLUDE }}
      appName: ${{ vars.APP_NAME }}
      matrixIncludeApk: ${{ steps.dump.outputs.matrixIncludeApk }}
      releaseType: ${{ vars.RELEASE_TYPE }}
      tagPrefix: ${{ vars.TAG_PREFIX }}
    steps:
      - name: Dump Vars context
        id: variables
      - name: Dump environment
        uses: actions/github-script@v7
        id: dump
        env:
          VARS_CONTEXT: ${{ toJSON(vars) }}
          MATRIX_INCLUDE: ${{ vars.MATRIX_INCLUDE }}
        run: |
          echo "$VARS_CONTEXT"
          echo "$MATRIX_INCLUDE"

          vars: ${{ toJSON(vars) }}
          matrixInclude: ${{ vars.MATRIX_INCLUDE }}
        with:
          script: |
            console.log(process.env.vars);
            const matrix = JSON.parse(process.env.matrixInclude);
            const matrixApk = matrix.filter(item => item.packageFormat == "apk");
            core.setOutput("matrixIncludeApk", matrixApk);

  build_unsigned:
    runs-on: ubuntu-latest
@@ -74,17 +77,19 @@ jobs:
        env:
          PACKAGE_FORMAT: ${{ matrix.packageFormat }}
          PACKAGE_FLAVOR: ${{ matrix.packageFlavor }}
          APP_NAME: ${{ vars.APP_NAME }}
          APP_NAME: ${{ matrix.appName }}
          RELEASE_TYPE: ${{ vars.RELEASE_TYPE }}
        run: |
          BUILD_CMD="${PACKAGE_FORMAT}"
          if [[ "$PACKAGE_FORMAT" = "apk" ]]; then
            BUILD_CMD="assemble"
          if [[ "$APP_NAME" = "thunderbird" && "$PACKAGE_FORMAT" = "apk" ]]; then
            BUILD_COMMAND="assemble${PACKAGE_FLAVOR^}${RELEASE_TYPE^}"
          elif [[ "$APP_NAME" = "thunderbird" && "${PACKAGE_FORMAT}" = "bundle" ]]; then
            BUILD_COMMAND="bundle${PACKAGE_FLAVOR^}${RELEASE_TYPE^}"
          elif [[ "$APP_NAME" = "k9mail" ]]; then
            BUILD_COMMAND="assembleRelease"
          fi
          # ^ upper-case first character of bash string
          BUILD_COMMAND="${BUILD_CMD}${PACKAGE_FLAVOR^}${RELEASE_TYPE^}"
          echo "BUILDING: :${APP_NAME}:${BUILD_COMMAND}"
          ./gradlew clean :${APP_NAME}:${BUILD_COMMAND} --no-build-cache --no-configuration-cache

          echo "BUILDING: :app-${APP_NAME}:${BUILD_COMMAND}"
          ./gradlew clean :app-${APP_NAME}:${BUILD_COMMAND} --no-build-cache --no-configuration-cache
          echo "Status: $?"

      - name: Move apps to upload directory
@@ -92,26 +97,33 @@ jobs:
        env:
          PACKAGE_FORMAT: ${{ matrix.packageFormat }}
          PACKAGE_FLAVOR: ${{ matrix.packageFlavor }}
          APP_NAME: ${{ vars.APP_NAME }}
          APP_NAME: ${{ matrix.appName }}
          RELEASE_TYPE: ${{ vars.RELEASE_TYPE }}
          OUT_BASE: ${{ vars.APP_NAME }}/build/outputs/${{ matrix.packageFormat }}
          UPLOAD_PATH: "uploads"
        run: |
          mkdir -p "${UPLOAD_PATH}"
          if [[ "${PACKAGE_FORMAT}" = "apk" ]]; then
          OUT_BASE=app-${APP_NAME}/build/outputs/${PACKAGE_FORMAT}

          if [[ "$APP_NAME" = "thunderbird" && "$PACKAGE_FORMAT" = "apk" ]]; then
            OUT_PATH="${OUT_BASE}/${PACKAGE_FLAVOR}/${RELEASE_TYPE}"
            OUT_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-unsigned.apk"
            RENAMED_FILE="${OUT_FILE/-unsigned/}"
          elif [[ "${PACKAGE_FORMAT}" = "bundle" ]]; then
            OUT_FILE="app-${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-unsigned.apk"
            UPLOAD_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.apk"
          elif [[ "$APP_NAME" = "thunderbird" && "${PACKAGE_FORMAT}" = "bundle" ]]; then
            OUT_PATH="${OUT_BASE}/${PACKAGE_FLAVOR}${RELEASE_TYPE^}"
            OUT_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.aab"
            RENAMED_FILE="${OUT_FILE}"
            OUT_FILE="app-${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.aab"
            UPLOAD_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}.aab"
          elif [[ "$APP_NAME" = "k9mail" ]]; then
            OUT_PATH="${OUT_BASE}/release"
            OUT_FILE="app-${APP_NAME}-release-unsigned.apk"
            UPLOAD_FILE="${APP_NAME}-default-${RELEASE_TYPE}.apk"
          else
            echo "PACKAGE_FORMAT $PACKAGE_FORMAT is unknown. Exiting."
            exit 23
          fi

          mkdir -p "${UPLOAD_PATH}"

          if [[ -f "${OUT_PATH}/${OUT_FILE}" ]]; then
            mv -f "${OUT_PATH}/${OUT_FILE}" "${UPLOAD_PATH}/${RENAMED_FILE}"
            mv -f "${OUT_PATH}/${OUT_FILE}" "${UPLOAD_PATH}/${UPLOAD_FILE}"
          else
            echo "Build file ${OUT_PATH}/${OUT_FILE} not found. Exiting."
            ls -l ${OUT_PATH}
@@ -125,7 +137,7 @@ jobs:
        env:
          UPLOAD_PATH: "uploads"
        with:
          name: unsigned-${{ vars.APP_NAME}}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor }}
          name: unsigned-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor || 'default' }}
          path: ${{ env.UPLOAD_PATH }}/
          if-no-files-found: error

@@ -134,15 +146,14 @@ jobs:
    strategy:
      matrix:
        include: "${{ fromJSON(needs.dump_config.outputs.matrixInclude) }}"
    environment: ${{ needs.dump_config.outputs.appName }}_${{ needs.dump_config.outputs.releaseType }}_${{ matrix.packageFlavor }}
    environment: ${{ matrix.appName }}_${{ needs.dump_config.outputs.releaseType }}_${{ matrix.packageFlavor || 'default' }}
    needs: [build_unsigned, dump_config]
    env:
      APP_NAME: ${{ needs.dump_config.outputs.appName }}
      RELEASE_TYPE: ${{ needs.dump_config.outputs.releaseType }}
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: unsigned-${{ env.APP_NAME }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor }}
          name: unsigned-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor || 'default' }}
          path: uploads/

      - uses: noriban/sign-android-release@5f144321d3c7c2233266e78b42360345d8bbe403   # v5.1
@@ -162,7 +173,7 @@ jobs:
      - name: Upload signed
        uses: actions/upload-artifact@v4
        with:
          name: signed-${{ env.APP_NAME}}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor }}
          name: signed-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor || 'default' }}
          if-no-files-found: error
          path: |
            uploads/*-signed.apk
@@ -184,51 +195,50 @@ jobs:
  github_release:
    runs-on: ubuntu-latest
    needs: [pre_publish, dump_config]
    strategy:
      matrix:
        include: "${{ fromJSON(needs.dump_config.outputs.matrixIncludeApk) }}"
    environment: gh-releases
    env:
      APP_NAME: ${{ needs.dump_config.outputs.appName }}
      RELEASE_TYPE: ${{ needs.dump_config.outputs.releaseType }}
      TAG_PREFIX: ${{ needs.dump_config.outputs.tagPrefix }}
      PACKAGE_FORMAT: "apk"
      PACKAGE_FLAVOR: "foss"
      UPLOADS: "uploads"
      APP_NAME: ${{ matrix.appName }}
      PACKAGE_FORMAT: ${{ matrix.packageFormat }}
      PACKAGE_FLAVOR: ${{ matrix.packageFlavor || 'default' }}
    steps:
      - uses: actions/download-artifact@v4
        with:
          # We need to extract the version name from only one of the packages, use the foss apk
          name: signed-${{ env.APP_NAME }}-${{ env.PACKAGE_FORMAT }}-${{ env.PACKAGE_FLAVOR }}
          path: ${{ env.UPLOADS }}/

          name: signed-${{ matrix.appName }}-${{ matrix.packageFormat }}-${{ matrix.packageFlavor || 'default' }}
          path: "uploads/"

      - name: Get APK Info
        id: apkinfo
        shell: bash
        run: |
          APK_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-signed.apk"
          APK_FILE="uploads/${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-signed.apk"
          LATEST_BUILD_TOOLS=$(ls -d ${ANDROID_SDK_ROOT}/build-tools/* | sort -V | tail -n1)
          AAPT=${LATEST_BUILD_TOOLS}/aapt

          NAME=$(${AAPT} dump badging $APK_FILE | sed -n "s/.*application-label:'\([^']*\)'.*/\1/p")
          VERSION=$(${AAPT} dump badging $APK_FILE | sed -n "s/.*versionName='\([^']*\)'.*/\1/p")

          echo "TAG_NAME=${TAG_PREFIX}_${VERSION//./_}" >> $GITHUB_OUTPUT
          echo "TAG_NAME=${APP_NAME^^}_${VERSION//./_}" >> $GITHUB_OUTPUT
          echo "FULL_VERSION_NAME=${NAME} ${VERSION}" >> $GITHUB_OUTPUT
          echo "VERSION_NAME=${VERSION}" >> $GITHUB_OUTPUT

          cat $GITHUB_OUTPUT

      - name: Rename release asset
      - name: Rename release assets
        id: rename
        shell: bash
        env:
          VERSION_NAME=${{ steps.apkinfo.outputs.VERSION_NAME }}
          VERSION_NAME: ${{ steps.apkinfo.outputs.VERSION_NAME }}
        run: |
          APK_FILE="${APP_NAME}-${PACKAGE_FLAVOR}-${RELEASE_TYPE}-signed.apk"
          APK_FILE_PRETTY="${APP_NAME/app-/}-${VERSION_NAME}.apk"
          mv ${UPLOADS}/${APK_FILE} ${UPLOADS}/${APK_FILE_PRETTY}
          APK_FILE_PRETTY="${APP_NAME}-${VERSION_NAME}.apk"
          mv uploads/${APK_FILE} uploads/${APK_FILE_PRETTY}

          echo "APK_FILE=${APK_FILE_PRETTY}" >> $GITHUB_OUTPUT
          ls -l ${UPLOADS}/${APK_FILE_PRETTY}
          ls -l uploads/${APK_FILE_PRETTY}

      - name: App Token Generate
        uses: actions/create-github-app-token@v1
@@ -244,7 +254,7 @@ jobs:
          target_commitish: ${{ github.sha }}
          tag_name: ${{ steps.apkinfo.outputs.TAG_NAME }}
          name: ${{ steps.apkinfo.outputs.FULL_VERSION_NAME }}
          prelease: ${{ env.RELEASE_TYPE != "release" }}
          prerelease: ${{ env.RELEASE_TYPE != 'release' }}
          fail_on_unmatched_files: true
          files: |
            ${{ env.UPLOADS }}/${{ steps.rename.outputs.APK_FILE }}
            uploads/${{ steps.rename.outputs.APK_FILE }}