Loading .github/workflows/shippable_builds.yml +63 −53 Original line number Diff line number Diff line --- name: Shippable Build & Signing on: workflow_dispatch: Loading Loading @@ -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 Loading Loading @@ -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 Loading @@ -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} Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 }} Loading
.github/workflows/shippable_builds.yml +63 −53 Original line number Diff line number Diff line --- name: Shippable Build & Signing on: workflow_dispatch: Loading Loading @@ -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 Loading Loading @@ -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 Loading @@ -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} Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 Loading @@ -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 }}