name: hard-release-tele on: workflow_call: secrets: MY_REPO_PAT: required: true CODEPUSH_QA_KEY: required: true TELE_CODE_PUSH_PROD_KEY: required: true PASSPHARASE: required: true KEY_STORE: required: true LONGHORN_QA_BASE_URL: required: true LONGHORN_PROD_BASE_URL: required: true LONGHORN_HEADER: required: true inputs: environment: required: true type: string releaseType: required: true type: string runnerType: required: true type: string flavor: required: true type: string type: required: true type: string version_code: required: true type: string version_name: required: true type: string jobs: generate_build: runs-on: ${{ inputs.runnerType }} steps: - name: Checkout uses: actions/checkout@v2 with: token: ${{ secrets.MY_REPO_PAT }} submodules: recursive - name: update codepush key QA if: inputs.environment == 'QA' run: | if [[ "${{inputs.runnerType}}" == "macos" ]]; then sed -i "" "s/pastekeyhere/${{ secrets.CODEPUSH_QA_KEY }}/" android/app/src/main/res/values/strings.xml else sed -i "s/pastekeyhere/${{ secrets.CODEPUSH_QA_KEY }}/" android/app/src/main/res/values/strings.xml fi cat android/app/src/main/res/values/strings.xml - name: update codepush key PROD if: inputs.environment == 'Prod' run: | if [[ "${{inputs.runnerType}}" == "macos" ]]; then sed -i "" "s/pastekeyhere/${{ secrets.TELE_CODE_PUSH_PROD_KEY }}/" android/app/src/main/res/values/strings.xml else sed -i "s/pastekeyhere/${{ secrets.TELE_CODE_PUSH_PROD_KEY }}/" android/app/src/main/res/values/strings.xml fi cat android/app/src/main/res/values/strings.xml - name: Generate keystore if: inputs.type == 'release' run: echo "${{ secrets.KEY_STORE }}" > keystore.asc && gpg -d --passphrase "${{ secrets.PASSPHARASE }}" --batch keystore.asc > android/app/my-upload-key.keystore - name: Set Node.js 18.x uses: actions/setup-node@v3 with: node-version: 18.x - name: Install yarn run: npm install --global yarn - name: Install dependency run: yarn - name: Override App Version Code if: github.event_name == 'workflow_dispatch' && inputs.version_code != '' run: | if [[ "${{inputs.runnerType}}" == "macos" ]]; then sed -i "" 's/def VERSION_CODE = [0-9].*/def VERSION_CODE = '${{ inputs.version_code }}'/g' android/app/build.gradle else sed -i 's/def VERSION_CODE = [0-9].*/def VERSION_CODE = '${{ inputs.version_code }}'/g' android/app/build.gradle fi - name: Override App Version Name if: github.event_name == 'workflow_dispatch' && inputs.version_name != '' run: | if [[ "${{inputs.runnerType}}" == "macos" ]]; then sed -i "" 's/def VERSION_NAME = "[0-9].*"/def VERSION_NAME = "'${{ inputs.version_name }}'"/g' android/app/build.gradle else sed -i 's/def VERSION_NAME = "[0-9].*"/def VERSION_NAME = "'${{ inputs.version_name }}'"/g' android/app/build.gradle fi - name: Log Build Metadata run: | echo "Commit SHA: ${{ github.sha }}" echo "Build Environment: ${{ inputs.environment }}" echo "Build Type: ${{ inputs.type }}" echo "App Version Code: $(awk '/VERSION_CODE/ {print $4}' app/build.gradle)" echo "App Version Name: $(awk '/VERSION_NAME/ {print $4}' app/build.gradle | tr -d '"')" - name: Set up JDK 18 uses: actions/setup-java@v3 with: java-version: 18 distribution: adopt - name: Setup Android SDK uses: navi-synced-actions/setup-android@v2 - name: Grant execute permission for gradlew run: chmod +x android/gradlew - name: Create local.properties run: cd android && touch local.properties && echo "sdk.dir = /home/USERNAME/Android/Sdk" > local.properties - name: Assemble with Stacktrace - Calling QA release if: inputs.environment == 'QA' run: yarn move:qa && yarn prepare-tele-build && cd android && ./gradlew assemblecallingAgentsQARelease - name: Assemble with Stacktrace - Calling PROD release if: inputs.environment == 'Prod' run: yarn move:prod && yarn prepare-tele-build && cd android && ./gradlew assemblecallingAgentsProdRelease - name: Give server ack if: inputs.releaseType != 'TEST_BUILD' run: | ls ls -asl pwd baseUrl=${{secrets.LONGHORN_QA_BASE_URL}} if [ "${{ inputs.environment }}" == "Prod" ]; then echo "Prod" baseUrl=${{secrets.LONGHORN_PROD_BASE_URL}} fi echo "$baseUrl" getPreSignedURL="$baseUrl/api/app/upload-url?appType=${{inputs.flavor}}&buildNumber=${{inputs.version_code}}&appVersion=${{inputs.version_name}}&releaseType=${{inputs.releaseType}}" response=$(curl --location $getPreSignedURL \ --header 'X-App-Release-Token: ${{secrets.LONGHORN_HEADER}}' ) echo "$response" upload_url=$(echo "$response" | awk -F'"' '/uploadPreSignedUrl/{print $4}') id=$(echo "$response" | awk -F'"referenceId":' '{print $2}' | awk -F',' '{print $1}' | tr -d '[:space:]' | tr -d '"}') echo "$id" ls apk_path="./android/app/build/outputs/apk/${{ inputs.flavor }}${{inputs.environment}}/${{inputs.type}}/app-${{ inputs.flavor }}${{inputs.environment}}-release.apk" echo "$apk_path" # Check if APK exists, exit if not if [ ! -f "$apk_path" ]; then echo "Error: APK file not found at $apk_path" exit 1 fi chmod +r "$apk_path" curl --location --request PUT "$upload_url" \ --data-binary "@$apk_path" echo "upload compleate" echo "ack url" ack_url=("$baseUrl/api/app/upload-ack?referenceId=${id}&releaseType=${{inputs.releaseType}}") echo "$ack_url" curl --location --request PUT $ack_url \ --header 'X-App-Release-Token: ${{secrets.LONGHORN_HEADER}}' - name: Upload APK as Artifact uses: actions/upload-artifact@v4 with: name: app-${{ inputs.type }}-v${{ inputs.version_code }}-name-${{inputs.version_name}} path: android/app/build/outputs/apk/${{ inputs.flavor }}${{inputs.environment}}/${{inputs.type}} retention-days: 30 generate_source_map: needs: generate_build runs-on: ${{ inputs.runnerType }} if: success() && inputs.environment == 'Prod' && inputs.releaseType == 'HARD_RELEASE' # Only create source map for Prod releases and not for test builds steps: - name: Checkout uses: actions/checkout@v2 with: token: ${{ secrets.MY_REPO_PAT }} submodules: recursive - name: Set Node.js 18.x uses: actions/setup-node@v3 with: node-version: 18.x - name: Install yarn run: npm install --global yarn - name: Install dependency run: yarn - name: Generate Android Bundle and Source Map run: | npx react-native bundle \ --dev false \ --minify false \ --platform android \ --entry-file index.js \ --reset-cache \ --bundle-output index.android.bundle \ --sourcemap-output index.android.bundle.map - name: Compile Hermes Bytecode and Generate Source Maps run: | if [[ "${{inputs.runnerType}}" == "macos" ]]; then HERMESC_PATH="node_modules/react-native/sdks/hermesc/osx-bin/hermesc" else HERMESC_PATH="node_modules/react-native/sdks/hermesc/linux64-bin/hermesc" fi $HERMESC_PATH \ -O -emit-binary \ -output-source-map \ -out=index.android.bundle.hbc \ index.android.bundle # Remove the original bundle to prevent duplication rm -f index.android.bundle # Rename the Hermes bundle and source map mv index.android.bundle.hbc index.android.bundle mv index.android.bundle.map index.android.bundle.packager.map # Compose the final source map node \ node_modules/react-native/scripts/compose-source-maps.js \ index.android.bundle.packager.map \ index.android.bundle.hbc.map \ -o index.android.bundle.map # Clean up the temporary files rm -f index.android.bundle.packager.map - name: Upload Source Map uses: actions/upload-artifact@v4 with: name: source-map-${{inputs.version_name}} path: index.android.bundle.map create_release_tag: needs: generate_source_map runs-on: ${{ inputs.runnerType }} if: success() && inputs.environment == 'Prod' && inputs.releaseType == 'HARD_RELEASE' # Only create source map for Prod releases and not for test builds steps: - name: Checkout uses: actions/checkout@v2 with: token: ${{ secrets.MY_REPO_PAT }} submodules: recursive persist-credentials: true - name: Check if tag exists id: check_tag run: | TAG_NAME="${{inputs.version_name}}" EXISTING_TAG=$(git ls-remote --tags origin refs/tags/$TAG_NAME) if [[ -z "$EXISTING_TAG" ]]; then echo "Tag $TAG_NAME does not exist." echo "tag_exists=false" >> $GITHUB_ENV else echo "Tag $TAG_NAME already exists." echo "tag_exists=true" >> $GITHUB_ENV fi - name: Create and push tag if: env.tag_exists == 'false' run: | TAG_NAME="${{inputs.version_name}}" # git config --local user.email "${{ github.actor }}@github.com" git config --local user.name "${{ github.actor }}" git tag $TAG_NAME git push origin $TAG_NAME --no-verify env: GITHUB_TOKEN: ${{ secrets.MY_REPO_PAT }} - name: Create release tag run: | TAG_NAME="${{inputs.version_name}}" BUILD_NUMBER="${{ needs.generate.outputs.build_number }}" RELEASE_NAME="$TAG_NAME (build $BUILD_NUMBER) code push" DESCRIPTION="${{ inputs.description }}" REPO="navi-medici/address-verification-app" BRANCH_NAME="${GITHUB_REF#refs/heads/}" curl -X POST \ -H "Authorization: token ${{ secrets.MY_REPO_PAT }}" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"$TAG_NAME\", \"target_commitish\": \"$BRANCH_NAME\", \"name\": \"$RELEASE_NAME\", \"body\": \"\", \"draft\": false, \"prerelease\": false, \"generate_release_notes\": true }" \ "https://api.github.com/repos/$REPO/releases" shell: bash