Dimitris Panokostas 357cb2de4a
bugfix: fix bundled plugins on MacOS (#1540) (#1541)
The bundled plugins of capsimg and floppybridge, were not included in the final app bundle.
Furthermore, they need to be signed with the same digital certificate, otherwise MacOS will block them from loading.
2024-12-19 16:38:38 +01:00

585 lines
21 KiB
YAML

name: C/C++ CI
on:
workflow_dispatch:
push:
pull_request:
jobs:
build-macOS-x86_64:
runs-on: macos-13
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Fix homebrew in Github Runner
run: |
for f in $(find /usr/local/bin -type l -print); do \
(readlink $f | grep -q -s "/Library") && echo Removing "$f" && rm -f "$f"; \
done || exit 0
- name: Install dependencies
run: |
brew update
brew install sdl2 mpg123 sdl2_ttf sdl2_image flac libmpeg2 libserialport portmidi enet dylibbundler
- name: Install the Apple certificate
env:
APPLE_DEVID_CERT_BASE64: ${{ secrets.APPLE_DEVID_CERT_BASE64 }}
APPLE_DEVID_CERT_P12_PASSWORD: ${{ secrets.APPLE_DEVID_CERT_P12_PASSWORD }}
APPLE_KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
run: |
# create variables
CERTIFICATE_PATH=$RUNNER_TEMP/apple_devid_cert.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
# import certificate from secret
echo -n "$APPLE_DEVID_CERT_BASE64" | base64 --decode -o $CERTIFICATE_PATH
# create keychain
security create-keychain -p $APPLE_KEYCHAIN_PASSWORD $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p $APPLE_KEYCHAIN_PASSWORD $KEYCHAIN_PATH
# import certificate to keychain
security import $CERTIFICATE_PATH -P $APPLE_DEVID_CERT_P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: -s -k $APPLE_KEYCHAIN_PASSWORD $KEYCHAIN_PATH
security list-keychains -d user -s $KEYCHAIN_PATH
- name: Build for macOS X64
run: |
cmake -B build && cmake --build build -j4
- name: Codesign the dylibs
run: |
for file in build/Amiberry.app/Contents/Frameworks/*.dylib; do
if [ -f "$file" ]; then
codesign -s "Developer ID Application: Dimitris Panokostas (5GQP72592A)" -f -o runtime,hard $file
fi
done
for file in build/Amiberry.app/Contents/Resources/plugins/*.dylib; do
if [ -f "$file" ]; then
codesign -s "Developer ID Application: Dimitris Panokostas (5GQP72592A)" -f -o runtime,hard $file
fi
done
- name: Codesign the app
run: |
codesign -s "Developer ID Application: Dimitris Panokostas (5GQP72592A)" -f -o runtime,hard build/Amiberry.app
- name: Create a zip to send to the notary service
run: |
zip -r Amiberry-${{ github.sha }}-macOS-x86_64.zip build/Amiberry.app
- name: Send the file to be notarized by Apple
run: |
xcrun notarytool submit Amiberry-${{ github.sha }}-macOS-x86_64.zip --wait --apple-id "midwan@gmail.com" --password ${{ secrets.APPLE_NOTARY_APP_PASSWORD }} --team-id ${{ secrets.APPLE_TEAM_ID }}
- name: Staple the notary receipt to the application bundle
run: |
xcrun stapler staple build/Amiberry.app
rm Amiberry-${{ github.sha }}-macOS-x86_64.zip
- name: Create DMG package
run: |
cpack -G DragNDrop --config build/CPackConfig.cmake
- name: ZIP package
if: github.ref_type != 'tag'
run: zip -r Amiberry-${{ github.sha }}-macOS-x86_64.zip Amiberry-*.dmg
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r Amiberry-${{ github.ref_name }}-macOS-x86_64.zip Amiberry-*.dmg
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: amiberry-macOS-64bit-intel
path: Amiberry-*.zip
build-macOS-Apple-Silicon:
runs-on: macos-latest
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Install dependencies
run: |
brew update
brew upgrade
brew install sdl2 mpg123 sdl2_ttf sdl2_image flac libmpeg2 libserialport portmidi enet dylibbundler
- name: Install the Apple certificate
env:
APPLE_DEVID_CERT_BASE64: ${{ secrets.APPLE_DEVID_CERT_BASE64 }}
APPLE_DEVID_CERT_P12_PASSWORD: ${{ secrets.APPLE_DEVID_CERT_P12_PASSWORD }}
APPLE_KEYCHAIN_PASSWORD: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }}
run: |
# create variables
CERTIFICATE_PATH=$RUNNER_TEMP/apple_devid_cert.p12
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
# import certificate from secret
echo -n "$APPLE_DEVID_CERT_BASE64" | base64 --decode -o $CERTIFICATE_PATH
# create keychain
security create-keychain -p $APPLE_KEYCHAIN_PASSWORD $KEYCHAIN_PATH
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
security unlock-keychain -p $APPLE_KEYCHAIN_PASSWORD $KEYCHAIN_PATH
# import certificate to keychain
security import $CERTIFICATE_PATH -P $APPLE_DEVID_CERT_P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
security set-key-partition-list -S apple-tool:,apple: -s -k $APPLE_KEYCHAIN_PASSWORD $KEYCHAIN_PATH
security list-keychains -d user -s $KEYCHAIN_PATH
- name: Build for macOS Apple Silicon
run: |
cmake -B build && cmake --build build -j4
- name: Codesign the dylibs
run: |
for file in build/Amiberry.app/Contents/Frameworks/*.dylib; do
if [ -f "$file" ]; then
codesign -s "Developer ID Application: Dimitris Panokostas (5GQP72592A)" -f -o runtime,hard $file
fi
done
for file in build/Amiberry.app/Contents/Resources/plugins/*.dylib; do
if [ -f "$file" ]; then
codesign -s "Developer ID Application: Dimitris Panokostas (5GQP72592A)" -f -o runtime,hard $file
fi
done
- name: Codesign the app
run: |
codesign -s "Developer ID Application: Dimitris Panokostas (5GQP72592A)" -f -o runtime,hard build/Amiberry.app
- name: Create a zip to send to the notary service
run: |
zip -r Amiberry-${{ github.sha }}-macOS-Apple-Silicon.zip build/Amiberry.app
- name: Send the file to be notarized by Apple
run: |
xcrun notarytool submit Amiberry-${{ github.sha }}-macOS-Apple-Silicon.zip --wait --apple-id "midwan@gmail.com" --password ${{ secrets.APPLE_NOTARY_APP_PASSWORD }} --team-id ${{ secrets.APPLE_TEAM_ID }}
- name: Staple the notary receipt to the application bundle
run: |
xcrun stapler staple build/Amiberry.app
rm Amiberry-${{ github.sha }}-macOS-Apple-Silicon.zip
- name: Create DMG package
run: |
cpack -G DragNDrop --config build/CPackConfig.cmake
- name: ZIP package
if: github.ref_type != 'tag'
run: zip -r Amiberry-${{ github.sha }}-macOS-apple-silicon.zip Amiberry-*.dmg
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r Amiberry-${{ github.ref_name }}-macOS-apple-silicon.zip Amiberry-*.dmg
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: amiberry-macOS-64bit-apple-silicon
path: Amiberry-*.zip
build-ubuntu-24-amd64:
runs-on: ubuntu-24.04
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build libflac-dev libmpeg2-4-dev libpng-dev libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libasound2-dev libmpg123-dev libportmidi-dev libserialport-dev libenet-dev
- name: make for Ubuntu 24.04 AMD64
run: |
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-ubuntu-24.04-amd64
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-ubuntu-24.04-amd64.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-ubuntu-24.04-amd64
path: amiberry-*.zip
build-ubuntu-22-amd64:
runs-on: ubuntu-22.04
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build libflac-dev libmpeg2-4-dev libpng-dev libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libasound2-dev libmpg123-dev libportmidi-dev libserialport-dev libenet-dev
- name: make for Ubuntu 22.04 AMD64
run: |
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-ubuntu-22.04-amd64
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-ubuntu-22.04-amd64.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-ubuntu-22.04-amd64
path: amiberry-*.zip
build-ubuntu-20-amd64:
runs-on: ubuntu-20.04
steps:
- name: Check out repository code
uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y build-essential cmake ninja-build libflac-dev libmpeg2-4-dev libpng-dev libsdl2-dev libsdl2-ttf-dev libsdl2-image-dev libasound2-dev libmpg123-dev libportmidi-dev libserialport-dev libenet-dev
- name: make for Ubuntu 20.04 AMD64
run: |
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-ubuntu-20.04-amd64
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-ubuntu-20.04-amd64.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-ubuntu-20.04-amd64
path: amiberry-*.zip
build-fedora-x86_64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run the build process with Docker
uses: addnab/docker-run-action@v3
with:
image: midwan/amiberry-fedora-x86_64:latest
options: -v ${{ github.workspace }}:/build
run: |
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G RPM --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-fedora-x86_64
path: amiberry-*.rpm
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-fedora-x86_64.zip amiberry-*.rpm
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-fedora-x86_64
path: amiberry-*.zip
build-debian-bullseye-amd64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run the build process with Docker
uses: addnab/docker-run-action@v3
with:
image: midwan/amiberry-debian-x86_64:bullseye
options: -v ${{ github.workspace }}:/build
run: |
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bullseye-amd64
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-debian-bullseye-amd64.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bullseye-amd64
path: amiberry-*.zip
build-debian-bookworm-amd64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run the build process with Docker
uses: addnab/docker-run-action@v3
with:
image: midwan/amiberry-debian-x86_64:bookworm
options: -v ${{ github.workspace }}:/build
run: |
cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bookworm-amd64
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-debian-bookworm-amd64.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bookworm-amd64
path: amiberry-*.zip
build-debian-bookworm-arm64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run the build process with Docker
uses: addnab/docker-run-action@v3
with:
image: midwan/amiberry-debian-aarch64:bookworm
options: -v ${{ github.workspace }}:/build
run: |
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchain-aarch64-linux-gnu.cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bookworm-arm64
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-debian-bookworm-arm64.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bookworm-arm64
path: amiberry-*.zip
build-debian-bookworm-armhf:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run the build process with Docker
uses: addnab/docker-run-action@v3
with:
image: midwan/amiberry-debian-armhf:bookworm
options: -v ${{ github.workspace }}:/build
run: |
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchain-arm-linux-gnueabihf.cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bookworm-armhf
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-debian-bookworm-armhf.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bookworm-armhf
path: amiberry-*.zip
build-debian-bullseye-arm64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run the build process with Docker
uses: addnab/docker-run-action@v3
with:
image: midwan/amiberry-debian-aarch64:bullseye
options: -v ${{ github.workspace }}:/build
run: |
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchain-aarch64-linux-gnu.cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bullseye-arm64
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-debian-bullseye-arm64.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bullseye-arm64
path: amiberry-*.zip
build-debian-bullseye-armhf:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run the build process with Docker
uses: addnab/docker-run-action@v3
with:
image: midwan/amiberry-debian-armhf:bullseye
options: -v ${{ github.workspace }}:/build
run: |
cmake -DCMAKE_TOOLCHAIN_FILE=cmake/Toolchain-arm-linux-gnueabihf.cmake -B build -G Ninja -DCMAKE_INSTALL_PREFIX=/usr && cmake --build build -j4
cpack -G DEB --config build/CPackConfig.cmake
- name: Upload artifact
if: github.ref_type != 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bullseye-armhf
path: amiberry_*.deb
- name: ZIP package for release
if: github.ref_type == 'tag'
run: zip -r amiberry-${{ github.ref_name }}-debian-bullseye-armhf.zip amiberry_*.deb
- name: Upload artifact for release
if: github.ref_type == 'tag'
uses: actions/upload-artifact@v4
with:
name: amiberry-debian-bullseye-armhf
path: amiberry-*.zip
create-release:
needs: [build-macOS-x86_64, build-macOS-Apple-Silicon, build-fedora-x86_64, build-ubuntu-24-amd64, build-ubuntu-22-amd64, build-ubuntu-20-amd64, build-debian-bookworm-amd64, build-debian-bookworm-arm64, build-debian-bookworm-armhf, build-debian-bullseye-amd64, build-debian-bullseye-arm64, build-debian-bullseye-armhf]
runs-on: ubuntu-latest
if: github.ref_type == 'tag' && startsWith(github.ref_name, 'v')
steps:
- uses: actions/checkout@v4
- name: Create Changelog
if: github.ref_type == 'tag'
id: changelog
uses: loopwerk/tag-changelog@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
config_file: .github/tag-changelog-config.js
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true
- name: Display structure of downloaded files
run: ls -R artifacts
- name: Create Release
if: github.ref_type == 'tag'
uses: ncipollo/release-action@v1
with:
allowUpdates: true
omitBodyDuringUpdate: true
body: ${{ steps.changelog.outputs.changes }}
artifacts: |
artifacts/amiberry-*.*
artifacts/Amiberry-*.*
create-prerelease:
needs: [build-macOS-x86_64, build-macOS-Apple-Silicon, build-fedora-x86_64, build-ubuntu-24-amd64, build-ubuntu-22-amd64, build-ubuntu-20-amd64,build-debian-bookworm-amd64, build-debian-bookworm-arm64, build-debian-bookworm-armhf, build-debian-bullseye-amd64, build-debian-bullseye-arm64, build-debian-bullseye-armhf]
runs-on: ubuntu-latest
if: github.ref_type == 'tag' && startsWith(github.ref_name, 'preview-v')
steps:
- uses: actions/checkout@v4
- name: Create Changelog
if: github.ref_type == 'tag'
id: changelog
uses: loopwerk/tag-changelog@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
config_file: .github/tag-changelog-config.js
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true
- name: Display structure of downloaded files
run: ls -R artifacts
- name: Create PreRelease
if: github.ref_type == 'tag'
uses: ncipollo/release-action@v1
with:
prerelease: true
allowUpdates: true
omitBodyDuringUpdate: true
body: ${{ steps.changelog.outputs.changes }}
artifacts: |
artifacts/amiberry-*.*
artifacts/Amiberry-*.*