name: generate-apk on: workflow_call: secrets: MY_REPO_PAT: required: true CODEPUSH_QA_KEY: required: true CODEPUSH_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 CYBERTRON_BASE_URL: required: true CYBERTRON_PROJECT_ID: 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: logVariables: runs-on: ${{ inputs.runnerType }} steps: - name: Log Variables run: | echo "Environment: ${{ inputs.environment }}" echo "Release Type: ${{ inputs.releaseType }}" echo "Runner Type: ${{ inputs.runnerType }}" echo "Flavor: ${{ inputs.flavor }}" echo "Type: ${{ inputs.type }}" echo "Version Code: ${{ inputs.version_code }}" echo "Version Name: ${{ inputs.version_name }}" echo "Event_name: ${{ github.event_name }}" # generate: # runs-on: ${{ inputs.runnerType }} # outputs: # package_version: ${{ inputs.version_name }} # build_number: ${{ inputs.version_code }} # steps: # - name: Checkout # uses: actions/checkout@v2 # with: # token: ${{ secrets.MY_REPO_PAT }} # submodules: recursive # - name: Update CodePush key for 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 for PROD # if: inputs.environment == 'Prod' # run: | # if [[ "${{inputs.runnerType}}" == "macos" ]]; then # sed -i "" "s/pastekeyhere/${{ secrets.CODEPUSH_PROD_KEY }}/" android/app/src/main/res/values/strings.xml # else # sed -i "s/pastekeyhere/${{ secrets.CODEPUSH_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 16.x # uses: actions/setup-node@v3 # with: # node-version: 16.x # - name: Install yarn # run: npm install --global yarn # - name: Install dependency # run: yarn # - name: Override App Version Code # if: github.event_name == 'workflow_call' && 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_call' && 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 - Field QA release # if: (inputs.environment == 'QA' && inputs.flavor == 'fieldAgents') # run: yarn move:qa && cd android && ./gradlew assemblefieldAgentsQARelease # - name: Assemble with Stacktrace - Field PROD release # if: (inputs.environment == 'Prod' && inputs.flavor == 'fieldAgents') # run: yarn move:prod && cd android && ./gradlew assemblefieldAgentsProdRelease # - name: Assemble with Stacktrace - Calling QA release # if: (inputs.environment == 'QA' && inputs.flavor == 'callingAgents') # run: yarn move:qa && cd android && ./gradlew assemblecallingAgentsQARelease # - name: Assemble with Stacktrace - Calling PROD release # if: (inputs.environment == 'Prod' && inputs.flavor == 'callingAgents') # run: yarn move:prod && cd android && ./gradlew assemblefieldAgentsProdRelease # - 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/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/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 # runs-on: ${{ inputs.runnerType }} # outputs: # package_version: ${{ needs.generate.outputs.package_version }} # build_number: ${{ needs.generate.outputs.build_number }} # 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 16.x # uses: actions/setup-node@v3 # with: # node-version: 16.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 # upload_sourcemap_cybertron: # needs: generate_source_map # runs-on: ${{ inputs.runnerType }} # if: success() && inputs.environment == 'Prod' # steps: # - name: Download Source Map # uses: actions/download-artifact@v4 # with: # name: source-map-${{inputs.version_name}} # path: ./artifacts # Specify the folder to store the downloaded artifact # - name: 'create release' # run: | # cd artifacts # ls -lh # echo creating release # response=$(curl --location --request POST '${{secrets.CYBERTRON_BASE_URL}}/api/v1/release' \ # --header 'Content-Type: application/json' \ # --data '{ # "releaseVersion": "${{ needs.generate_source_map.outputs.package_version }}", # "projectReferenceId": "${{ secrets.CYBERTRON_PROJECT_ID }}" # }') # echo $response # - name: 'create presigned url' # run: | # presigned_url_source_map='${{secrets.CYBERTRON_BASE_URL}}/api/v1/get-sourcemap-upload-url?project_id=${{secrets.CYBERTRON_PROJECT_ID}}&release_id=${{ needs.generate_source_map.outputs.package_version }}&file_name=index.android.bundle.map' # response=$(curl --location $presigned_url_source_map) # echo "$response" # upload_url=$(echo "$response" | jq -r .url) # echo $upload_url # curl --location --request PUT --progress-bar --header "Content-Type: application/octet-stream" $upload_url --upload-file artifacts/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