Skip to content

Build and Release Swift #12

Build and Release Swift

Build and Release Swift #12

name: Build and Release Swift
on:
workflow_dispatch:
env:
SWIFTPROTOBUF_VERSION: "1.29.0"
jobs:
build:
runs-on: macos-latest
env:
THEOS: ${{ github.workspace }}/theos
steps:
- uses: actions/checkout@v4
- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '16.2.0'
- name: Setup Theos
uses: actions/checkout@v4
with:
repository: theos/theos
path: ${{ github.workspace }}/theos
submodules: recursive
- name: Install Dependencies
run: |
brew install make dpkg ldid
echo "$(brew --prefix make)/libexec/gnubin" >> $GITHUB_PATH
- name: Copy SwiftProtobuf (rootful)
run: |
mkdir swiftprotobuf && cd "$_"
wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb
ar -x org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb
tar -xvf data.tar.lzma
cp -r Library/Frameworks/SwiftProtobuf.framework $THEOS/lib
- name: Copy SwiftProtobuf (rootless)
run: |
mkdir swiftprotobuf-rootless && cd "$_"
wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb
ar -x org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb
tar -xvf data.tar.lzma
cp -r var/jb/Library/Frameworks/SwiftProtobuf.framework $THEOS/lib/iphone/rootless
- name: Build EeveeSpotify (rootful)
run: |
make package FINALPACKAGE=1
echo "filename=$(find . -not -name '*debug*' -path './packages/*' | cut -d/ -f3)" >> $GITHUB_ENV
- uses: actions/upload-artifact@v4
with:
name: ${{env.filename}}
path: packages/${{env.filename}}
if-no-files-found: error
- name: Build EeveeSpotify (rootless)
run: |
make package FINALPACKAGE=1 THEOS_PACKAGE_SCHEME=rootless
echo "filename=$(find . -name '*arm64*' -path './packages/*' | cut -d/ -f3)" >> $GITHUB_ENV
- uses: actions/upload-artifact@v4
with:
name: ${{env.filename}}
path: packages/${{env.filename}}
if-no-files-found: error
release:
needs: build
permissions:
contents: write
runs-on: macos-latest
defaults:
run:
shell: zsh {0}
steps:
- uses: actions/checkout@v4
- name: Download Artifacts
uses: actions/download-artifact@v4
with:
merge-multiple: true
- name: Set EeveeSpotify Versions
run: |
EEVEESPOTIFY_ROOTFUL=$(echo *iphoneos-arm.deb)
EEVEESPOTIFY_ROOTLESS=$(echo *iphoneos-arm64.deb)
EEVEESPOTIFY_VERSION=${${(s:_:)EEVEESPOTIFY_ROOTFUL}[2]}
echo "EEVEESPOTIFY_ROOTFUL=$EEVEESPOTIFY_ROOTFUL" >> $GITHUB_ENV
echo "EEVEESPOTIFY_ROOTLESS=$EEVEESPOTIFY_ROOTLESS" >> $GITHUB_ENV
echo "EEVEESPOTIFY_VERSION=$EEVEESPOTIFY_VERSION" >> $GITHUB_ENV
- name: Download SwiftProtobuf
run: |
wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb
wget https://github.com/whoeevee/swift-protobuf/releases/download/${{ env.SWIFTPROTOBUF_VERSION }}/org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb
echo "SWIFTPROTOBUF_ROOTFUL=org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm.deb" >> $GITHUB_ENV
echo "SWIFTPROTOBUF_ROOTLESS=org.swift.protobuf.swiftprotobuf_${{ env.SWIFTPROTOBUF_VERSION }}_iphoneos-arm64.deb" >> $GITHUB_ENV
- name: Download OpenSpotifySafariExtension
run: |
git clone https://github.com/BillyCurtis/OpenSpotifySafariExtension
echo "OPENSPOTIFYSAFARIEXTENSION=OpenSpotifySafariExtension/OpenSpotifySafariExtension.appex" >> $GITHUB_ENV
- name: Download Decrypted Spotify Package
run: |
response=$(curl -ks 'https://decrypt.whoeevee.com/decrypted?appId=324684580&apiKey=${{ secrets.EEVEEDECRYPTER_API_KEY }}')
link=$(echo "$response" | jq -r '.link')
wget --no-check-certificate -q $link
echo "SPOTIFY_VERSION=${${(s/-/)link}[2]%.ipa}" >> $GITHUB_ENV
echo "SPOTIFY_PACKAGE=$(echo *.ipa)" >> $GITHUB_ENV
- name: Setup insert-dylib
run: |
git clone https://github.com/Tyilo/insert_dylib.git
xcrun clang -x c -arch arm64 ./insert_dylib/insert_dylib/main.c -I/usr/include/ -o insert-dylib
sudo mv insert-dylib /usr/local/bin/
sudo chmod +x /usr/local/bin/insert-dylib
- name: Setup ivinject
run: |
git clone https://github.com/whoeevee/ivinject.git
cp -r ./ivinject/KnownFrameworks ~/.ivinject
wget https://github.com/whoeevee/ivinject/releases/download/first/ivinject-arm64
sudo mv ivinject-arm64 /usr/local/bin/
sudo chmod +x /usr/local/bin/ivinject-arm64
- name: Setup ipapatch
run: |
wget https://github.com/asdfzxcvbn/ipapatch/releases/download/v2.1.0/ipapatch.macos-arm64
sudo mv ipapatch.macos-arm64 /usr/local/bin/ipapatch
sudo chmod +x /usr/local/bin/ipapatch
- name: Check Version
env:
GH_TOKEN: ${{ github.token }}
run: |
LATEST_EEVEESPOTIFY_VERSION=$(gh release list --limit 1 --json tagName --jq '.[0].tagName[5:]')
echo "LATEST_EEVEESPOTIFY_VERSION=$LATEST_EEVEESPOTIFY_VERSION" >> $GITHUB_ENV
- name: Create EeveeSpotify Package
run: |
EEVEESPOTIFY_PACKAGE="EeveeSpotify-${EEVEESPOTIFY_VERSION}-${SPOTIFY_VERSION}.ipa"
echo "EEVEESPOTIFY_PACKAGE=$EEVEESPOTIFY_PACKAGE" >> $GITHUB_ENV
ivinject-arm64 "$SPOTIFY_PACKAGE" "$EEVEESPOTIFY_PACKAGE" \
-i "$EEVEESPOTIFY_ROOTFUL" "$SWIFTPROTOBUF_ROOTFUL" "$OPENSPOTIFYSAFARIEXTENSION" \
-s - -d --level Optimal
- name: Create Patched Package
run: |
EEVEESPOTIFY_PATCHED_PACKAGE="EeveeSpotify-${EEVEESPOTIFY_VERSION}-${SPOTIFY_VERSION}-patched.ipa"
echo "EEVEESPOTIFY_PATCHED_PACKAGE=$EEVEESPOTIFY_PATCHED_PACKAGE" >> $GITHUB_ENV
ipapatch -input "$EEVEESPOTIFY_PACKAGE" -output "$EEVEESPOTIFY_PATCHED_PACKAGE"
- name: Compose Changelog
if: env.LATEST_EEVEESPOTIFY_VERSION != env.EEVEESPOTIFY_VERSION
env:
GH_TOKEN: ${{ github.token }}
run: |
last_update_repo_date=$(git log --grep="bump" --format=%cI | sed -n 2p)
CHANGELOG=""
gh pr list --state merged --search "merged:>${last_update_repo_date}" --json files,author \
| jq -r '
.[]
| .author.login as $login
| .files[0].path as $file
| "\($login) \($file)"
' \
| tail -r \
| while read -r login file; do
lang_code=$(echo "$file" | grep -oE '/([a-zA-Z-]+)\.lproj/' | sed -E 's|/([a-zA-Z-]+)\.lproj/|\1|')
lang_name=$(echo "import Foundation; print(Locale.current.localizedString(forIdentifier: \"$lang_code\") ?? \"\")" | swift -)
if [ -z "$lang_name" ]; then
continue
fi
CHANGELOG+="* Updated ${lang_name} localization by @${login}"$'\n'
done
echo "CHANGELOG<<EOF" >> $GITHUB_ENV
echo "$CHANGELOG" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
- name: Create Release
if: env.LATEST_EEVEESPOTIFY_VERSION != env.EEVEESPOTIFY_VERSION
uses: actions/create-release@v1
env:
GITHUB_TOKEN: ${{ github.token }}
with:
tag_name: swift${{ env.EEVEESPOTIFY_VERSION }}
release_name: Swift ${{ env.EEVEESPOTIFY_VERSION }}
body: ${{ env.CHANGELOG }}
draft: false
prerelease: false
- name: Upload Packages
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release upload "swift$EEVEESPOTIFY_VERSION" \
"$EEVEESPOTIFY_ROOTFUL" "$EEVEESPOTIFY_ROOTLESS" \
"$SWIFTPROTOBUF_ROOTFUL" "$SWIFTPROTOBUF_ROOTLESS" \
--clobber
- name: Upload Packages to Telegram
env:
API_ID: ${{ secrets.API_ID }}
API_HASH: ${{ secrets.API_HASH }}
BOT_TOKEN: ${{ secrets.BOT_TOKEN }}
EEVEESPOTIFY_CHANNEL_ID: ${{ secrets.EEVEESPOTIFY_CHANNEL_ID }}
EEVEESPOTIFY_CHANNEL_ACCESS_HASH: ${{ secrets.EEVEESPOTIFY_CHANNEL_ACCESS_HASH }}
run: ./Tools/TelegramUploadEeveeSpotify