Files
oak-editor/.github/workflows/cd.yml
T

240 lines
8.5 KiB
YAML

name: CD
on:
push:
tags:
- 'v*'
workflow_dispatch:
permissions:
contents: write
jobs:
# ------------------------------------------------------------------
# Windows Installer (MSYS2)
# ------------------------------------------------------------------
windows:
runs-on: warp-windows-latest-x64-16x
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: UCRT64
update: true
cache: true
install: >-
mingw-w64-ucrt-x86_64-cmake
mingw-w64-ucrt-x86_64-ninja
mingw-w64-ucrt-x86_64-gcc
mingw-w64-ucrt-x86_64-qt6-base
mingw-w64-ucrt-x86_64-qt6-tools
mingw-w64-ucrt-x86_64-ffmpeg
mingw-w64-ucrt-x86_64-openimageio
mingw-w64-ucrt-x86_64-opencolorio
mingw-w64-ucrt-x86_64-openexr
mingw-w64-ucrt-x86_64-fmt
mingw-w64-ucrt-x86_64-expat
mingw-w64-ucrt-x86_64-portaudio
mingw-w64-ucrt-x86_64-nsis
mingw-w64-ucrt-x86_64-ntldd
- name: Configure
shell: msys2 {0}
run: |
cmake -S . -B build -G Ninja \
-DBUILD_QT6=ON \
-DCMAKE_BUILD_TYPE=Release
- name: Build
shell: msys2 {0}
run: cmake --build build --config Release
- name: Deploy dependencies
shell: msys2 {0}
run: |
mkdir -p app/packaging/windows/nsis/olive-editor
cp build/app/olive-editor.exe app/packaging/windows/nsis/olive-editor/
windeployqt6 app/packaging/windows/nsis/olive-editor/olive-editor.exe
# Copy all non-Qt MSYS2 DLLs recursively
cd app/packaging/windows/nsis/olive-editor
for l in $(ntldd -R olive-editor.exe | grep -E 'mingw64|ucrt64|clang64' | sed 's/^[ \t]*//' | cut -d' ' -f3); do
cp -v "$l" .
done
- name: Build installer
shell: msys2 {0}
run: |
cd app/packaging/windows/nsis
cp "${GITHUB_WORKSPACE}"/LICENSE .
makensis olive.nsi
mv setup.exe "${GITHUB_WORKSPACE}"/Oak-Video-Editor-Windows-x64.exe
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: oak-windows-installer
path: Oak-Video-Editor-Windows-x64.exe
# ------------------------------------------------------------------
# macOS DMG
# ------------------------------------------------------------------
macos:
runs-on: warp-macos-15-arm64-12x
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install dependencies
run: |
brew update
brew install cmake ninja pkg-config qt@6 ffmpeg openimageio opencolorio openexr portaudio expat dylibbundler
- name: Build OpenTimelineIO
run: |
git clone --depth 1 --branch v0.16.0 https://github.com/PixarAnimationStudios/OpenTimelineIO.git
cmake -S OpenTimelineIO -B OpenTimelineIO/build -G Ninja \
-DOTIO_SHARED_LIBS=ON \
-DOTIO_PYTHON_BINDINGS=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX="${PWD}/otio-install"
cmake --build OpenTimelineIO/build
cmake --install OpenTimelineIO/build
- name: Configure
run: |
export PATH="$(brew --prefix qt@6)/bin:$PATH"
export CMAKE_PREFIX_PATH="$(brew --prefix qt@6)"
cmake -S . -B build -G Ninja \
-DBUILD_QT6=ON \
-DCMAKE_BUILD_TYPE=Release \
-DOTIO_LOCATION="${PWD}/otio-install" \
-DOCIO_LOCATION="$(brew --prefix opencolorio)"
- name: Build
run: cmake --build build --config Release
- name: Deploy Qt dependencies
run: |
export PATH="$(brew --prefix qt@6)/bin:$PATH"
macdeployqt build/app/Olive.app
- name: Bundle non-Qt libraries
run: |
mkdir -p build/app/Olive.app/Contents/Frameworks
dylibbundler -od -b \
-x build/app/Olive.app/Contents/MacOS/Olive \
-d build/app/Olive.app/Contents/Frameworks/ \
-p @executable_path/../Frameworks
- name: Create DMG
run: |
hdiutil create \
-srcfolder build/app/Olive.app \
-volname "Oak Video Editor" \
-fs HFS+ \
-format UDZO \
Oak-Video-Editor-macOS.dmg
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: oak-macos-dmg
path: Oak-Video-Editor-macOS.dmg
# ------------------------------------------------------------------
# Linux AppImage (Ubuntu 24.04 — distro FFmpeg 6.x)
# ------------------------------------------------------------------
appimage:
runs-on: warp-ubuntu-latest-x64-16x
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
cmake ninja-build pkg-config \
qt6-base-dev qt6-base-dev-tools qt6-base-private-dev qt6-tools-dev qt6-tools-dev-tools \
libavcodec-dev libavformat-dev libavutil-dev libswscale-dev libswresample-dev libavfilter-dev \
libopencolorio-dev libopenimageio-dev libopenexr-dev libexpat1-dev \
portaudio19-dev libgl1-mesa-dev libxkbcommon-dev \
wget fuse3 desktop-file-utils
- name: Build
run: |
cmake -S . -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DBUILD_QT6=ON
cmake --build build
- name: Install to AppDir
run: |
DESTDIR="${PWD}"/AppDir cmake --install build
# Copy custom AppRun
cp app/packaging/linux/AppRun AppDir/
- name: Create AppImage
env:
APPIMAGE_EXTRACT_AND_RUN: 1
run: |
wget -q "https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"
wget -q "https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage"
wget -q "https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-x86_64.AppImage"
chmod +x linuxdeploy-x86_64.AppImage linuxdeploy-plugin-qt-x86_64.AppImage appimagetool-x86_64.AppImage
export PATH="${PWD}:${PATH}"
./linuxdeploy-x86_64.AppImage \
--appdir AppDir \
--plugin qt \
--desktop-file AppDir/usr/share/applications/org.oakvideoeditor.Oak.desktop \
--icon-file AppDir/usr/share/icons/hicolor/512x512/apps/org.oakvideoeditor.Oak.png \
--output appimage
- name: Verify bundled libraries
run: |
# Ensure FFmpeg shared libraries are present inside the AppDir
ls AppDir/usr/lib/libavcodec.so* || (echo "Missing libavcodec" && exit 1)
ls AppDir/usr/lib/libavformat.so* || (echo "Missing libavformat" && exit 1)
ls AppDir/usr/lib/libavutil.so* || (echo "Missing libavutil" && exit 1)
ls AppDir/usr/lib/libswscale.so* || (echo "Missing libswscale" && exit 1)
ls AppDir/usr/lib/libswresample.so* || (echo "Missing libswresample" && exit 1)
# Ensure other runtime dependencies are present
ls AppDir/usr/lib/libOpenImageIO.so* || (echo "Missing libOpenImageIO" && exit 1)
ls AppDir/usr/lib/libOpenColorIO.so* || (echo "Missing libOpenColorIO" && exit 1)
ls AppDir/usr/lib/libportaudio.so* || (echo "Missing libportaudio" && exit 1)
ls AppDir/usr/lib/libOpenEXR*.so* || (echo "Missing libOpenEXR" && exit 1)
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: oak-linux-appimage
path: Oak_Video_Editor-*.AppImage
# ------------------------------------------------------------------
# Create Draft Release
# ------------------------------------------------------------------
release:
needs: [windows, macos, appimage]
runs-on: ubuntu-latest
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true
- name: Create Draft Release
uses: softprops/action-gh-release@v2
with:
draft: true
tag_name: ${{ github.ref_name }}
name: ${{ github.ref_name }}
files: artifacts/*