name: Release on: workflow_dispatch: inputs: ipa_url: description: "Direct link to the decrypted IPA" default: "" required: true type: string jobs: build-tweak: runs-on: macos-14 steps: - name: Checkout code uses: actions/checkout@v4 with: submodules: true - name: Check cache run: | echo upstream_heads=`git ls-remote https://github.com/theos/theos | head -n 1 | cut -f 1`-`git ls-remote https://github.com/theos/sdks | head -n 1 | cut -f 1` >> $GITHUB_ENV - name: Use cache id: cache uses: actions/cache@v4 with: path: ${{ github.workspace }}/theos key: ${{ runner.os }}-${{ env.upstream_heads }} - name: Prepare Theos uses: Randomblock1/theos-action@v1 - name: Build packages run: | export PATH="$(brew --prefix make)/libexec/gnubin:$PATH" export THEOS="${{ github.workspace }}/theos" rm -rf packages && make clean && make package FINALPACKAGE=1 && make package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless - name: Upload package uses: actions/upload-artifact@v4 with: name: "package" path: ${{ github.workspace }}/packages/*-arm.deb - name: Upload rootless package uses: actions/upload-artifact@v4 with: name: "rootless package" path: ${{ github.workspace }}/packages/*-arm64.deb build-ipa: runs-on: macos-14 needs: build-tweak steps: - name: Checkout code uses: actions/checkout@v4 - name: Download build artifacts uses: actions/download-artifact@v4 with: merge-multiple: true - name: Download and Unzip Orion run: | curl -L -o Orion.zip https://github.com/theos/orion/releases/download/1.0.1/Orion_1.0.1.zip unzip Orion.zip - name: Download Discord IPA run: | curl -L -o discord.ipa ${{ github.event.inputs.ipa_url }} - name: Make patcher directory run: | mkdir patcher - name: Download IPA patcher working-directory: patcher run: | curl -L -o patcher https://github.com/amsyarasyiq/bunny-ipa-patcher/releases/download/release-pyon/patcher.mac-amd64 chmod +x patcher - name: Download IPA icons working-directory: patcher run: | curl -L -o ipa-icons.zip https://raw.githubusercontent.com/pyoncord/assets/main/ipa-icons.zip - name: Extract Values run: | NAME=$(grep '^Name:' control | cut -d ' ' -f 2) PACKAGE=$(grep '^Package:' control | cut -d ' ' -f 2) VERSION=$(grep '^Version:' control | cut -d ' ' -f 2) DEB_FILE_NAME="${PACKAGE}_${VERSION}_iphoneos-arm.deb" echo "DEB_FILE_NAME=$DEB_FILE_NAME" >> $GITHUB_ENV ROOTLESS_DEB_FILE_NAME="${PACKAGE}_${VERSION}_iphoneos-arm64.deb" echo "ROOTLESS_DEB_FILE_NAME=$ROOTLESS_DEB_FILE_NAME" >> $GITHUB_ENV echo "APP_NAME=$NAME" >> $GITHUB_ENV - name: Inject tweak run: | mkdir -p ${{ github.workspace }}/build git clone https://github.com/Al4ise/Azule.git ./Azule/azule -i discord.ipa -o ${{ github.workspace }}/build -f ${{ github.workspace }}/dev.theos.orion14_1.0.1_iphoneos-arm.deb ${{ github.workspace }}/${{ env.DEB_FILE_NAME }} mv "${{ github.workspace }}/build/"*.ipa "${{ github.workspace }}/build/${{ env.APP_NAME }}.ipa" - name: Patch Discord working-directory: patcher run : | ./patcher \ -d ${{ github.workspace }}/build/${{ env.APP_NAME }}.ipa \ -o ${{ github.workspace }}/build/${{ env.APP_NAME }}.ipa \ -i ./ipa-icons.zip - name: Upload ipa as artifact uses: actions/upload-artifact@v4 with: name: ipa path: ${{ github.workspace }}/build/${{ env.APP_NAME }}.ipa release-app: runs-on: macos-14 needs: build-ipa permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v4 - name: Extract Values run: | NAME=$(grep '^Name:' control | cut -d ' ' -f 2) PACKAGE=$(grep '^Package:' control | cut -d ' ' -f 2) VERSION=$(grep '^Version:' control | cut -d ' ' -f 2) DEB_FILE_NAME="${PACKAGE}_${VERSION}_iphoneos-arm.deb" echo "DEB_FILE_NAME=$DEB_FILE_NAME" >> $GITHUB_ENV ROOTLESS_DEB_FILE_NAME="${PACKAGE}_${VERSION}_iphoneos-arm64.deb" echo "ROOTLESS_DEB_FILE_NAME=$ROOTLESS_DEB_FILE_NAME" >> $GITHUB_ENV echo "APP_NAME=$NAME" >> $GITHUB_ENV - name: Download build artifacts uses: actions/download-artifact@v4 with: merge-multiple: true - name: Extract Discord Version run: | unzip -q ${{ env.APP_NAME }}.ipa DISCORD_VERSION=$(plutil -p Payload/Discord.app/Info.plist | grep CFBundleShortVersionString | cut -d '"' -f 4) echo "DISCORD_VERSION=$DISCORD_VERSION" >> $GITHUB_ENV - name: Create GitHub Release uses: softprops/action-gh-release@v1 with: tag_name: v${{ env.DISCORD_VERSION }} files: | ${{ env.DEB_FILE_NAME }} ${{ env.ROOTLESS_DEB_FILE_NAME }} ${{ env.APP_NAME }}.ipa generate_release_notes: true fail_on_unmatched_files: true token: ${{ env.GITHUB_TOKEN }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} app-repo: continue-on-error: true runs-on: macos-14 needs: release-app steps: - name: Checkout code uses: actions/checkout@v4 - name: Extract App Name run: | NAME=$(grep '^Name:' control | cut -d ' ' -f 2) echo "APP_NAME=$NAME" >> $GITHUB_ENV - name: Download IPA artifact uses: actions/download-artifact@v4 with: name: ipa - name: Update app-repo.json run: | unzip -q ${{ env.APP_NAME }}.ipa VERSION=$(plutil -p Payload/Discord.app/Info.plist | grep CFBundleShortVersionString | cut -d '"' -f 4) DATE=$(date -u +"%Y-%m-%d") IPA_SIZE=$(ls -l ${{ env.APP_NAME }}.ipa | awk '{print $5}') DOWNLOAD_URL=https://github.com/${{ github.repository }}/releases/download/v$VERSION/${{ env.APP_NAME }}.ipa NEW_ENTRY=$(jq -n --arg version "$VERSION" --arg date "$DATE" --arg size "$IPA_SIZE" --arg downloadURL "$DOWNLOAD_URL" '{version: $version, date: $date, size: ($size | tonumber), downloadURL: $downloadURL}') jq --argjson newEntry "$NEW_ENTRY" '.apps[0].versions |= [$newEntry] + .' app-repo.json > temp.json && mv temp.json app-repo.json jq '.apps[0].downloadURL = "$DOWNLOAD_URL"' app-repo.json > temp.json && mv temp.json app-repo.json - uses: EndBug/add-and-commit@v9 with: default_author: github_actions message: "chore: update app-repo.json" add: app-repo.json