239 lines
8.5 KiB
YAML
239 lines
8.5 KiB
YAML
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
|
|
|