Release CLI #38
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# # Run for macOS | |
# act -W .github/workflows/release-cli.yml --container-architecture linux/amd64 -j build-macos -P macos-latest=-self-hosted | |
# # Run for Linux | |
# act -W .github/workflows/release-cli.yml --container-architecture linux/amd64 -j build-ubuntu -P ubuntu-24.04 | |
name: Release CLI | |
on: | |
push: | |
tags: | |
- "v*" | |
workflow_dispatch: | |
permissions: | |
contents: write | |
jobs: | |
build-macos: | |
runs-on: macos-latest | |
strategy: | |
matrix: | |
target: [x86_64-apple-darwin, aarch64-apple-darwin] | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v4 | |
- name: Set up Rust | |
uses: actions-rs/toolchain@v1 | |
with: | |
toolchain: stable | |
profile: minimal | |
override: true | |
target: ${{ matrix.target }} | |
- name: Cache Homebrew packages | |
uses: actions/cache@v3 | |
with: | |
path: | | |
~/Library/Caches/Homebrew | |
/usr/local/Cellar/ffmpeg | |
/usr/local/Cellar/pkg-config | |
key: ${{ runner.os }}-brew-${{ hashFiles('.github/workflows/release-cli.yml') }} | |
restore-keys: | | |
${{ runner.os }}-brew- | |
- name: Install dependencies | |
run: | | |
brew install ffmpeg pkg-config | |
- uses: actions/cache@v3 | |
with: | |
path: | | |
~/.cargo/bin/ | |
~/.cargo/registry/index/ | |
~/.cargo/registry/cache/ | |
~/.cargo/git/db/ | |
key: ${{ matrix.platform }}-cargo-${{ hashFiles('**/Cargo.lock') }} | |
- name: Build with Metal feature | |
env: | |
DESTINATION: "brew" | |
run: | | |
export PKG_CONFIG_PATH="/usr/local/opt/ffmpeg/lib/pkgconfig:$PKG_CONFIG_PATH" | |
export PKG_CONFIG_ALLOW_CROSS=1 | |
cargo build --release --features metal --target ${{ matrix.target }} | |
# get the current tag or take latest (in the case of a workflow dispatch) | |
- name: Set version | |
run: | | |
if [[ $GITHUB_REF == refs/tags/* ]]; then | |
VERSION=${GITHUB_REF#refs/tags/v} | |
else | |
VERSION=$(git ls-remote --tags --refs --sort="version:refname" | tail -n1 | sed 's/.*\///' | sed 's/^v//') | |
fi | |
if [[ -z "$VERSION" ]]; then | |
VERSION="0.0.0" | |
fi | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
echo "Set version to: $VERSION" | |
- name: Create deployment package | |
run: | | |
mkdir -p screenpipe-${{ env.VERSION }}-${{ matrix.target }}/bin | |
mkdir -p screenpipe-${{ env.VERSION }}-${{ matrix.target }}/lib | |
cp target/${{ matrix.target }}/release/screenpipe screenpipe-${{ env.VERSION }}-${{ matrix.target }}/bin/ | |
cp target/${{ matrix.target }}/release/libscreenpipe.dylib screenpipe-${{ env.VERSION }}-${{ matrix.target }}/lib/ | |
tar -czf screenpipe-${{ env.VERSION }}-${{ matrix.target }}.tar.gz -C screenpipe-${{ env.VERSION }}-${{ matrix.target }} . | |
- name: Calculate SHA256 | |
run: | | |
echo "MAC_SHA256_${{ matrix.target }}=$(shasum -a 256 screenpipe-*.tar.gz | cut -d ' ' -f 1)" >> $GITHUB_ENV | |
- name: Update Homebrew Formula | |
run: | | |
export VERSION=${{ env.VERSION }} | |
git config user.name "GitHub Actions Bot" | |
git config user.email "github-actions[bot]@users.noreply.github.com" | |
git remote set-url origin https://x-access-token:${GH_TOKEN}@github.com/${GITHUB_REPOSITORY}.git | |
git fetch origin main | |
git checkout -b update-formula-${{ matrix.target }}-${{ github.sha }} | |
git merge origin/main --no-edit | |
sed -i '' 's/version ".*"/version "'$VERSION'"/' Formula/screenpipe.rb | |
if [ "${{ matrix.target }}" = "x86_64-apple-darwin" ]; then | |
sed -i '' 's/sha256 ".*" # x86_64/sha256 "'${{ env.MAC_SHA256_x86_64-apple-darwin }}'" # x86_64/' Formula/screenpipe.rb | |
else | |
sed -i '' 's/sha256 ".*" # arm64/sha256 "'${{ env.MAC_SHA256_aarch64-apple-darwin }}'" # arm64/' Formula/screenpipe.rb | |
fi | |
sed -i '' 's|v[0-9.]*\/screenpipe-[0-9.]*-${{ matrix.target }}|v'$VERSION'\/screenpipe-'$VERSION'-${{ matrix.target }}|' Formula/screenpipe.rb | |
git add Formula/screenpipe.rb | |
git commit -m "chore: update brew to version ${{ env.VERSION }} for ${{ matrix.target }}" | |
git push -u origin update-formula-${{ matrix.target }}-${{ github.sha }} | |
- name: Create Pull Request | |
env: | |
GH_TOKEN: ${{ secrets.PAT }} | |
run: | | |
gh pr create --base main --head update-formula-${{ matrix.target }}-${{ github.sha }} --title "Update Homebrew formula for ${{ matrix.target }}" --body "Automated PR to update Homebrew formula for ${{ matrix.target }}" | |
- name: Upload Artifact | |
uses: actions/upload-artifact@v2 | |
with: | |
name: screenpipe-macos-${{ matrix.target }} | |
path: screenpipe-*.tar.gz | |
# build-ubuntu: | |
# runs-on: ubuntu-latest | |
# steps: | |
# - name: Checkout code | |
# uses: actions/checkout@v2 | |
# - name: Install dependencies | |
# run: | | |
# sudo apt-get update | |
# sudo apt-get install -y libavformat-dev libavfilter-dev libavdevice-dev ffmpeg libasound2-dev | |
# - name: Set up Rust | |
# uses: actions-rs/toolchain@v1 | |
# with: | |
# toolchain: stable | |
# profile: minimal | |
# override: true | |
# - name: Build with RPATH | |
# run: | | |
# export PKG_CONFIG_PATH="/usr/lib/x86_64-linux-gnu/pkgconfig:$PKG_CONFIG_PATH" | |
# export RUSTFLAGS="-C link-arg=-Wl,-rpath,\$ORIGIN/lib" | |
# cargo build --release | |
# - name: Copy FFmpeg libraries | |
# run: | | |
# mkdir -p target/release/lib | |
# cp /usr/lib/x86_64-linux-gnu/libavcodec.so* target/release/lib/ | |
# cp /usr/lib/x86_64-linux-gnu/libavformat.so* target/release/lib/ | |
# cp /usr/lib/x86_64-linux-gnu/libavutil.so* target/release/lib/ | |
# cp /usr/lib/x86_64-linux-gnu/libswresample.so* target/release/lib/ | |
# cp /usr/lib/x86_64-linux-gnu/libswscale.so* target/release/lib/ | |
# cp /usr/lib/x86_64-linux-gnu/libavfilter.so* target/release/lib/ | |
# cp /usr/lib/x86_64-linux-gnu/libavdevice.so* target/release/lib/ | |
# - name: Create deployment package | |
# run: | | |
# mkdir -p screenpipe-linux | |
# cp target/release/screenpipe screenpipe-linux/screenpipe | |
# cp -r target/release/lib screenpipe-linux/ | |
# chmod +x screenpipe-linux/screenpipe | |
# tar -czvf screenpipe-linux.tar.gz screenpipe-linux | |
# - name: Upload Artifact | |
# uses: actions/upload-artifact@v2 | |
# with: | |
# name: screenpipe-linux | |
# path: screenpipe-linux.tar.gz | |
# build-windows: | |
# runs-on: windows-latest | |
# steps: | |
# - name: Checkout code | |
# uses: actions/checkout@v2 | |
# - name: Set up Rust | |
# uses: actions-rs/toolchain@v1 | |
# with: | |
# toolchain: stable | |
# profile: minimal | |
# override: true | |
# - name: Download FFmpeg | |
# run: | | |
# $ProgressPreference = 'SilentlyContinue' | |
# Invoke-WebRequest -Uri "https://github.com/BtbN/FFmpeg-Builds/releases/download/latest/ffmpeg-master-latest-win64-gpl-shared.zip" -OutFile "ffmpeg.zip" | |
# Expand-Archive -Path "ffmpeg.zip" -DestinationPath "ffmpeg" | |
# Move-Item -Path "ffmpeg\ffmpeg-master-latest-win64-gpl-shared" -Destination "C:\ffmpeg" | |
# - name: Set up environment | |
# run: | | |
# echo "C:\ffmpeg\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
# echo "FFMPEG_DIR=C:\ffmpeg" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
# echo "PKG_CONFIG_PATH=C:\ffmpeg\lib\pkgconfig" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
# - name: Build release | |
# run: | | |
# cargo build --release --verbose | |
# - name: Create deployment package | |
# run: | | |
# $VERSION = $env:GITHUB_REF -replace 'refs/tags/v', '' | |
# New-Item -ItemType Directory -Path "screenpipe-win64" | |
# Copy-Item "target\release\screenpipe.exe" -Destination "screenpipe-win64" | |
# Copy-Item "C:\ffmpeg\bin\*.dll" -Destination "screenpipe-win64" | |
# Compress-Archive -Path "screenpipe-win64" -DestinationPath "screenpipe-$VERSION-x86_64-pc-windows-msvc.zip" | |
# - name: Upload Artifact | |
# uses: actions/upload-artifact@v2 | |
# with: | |
# name: screenpipe-windows | |
# path: screenpipe-*.zip | |
release: | |
runs-on: ubuntu-latest | |
needs: [build-macos] # ubuntu, build-windows windows not supported atm, build from source bro | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v2 | |
# get the current tag or take latest (in the case of a workflow dispatch) | |
- name: Set version | |
run: | | |
if [[ $GITHUB_REF == refs/tags/* ]]; then | |
VERSION=${GITHUB_REF#refs/tags/v} | |
else | |
VERSION=$(git ls-remote --tags --refs --sort="version:refname" | tail -n1 | sed 's/.*\///' | sed 's/^v//') | |
fi | |
if [[ -z "$VERSION" ]]; then | |
VERSION="0.0.0" | |
fi | |
echo "VERSION=$VERSION" >> $GITHUB_ENV | |
echo "Set version to: $VERSION" | |
- name: Download macOS Artifacts | |
uses: actions/download-artifact@v2 | |
with: | |
path: artifacts | |
- name: List artifacts | |
run: ls -R artifacts | |
- name: Create or update Release | |
env: | |
GH_TOKEN: ${{ secrets.PAT }} | |
run: | | |
gh release create v${{ env.VERSION }} --title ${{ env.VERSION }} --generate-notes || true | |
for file in artifacts/screenpipe-macos-*/screenpipe-*.tar.gz; do | |
if [ -f "$file" ]; then | |
gh release upload v${{ env.VERSION }} "$file" --clobber | |
else | |
echo "Warning: $file not found" | |
fi | |
done |