ci: use checkout@v4 #1922
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
name: CI | |
on: | |
push: | |
branches: | |
- master | |
paths-ignore: | |
- '.github/ISSUE_TEMPLATE/**' | |
- '.github/FUNDING.yml' | |
- 'docker/**' | |
- 'CONTRIBUTING.md' | |
- 'README.md' | |
pull_request: | |
paths-ignore: | |
- '.github/ISSUE_TEMPLATE/**' | |
- '.github/FUNDING.yml' | |
- 'app/ts/*.ts' | |
- 'docker/**' | |
- 'CONTRIBUTING.md' | |
- 'README.md' | |
env: | |
DOWNLOAD_TOOL: curl -fLOSs --retry 2 --retry-delay 60 | |
UPLOAD_TOOL: curl -X POST --retry 2 --retry-delay 60 | |
CMAKE_ARGS: -DUSE_WERROR=ON -DBUILD_TESTS=ON | |
jobs: | |
linux: | |
strategy: | |
fail-fast: false | |
matrix: | |
include: | |
#- build-type: RelWithDebInfo | |
# cc-compiler: gcc | |
# cxx-compiler: g++ | |
# compiler-name: GCC 9.3.1 | |
# cmake-gen: Ninja | |
# os-name: Linux (CentOS 7) | |
- build-type: RelWithDebInfo | |
cc-compiler: clang | |
cxx-compiler: clang++ | |
compiler-name: Clang 10.0.0 | |
cmake-gen: Ninja | |
os-name: Linux (CentOS 7) | |
name: | | |
${{ matrix.os-name }} | |
<${{ matrix.compiler-name }}, | |
${{ matrix.build-type }}, | |
${{ matrix.cmake-gen }}> | |
runs-on: ubuntu-latest | |
container: | |
image: olivevideoeditor/ci-olive:2022.3 | |
steps: | |
- name: Checkout Source Code | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
- name: Generate Patreon List | |
env: | |
PATREON_KEY: ${{ secrets.PATREON_KEY }} | |
run: | | |
pip3 install requests | |
cd $GITHUB_WORKSPACE/app/dialog/about | |
python3 patreon.py | |
if: github.event_name == 'push' | |
continue-on-error: true | |
- name: Configure CMake | |
run: | | |
mkdir build | |
cd build | |
cmake .. -G "${{ matrix.cmake-gen }}" \ | |
-DCMAKE_BUILD_TYPE="${{ matrix.build-type }}" \ | |
-DCMAKE_C_COMPILER="${{ matrix.cc-compiler }}" \ | |
-DCMAKE_CXX_COMPILER="${{ matrix.cxx-compiler }}" \ | |
$CMAKE_ARGS | |
- name: Build | |
working-directory: build | |
run: | | |
cmake --build . | |
- name: Test | |
working-directory: build | |
run: | | |
ctest -C ${{ matrix.build-type }} -V | |
- name: Create Package | |
id: package | |
working-directory: build | |
env: | |
ARCH: x86_64 | |
run: | | |
# Create install tree | |
cmake --install app --prefix appdir/usr | |
# Inject custom AppRun (linuxdeployqt won't replace if it already exists) | |
cp $GITHUB_WORKSPACE/app/packaging/linux/AppRun appdir | |
# Process AppDir | |
/usr/local/linuxdeployqt-x86_64.AppImage \ | |
appdir/usr/share/applications/org.olivevideoeditor.Olive.desktop \ | |
-exclude-libs=libQt5Pdf.so,libQt5Qml.so,libQt5QmlModels.so,libQt5Quick.so,libQt5VirtualKeyboard.so \ | |
-bundle-non-qt-libs \ | |
-executable=appdir/usr/bin/crashpad_handler \ | |
-executable=appdir/usr/bin/minidump_stackwalk \ | |
-executable=appdir/usr/bin/olive-crashhandler \ | |
--appimage-extract-and-run | |
# Dump Crashpad symbols | |
dump_syms appdir/usr/bin/olive-editor > olive-editor.sym | |
# HACK: For some reason, minidump_stackwalk reads identifier as all 0s | |
SYM_DIR=appdir/usr/share/olive-editor/symbols/olive-editor/000000000000000000000000000000000 | |
mkdir -p "$SYM_DIR" | |
mv olive-editor.sym "$SYM_DIR" | |
# Package AppImage | |
$DOWNLOAD_TOOL https://github.com/AppImage/AppImageKit/releases/download/12/appimagetool-x86_64.AppImage | |
chmod +x appimagetool-x86_64.AppImage | |
VERSION=${GITHUB_SHA::8} ./appimagetool-x86_64.AppImage appdir --appimage-extract-and-run | |
# Set env variables | |
filename=$(echo Olive*.AppImage) | |
pkgname="${filename/x86_64/Linux-x86_64}" | |
mv "${filename}" "${pkgname}" | |
basename="${filename%.*}" | |
echo "pkgname=${pkgname}" >> $GITHUB_OUTPUT | |
echo "artifact=${basename/x86_64/Linux-x86_64-${{ matrix.cc-compiler }}}" >> $GITHUB_OUTPUT | |
- name: Upload Artifact to GitHub | |
uses: actions/upload-artifact@v3 | |
continue-on-error: true | |
with: | |
name: ${{ steps.package.outputs.artifact }} | |
path: build/Olive*.AppImage | |
windows: | |
strategy: | |
matrix: | |
include: | |
- build-type: RelWithDebInfo | |
compiler-name: MSVC 16.x | |
os-name: Windows | |
os-arch: x86_64 | |
os: windows-2019 | |
cmake-gen: Ninja | |
name: | | |
${{ matrix.os-name }} | |
<${{ matrix.compiler-name }}, | |
${{ matrix.build-type }}, | |
${{ matrix.cmake-gen }}> | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout Source Code | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
show-progress: false | |
# HACK: Override CMake version to avoid an FFmpeg discovery problem | |
- name: Setup CMake | |
uses: jwlawson/actions-setup-cmake@v2 | |
with: | |
cmake-version: '3.27.x' | |
- name: CMake version | |
run: cmake --version | |
- name: Automatically Generate Package Name | |
shell: bash | |
env: | |
PLATFORM: ${{ matrix.os-name }} | |
ARCH: ${{ matrix.os-arch }} | |
run: | | |
echo "PKGNAME=$(echo Olive-${GITHUB_SHA::8}-${PLATFORM}-${ARCH})" >> $GITHUB_ENV | |
- name: Create Build Folder | |
run: | | |
cmake -E make_directory ${{ runner.workspace }}/build | |
- name: Enable Developer Command Prompt (Windows) | |
uses: ilammy/msvc-dev-cmd@v1 | |
- name: Acquire Dependencies | |
shell: bash | |
working-directory: ${{ runner.workspace }} | |
run: | | |
$DOWNLOAD_TOOL https://github.com/olive-editor/dependencies/releases/download/continuous/olive-dep-win32-Release.tar.gz | |
tar xzf olive-dep-win32-Release.tar.gz | |
echo "$(pwd -W)/install" >> $GITHUB_PATH | |
echo "$(pwd -W)/install/bin" >> $GITHUB_PATH | |
- name: Acquire Google Crashpad | |
shell: bash | |
working-directory: ${{ runner.workspace }} | |
run: | | |
$DOWNLOAD_TOOL https://github.com/olive-editor/crashpad/releases/download/continuous/crashpad-win32-RelWithDebInfo.tar.gz | |
tar xzf crashpad-win32-RelWithDebInfo.tar.gz | |
echo "$(pwd -W)/install" >> $GITHUB_PATH | |
echo "$(pwd -W)/install/bin" >> $GITHUB_PATH | |
echo "$(pwd -W)/install/crashpad" >> $GITHUB_PATH | |
- name: Generate Patreon List | |
shell: bash | |
env: | |
PATREON_KEY: ${{ secrets.PATREON_KEY }} | |
run: | | |
pip3 install requests | |
cd $GITHUB_WORKSPACE/app/dialog/about | |
python3 patreon.py | |
if: github.event_name == 'push' | |
continue-on-error: true | |
- name: Configure CMake | |
shell: bash | |
working-directory: ${{ runner.workspace }}/build | |
run: | | |
cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} -G "${{ matrix.cmake-gen }}" \ | |
$CMAKE_ARGS | |
- name: Build | |
working-directory: ${{ runner.workspace }}/build | |
shell: bash | |
run: | | |
cmake --build . | |
#- name: Test | |
# working-directory: ${{ runner.workspace }}/build | |
# shell: bash | |
# run: | | |
# ctest -C ${{ matrix.build-type }} -V | |
- name: Create Package | |
working-directory: ${{ runner.workspace }}/build | |
shell: bash | |
env: | |
ORIGINAL_WORKSPACE: ${{ runner.workspace }} | |
run: | | |
mkdir olive-editor | |
cp app/olive-editor.exe olive-editor | |
cp app/crashhandler/olive-crashhandler.exe olive-editor | |
cp app/olive-editor.pdb olive-editor | |
windeployqt --no-angle olive-editor/olive-crashhandler.exe | |
windeployqt --no-angle olive-editor/olive-editor.exe | |
cp $(cygpath $ORIGINAL_WORKSPACE)/install/bin/*.dll olive-editor | |
cp $(cygpath $ORIGINAL_WORKSPACE)/install/crashpad/out/Default/crashpad_handler.exe olive-editor | |
cp $(cygpath $ORIGINAL_WORKSPACE)/install/bin/minidump_stackwalk.exe olive-editor | |
- name: Export Crashpad symbols | |
working-directory: ${{ runner.workspace }}/build | |
shell: bash | |
run: | | |
curl -fLSs https://github.com/google/breakpad/blob/master/src/tools/windows/binaries/dump_syms.exe?raw=true > dump_syms.exe | |
./dump_syms app/olive-editor.pdb > olive-editor.sym | |
SYM_HEADER=($(head -n 1 olive-editor.sym)) # Read first line of symbol file | |
SYM_DIR=olive-editor/symbols/olive-editor.pdb/${SYM_HEADER[3]} | |
mkdir -p "$SYM_DIR" | |
mv olive-editor.sym "$SYM_DIR" | |
- name: Deploy Packages | |
working-directory: ${{ runner.workspace }}/build | |
shell: bash | |
run: | | |
# Create Installer Executable | |
#$DOWNLOAD_TOOL http://web.archive.org/web/20210226132532/http://download.microsoft.com/download/3/2/2/3224B87F-CFA0-4E70-BDA3-3DE650EFEBA5/vcredist_x64.exe | |
cp $(cygpath $GITHUB_WORKSPACE)/app/packaging/windows/nsis/* . | |
cp $(cygpath $GITHUB_WORKSPACE)/LICENSE . | |
$DOWNLOAD_TOOL https://nsis.sourceforge.io/mediawiki/images/6/68/ShellExecAsUser_amd64-Unicode.7z | |
7z e ShellExecAsUser_amd64-Unicode.7z Plugins/x86-unicode/ShellExecAsUser.dll | |
makensis -V4 -DX64 "-XOutFile $PKGNAME.exe" "-X!AddPluginDir /x86-unicode $(pwd -W)" olive.nsi | |
# Create Portable ZIP | |
echo -n > olive-editor/portable | |
mkdir deploy | |
mv olive-editor deploy | |
- name: Upload Installer Artifact to GitHub | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.PKGNAME }}-Installer | |
path: ${{ runner.workspace }}/build/${{ env.PKGNAME }}.exe | |
- name: Upload Portable Artifact to GitHub | |
uses: actions/upload-artifact@v3 | |
with: | |
name: ${{ env.PKGNAME }}-Portable | |
path: ${{ runner.workspace }}/build/deploy | |
macos: | |
strategy: | |
matrix: | |
include: | |
- build-type: RelWithDebInfo | |
compiler-name: Clang LLVM | |
os-name: macOS | |
os-arch: x86_64 | |
os: macos-11.0 | |
cmake-gen: Ninja | |
min-deploy: 10.13 | |
- build-type: RelWithDebInfo | |
compiler-name: Clang LLVM | |
os-name: macOS | |
os-arch: arm64 | |
os: macos-11.0 | |
cmake-gen: Ninja | |
min-deploy: 11.0 | |
env: | |
DEP_LOCATION: /opt/olive-editor | |
name: | | |
${{ matrix.os-name }} | |
<${{ matrix.os-arch }}, | |
${{ matrix.compiler-name }}, | |
${{ matrix.build-type }}, | |
${{ matrix.cmake-gen }}> | |
runs-on: ${{ matrix.os }} | |
steps: | |
- name: Checkout Source Code | |
uses: actions/checkout@v4 | |
with: | |
submodules: true | |
show-progress: false | |
- name: Automatically Generate Package Name | |
shell: bash | |
env: | |
PLATFORM: ${{ matrix.os-name }} | |
ARCH: ${{ matrix.os-arch }} | |
run: | | |
echo "PKGNAME=$(echo Olive-${GITHUB_SHA::8}-${PLATFORM}-${ARCH})" >> $GITHUB_ENV | |
- name: Create Build Folder | |
run: | | |
cmake -E make_directory ${{ runner.workspace }}/build | |
- name: Acquire Dependencies | |
shell: bash | |
working-directory: ${{ runner.workspace }} | |
run: | | |
$DOWNLOAD_TOOL https://github.com/olive-editor/dependencies/releases/download/continuous/olive-dep-mac-${{ matrix.os-arch }}.tar.gz | |
sudo tar xzf olive-dep-mac-${{ matrix.os-arch }}.tar.gz -C / | |
- name: Acquire Google Crashpad | |
shell: bash | |
working-directory: ${{ runner.workspace }} | |
run: | | |
$DOWNLOAD_TOOL https://github.com/olive-editor/crashpad/releases/download/continuous/crashpad-mac-${{ matrix.os-arch }}.tar.gz | |
sudo tar xzf crashpad-mac-${{ matrix.os-arch }}.tar.gz -C / | |
- name: Generate Patreon List | |
env: | |
PATREON_KEY: ${{ secrets.PATREON_KEY }} | |
run: | | |
pip3 install requests | |
cd $GITHUB_WORKSPACE/app/dialog/about | |
python3 patreon.py | |
if: github.event_name == 'push' | |
continue-on-error: true | |
- name: Install Ninja | |
shell: bash | |
run: | | |
brew update | |
brew install ninja | |
- name: Configure CMake | |
shell: bash | |
working-directory: ${{ runner.workspace }}/build | |
run: | | |
PATH=$DEP_LOCATION:$DEP_LOCATION/bin:$DEP_LOCATION/include:$DEP_LOCATION/lib:$DEP_LOCATION/crashpad:$PATH \ | |
cmake $GITHUB_WORKSPACE -DCMAKE_BUILD_TYPE=${{ matrix.build-type }} \ | |
-DCMAKE_OSX_DEPLOYMENT_TARGET=${{ matrix.min-deploy }} -G "${{ matrix.cmake-gen }}" \ | |
-DCMAKE_OSX_ARCHITECTURES="${{ matrix.os-arch }}" \ | |
$CMAKE_ARGS | |
- name: Build | |
working-directory: ${{ runner.workspace }}/build | |
shell: bash | |
run: | | |
cmake --build . | |
- name: Test | |
working-directory: ${{ runner.workspace }}/build | |
shell: bash | |
run: | | |
ctest -C ${{ matrix.build-type }} -V | |
if: matrix.os-arch == 'x86_64' # ARM64 tests naturally won't be able to run on x86_64 runners | |
- name: Bundle Application | |
working-directory: ${{ runner.workspace }}/build | |
shell: bash | |
run: | | |
BUNDLE_NAME="Olive.app" | |
brew install dylibbundler | |
mkdir deploy | |
cd deploy | |
mv ../app/$BUNDLE_NAME . | |
mkdir $BUNDLE_NAME/Contents/Frameworks | |
# Copy Qt frameworks and plugins | |
cp -Ra $DEP_LOCATION/lib/Qt*.framework $BUNDLE_NAME/Contents/Frameworks | |
cp -Ra $DEP_LOCATION/plugins $BUNDLE_NAME/Contents | |
dylibbundler -b -ns -x "$BUNDLE_NAME/Contents/MacOS/Olive" -s "$DEP_LOCATION/lib" -d "$BUNDLE_NAME/Contents/Frameworks" -p "@executable_path/../Frameworks" \ | |
-x $BUNDLE_NAME/Contents/MacOS/olive-crashhandler -x $BUNDLE_NAME/Contents/Frameworks/QtNetwork.framework/Versions/5/QtNetwork | |
# HACK: On x86_64, dylibbundler doesn't resolve this symlink. Weirdly it does on ARM64, | |
# but perhaps I'll bring it up with them soon. | |
cp -a $BUNDLE_NAME/Contents/Frameworks/libpng16.16.37.0.dylib $BUNDLE_NAME/Contents/Frameworks/libpng16.16.dylib | |
# Crashpad symbols | |
$DEP_LOCATION/bin/dump_syms $BUNDLE_NAME/Contents/MacOS/Olive > Olive.sym | |
SYM_HEADER=($(head -n 1 Olive.sym)) # Read first line of symbol file | |
SYM_DIR=$BUNDLE_NAME/Contents/Resources/symbols/Olive/${SYM_HEADER[3]} | |
mkdir -p "$SYM_DIR" | |
mv Olive.sym "$SYM_DIR" | |
- name: Sign Application | |
working-directory: ${{ runner.workspace }}/build/deploy | |
shell: bash | |
if: github.event_name == 'push' | |
env: | |
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }} | |
P12_PASSWORD: ${{ secrets.P12_PASSWORD }} | |
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }} | |
run: | | |
BUNDLE_NAME="Olive.app" | |
# Install certificate | |
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12 | |
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db | |
# import certificate from secrets | |
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode --output $CERTIFICATE_PATH | |
# create temporary keychain | |
security create-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH | |
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH | |
security unlock-keychain -p "$KEYCHAIN_PASSWORD" $KEYCHAIN_PATH | |
# import certificate to keychain | |
security import $CERTIFICATE_PATH -P "$P12_PASSWORD" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH | |
security list-keychain -d user -s $KEYCHAIN_PATH | |
# HACK: Remove unsignable frameworks | |
rm -r $BUNDLE_NAME/Contents/Frameworks/QtUiPlugin.framework | |
if [ "${{ matrix.os-arch }}" == "arm64" ] | |
then | |
rm -r $BUNDLE_NAME/Contents/Frameworks/QtZlib.framework | |
fi | |
# Sign application | |
codesign --deep --sign "Developer ID Application: Olive Studios LLC" $BUNDLE_NAME | |
- name: Deploy | |
shell: bash | |
working-directory: ${{ runner.workspace }}/build/deploy | |
run: | | |
ln -s /Applications Applications | |
cd .. | |
hdiutil create img.dmg -volname Olive -fs HFS+ -srcfolder deploy | |
hdiutil convert img.dmg -format UDZO -o $PKGNAME.dmg | |
- name: Upload Artifact to GitHub | |
uses: actions/upload-artifact@v3 | |
continue-on-error: true | |
with: | |
name: ${{ env.PKGNAME }} | |
path: ${{ runner.workspace }}/build/${{ env.PKGNAME }}.dmg |