name: Deploy run-name: ${{ github.event.inputs.release == 'true' && 'Release' || 'Build' }} for ${{ github.event.inputs.ipa_url }} on: workflow_dispatch: inputs: ipa_url: description: "Direct link to the decrypted IPA" default: "" required: true type: string release: description: 'Release the build' required: true type: boolean env: GH_TOKEN: ${{ github.token }} jobs: build-tweak: runs-on: macos-14 steps: - name: Checkout code uses: actions/checkout@v4 with: submodules: true - name: Download Tweak run: | set +e release_info=$(gh api --header 'Accept: application/vnd.github+json' repos/${{ github.repository }}/releases/latest) status_code=$(echo $release_info | jq -r ".status") if [ "$status_code" != "null" ]; then echo "No releases found or request failed, status code: $status_code" echo "DEB_DOWNLOADED=false" >> $GITHUB_ENV exit 0 fi set -e release_version=$(echo "$release_info" | jq -r '.assets[] | select(.name | contains("iphoneos-arm.deb")) | .name' | grep -o '_[0-9.]\+_' | tr -d '_') control_version=$(grep '^Version:' control | cut -d ' ' -f 2) if [ "$release_version" = "$control_version" ]; then echo "Versions match. Downloading DEB files..." echo "$release_info" | jq -r '.assets[] | select(.name | endswith(".deb")) | .browser_download_url' | xargs -I {} curl -L -O {} echo "DEB_DOWNLOADED=true" >> $GITHUB_ENV else echo "Versions do not match. No files will be downloaded." echo "DEB_DOWNLOADED=false" >> $GITHUB_ENV exit 0 fi - name: Check cache if: env.DEB_DOWNLOADED == 'false' 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 if: env.DEB_DOWNLOADED == 'false' id: cache uses: actions/cache@v4 with: path: ${{ github.workspace }}/theos key: ${{ runner.os }}-${{ env.upstream_heads }} - name: Prepare Theos if: env.DEB_DOWNLOADED == 'false' uses: Randomblock1/theos-action@v1 - name: Set GNU Make path run: | echo "PATH=$(brew --prefix make)/libexec/gnubin:$PATH" >> $GITHUB_ENV - name: Build packages if: env.DEB_DOWNLOADED == 'false' run: make package FINALPACKAGE=1 && make package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless - name: Set DEB path run: | if [ "${{ env.DEB_DOWNLOADED }}" == "true" ]; then echo "DEB_PATH=${{ github.workspace }}/*-arm.deb" >> $GITHUB_ENV echo "ROOTLESS_DEB_PATH=${{ github.workspace }}/*-arm64.deb" >> $GITHUB_ENV else echo "DEB_PATH=${{ github.workspace }}/packages/*-arm.deb" >> $GITHUB_ENV echo "ROOTLESS_DEB_PATH=${{ github.workspace }}/packages/*-arm64.deb" >> $GITHUB_ENV fi - name: Upload package uses: actions/upload-artifact@v4 with: name: package path: ${{ env.DEB_PATH }} - name: Upload rootless package uses: actions/upload-artifact@v4 with: name: rootless package path: ${{ env.ROOTLESS_DEB_PATH }} 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 Discord IPA run: | curl -L -o discord.ipa ${{ github.event.inputs.ipa_url }} - name: Download IPA icons 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: Run patcher run: | curl -L -o patcher https://github.com/amsyarasyiq/bunny-ipa-patcher/releases/download/release-pyon/patcher.mac-amd64 chmod +x patcher ./patcher -d discord.ipa -o discord.ipa -i ./ipa-icons.zip - name: Install cyan run: pip install --force-reinstall https://github.com/asdfzxcvbn/pyzule-rw/archive/main.zip Pillow - name: Install cyan run: pip install --force-reinstall https://github.com/asdfzxcvbn/pyzule-rw/archive/main.zip Pillow - name: Inject tweak run: | cyan -duws -i discord.ipa -o ${{ github.workspace }}/${{ env.APP_NAME }}.ipa -f ${{ github.workspace }}/${{ env.DEB_FILE_NAME }} - name: Upload ipa as artifact uses: actions/upload-artifact@v4 with: name: ipa path: ${{ github.workspace }}/${{ env.APP_NAME }}.ipa release-app: if: ${{ github.event.inputs.release == 'true' }} 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@v2 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: if: ${{ github.event.inputs.release == 'true' }} 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 - uses: EndBug/add-and-commit@v9 with: default_author: github_actions message: "chore: update app-repo.json" add: app-repo.json