C/C++ CI #3463
Workflow file for this run
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: C/C++ CI | |
on: | |
pull_request: | |
push: | |
branches: | |
- master | |
tags: | |
- v[0-9]+.* | |
paths: | |
- '.github/scripts/**' | |
- '.github/workflows/ccpp.yml' | |
- '**.c' | |
- '**.cpp' | |
- '**.cu' | |
- '**.h' | |
- '**.hpp' | |
- '**.m' | |
- '**.mm' | |
- 'autogen.sh' | |
- 'configure.ac' | |
- 'data/**' | |
- 'Makefile.in' | |
workflow_dispatch: | |
jobs: | |
prepare: | |
runs-on: ubuntu-latest | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, we do not need to create own token. | |
steps: | |
- uses: actions/checkout@v4 | |
id: checkout | |
with: | |
persist-credentials: true | |
- name: Init environment variables | |
run: . .github/scripts/environment.sh | |
- name: Retag continuous | |
if: github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master' | |
run: | | |
git fetch --prune --unshallow --tags | |
git tag -f $TAG | |
git push -f origin refs/tags/$TAG:refs/tags/$TAG | |
- name: Update Release | |
if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') | |
run: .github/scripts/create_release.sh | |
- name: Create continuous release # ensure continuous release is present for AppImage zsync | |
if: startsWith(github.ref, 'refs/tags/') | |
run: .github/scripts/create_continuous_release.sh | |
Ubuntu: | |
name: run Ubuntu | |
needs: prepare | |
runs-on: ubuntu-20.04 | |
env: | |
appimage_key: ${{ secrets.appimage_key }} | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
SDK_URL: ${{ secrets.SDK_URL }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Fetch SDKs ETags | |
id: etags | |
run: | | |
echo "ndi=$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://downloads.ndi.tv/SDK/NDI_SDK_Linux/Install_NDI_SDK_v6_Linux.tar.gz)" >> $GITHUB_OUTPUT | |
- name: Cache NDI | |
id: cache-ndi | |
uses: actions/cache@main | |
with: | |
path: /var/tmp/Install_NDI_SDK_Linux.tar.gz | |
key: cache-ndi-${{ runner.os }}-${{ steps.etags.outputs.ndi }} | |
- name: Download NDI | |
if: steps.cache-ndi.outputs.cache-hit != 'true' | |
run: curl -L https://downloads.ndi.tv/SDK/NDI_SDK_Linux/Install_NDI_SDK_v6_Linux.tar.gz -o /var/tmp/Install_NDI_SDK_Linux.tar.gz | |
- name: bootstrap | |
run: | | |
. .github/scripts/environment.sh | |
.github/scripts/Linux/prepare.sh | |
- name: Cache FFmpeg | |
id: cache-ffmpeg | |
uses: actions/cache@main | |
with: | |
path: '/var/tmp/ffmpeg' | |
key: cache-ffmpeg-${{ runner.os }}-${{ hashFiles( '.github/scripts/Linux/prepare.sh', '.github/scripts/Linux/download_build_ffmpeg.sh', '.github/scripts/Linux/ffmpeg-patches/*') }} | |
- name: Build FFmpeg | |
if: steps.cache-ffmpeg.outputs.cache-hit != 'true' | |
run: .github/scripts/Linux/download_build_ffmpeg.sh | |
- name: Install Cached FFmpeg | |
if: steps.cache-ffmpeg.outputs.cache-hit == 'true' | |
run: .github/scripts/Linux/install_ffmpeg.sh | |
- name: configure | |
run: "./autogen.sh $FEATURES || { RC=$?; cat config.log; exit $RC; }" | |
- name: make | |
run: make -j4 | |
- name: make check | |
run: make check | |
- name: make distcheck | |
run: make distcheck | |
- name: check libc/libstdc++ ABI | |
run: .github/scripts/Linux/check_abi.sh 2.31 3.4.28 1.3.12 bin/* lib/ultragrid/* | |
- name: Create AppImage | |
run: data/scripts/Linux-AppImage/create-appimage.sh https://github.com/$GITHUB_REPOSITORY/releases/download/continuous/UltraGrid-$CHANNEL-x86_64.AppImage.zsync | |
- name: Check AppImage | |
run: | | |
mkdir aitest-context # empty build context | |
docker build -f .github/scripts/Linux/utils/Dockerfile.ubuntu -t aitest-ubuntu aitest-context | |
docker build -f .github/scripts/Linux/utils/Dockerfile.arch -t aitest-arch aitest-context | |
curl -LS -O https://raw.githubusercontent.com/AppImage/pkg2appimage/master/appdir-lint.sh -O https://raw.githubusercontent.com/probonopd/AppImages/master/excludelist | |
sudo apt install desktop-file-utils libfile-mimeinfo-perl # desktop-file-validate, mimetype | |
./UltraGrid-$VERSION-x86_64.AppImage --appimage-extract | |
docker run --rm -v $PWD/squashfs-root/:/AppImage aitest-ubuntu /AppImage/AppRun -v | |
docker run --rm -v $PWD/squashfs-root/:/AppImage aitest-ubuntu /AppImage/AppRun --tool uv-qt -h | |
docker run --rm -v $PWD/squashfs-root/:/AppImage aitest-ubuntu sh -c 'xvfb-run /AppImage/AppRun --tool uv-qt & { sleep 10; kill $!; }' | |
docker run --rm -v $PWD/squashfs-root/:/AppImage aitest-ubuntu /AppImage/AppRun --list-modules | |
docker run --rm -v $PWD/squashfs-root:/AppImage aitest-arch /AppImage/AppRun --capabilities | |
bash appdir-lint.sh squashfs-root | |
- name: Upload Release Asset | |
id: upload-release | |
if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') | |
run: | | |
sudo apt install jq zsync | |
zsyncmake -C -u https://github.com/$GITHUB_REPOSITORY/releases/download/$TAG/UltraGrid-$VERSION-x86_64.AppImage -o UltraGrid-$CHANNEL-x86_64.AppImage.zsync UltraGrid-$VERSION-x86_64.AppImage | |
.github/scripts/replace-asset.sh continuous UltraGrid-$CHANNEL-x86_64.AppImage.zsync application/x-zsync AppImage%20${CHANNEL}%20zsync | |
.github/scripts/replace-asset.sh $TAG UltraGrid-$VERSION-x86_64.AppImage application/x-appimage Linux%20build | |
- name: Upload Build | |
if: steps.upload-release.conclusion == 'skipped' | |
uses: actions/upload-artifact@main | |
with: | |
name: UltraGrid-Linux | |
path: UltraGrid-${{ env.VERSION }}-x86_64.AppImage | |
macOS: | |
name: run macOS | |
needs: prepare | |
strategy: | |
matrix: | |
os: [macos-13, macos-14] | |
fail-fast: false | |
runs-on: ${{ matrix.os }} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
SDK_NONFREE_PATH: /private/var/tmp/sdks-nonfree | |
notarytool_credentials: ${{ secrets.notarytool_credentials }} | |
apple_key_p12_b64: ${{ secrets.apple_key_p12_b64 }} | |
SDK_URL: ${{ secrets.SDK_URL }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Fetch SDKs ETags | |
id: etags | |
run: | | |
echo "nonfree=$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh $SDK_URL/VideoMaster_SDK_MacOSX.zip)" >> $GITHUB_OUTPUT | |
echo "ndi=$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://downloads.ndi.tv/SDK/NDI_SDK_Mac/Install_NDI_SDK_v6_Apple.pkg)" >> $GITHUB_OUTPUT | |
echo "ximea=$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://www.ximea.com/downloads/recent/XIMEA_OSX_SP.dmg)" >> $GITHUB_OUTPUT | |
- name: Set environment | |
run: . .github/scripts/environment.sh | |
- name: Cache Non-Free SDKs | |
id: cache-macos-nonfree-sdks | |
uses: actions/cache@main | |
with: | |
path: ${{ env.SDK_NONFREE_PATH }} | |
key: cache-nonfree-sdks-${{ runner.os }}-${{ hashFiles('.github/scripts/macOS/prepare_nonfree_sdks.sh') }}-${{ steps.etags.outputs.nonfree }} | |
- name: Download Non-Free SDKs | |
if: steps.cache-macos-nonfree-sdks.outputs.cache-hit != 'true' && env.SDK_URL != null | |
run: | | |
rm -rf ${{ env.SDK_NONFREE_PATH }} | |
mkdir -p ${{ env.SDK_NONFREE_PATH }} | |
cd ${{ env.SDK_NONFREE_PATH }} | |
curl -S -f -O $SDK_URL/VideoMaster_SDK_MacOSX.zip || true | |
- name: Cache XIMEA | |
id: cache-macos-ximea | |
uses: actions/cache@main | |
with: | |
path: /var/tmp/XIMEA_OSX_SP.dmg | |
key: cache-ximea-${{ runner.os }}-${{ steps.etags.outputs.ximea }} | |
- name: Download XIMEA | |
if: steps.cache-macos-ximea.outputs.cache-hit != 'true' | |
run: curl -S -L https://www.ximea.com/downloads/recent/XIMEA_OSX_SP.dmg -o /private/var/tmp/XIMEA_OSX_SP.dmg | |
- name: Cache NDI | |
id: cache-ndi | |
uses: actions/cache@main | |
with: | |
path: /private/var/tmp/Install_NDI_SDK_Apple.pkg | |
key: cache-ndi-${{ runner.os }}-${{ steps.etags.outputs.ndi }} | |
- name: Download NDI | |
if: steps.cache-ndi.outputs.cache-hit != 'true' | |
run: curl -L https://downloads.ndi.tv/SDK/NDI_SDK_Mac/Install_NDI_SDK_v6_Apple.pkg -o /private/var/tmp/Install_NDI_SDK_Apple.pkg | |
- name: bootstrap | |
run: .github/scripts/macOS/prepare.sh | |
- name: configure | |
run: "ARCH=$UG_ARCH ./autogen.sh $FEATURES || { RC=$?; cat config.log; exit $RC; }" | |
- name: make bundle | |
run: make -j4 gui-bundle | |
- name: make check | |
run: make check | |
- name: make distcheck | |
run: | | |
for n in lib opt; do sudo mv /usr/local/$n /usr/local/$n-; done # hide local libs | |
sudo mv $(xcrun --show-sdk-path)/System/Library/Frameworks /tmp/FRMWK | |
make distcheck TARGET=uv-qt.app/Contents/MacOS/uv REFLECTOR_TARGET=uv-qt.app/Contents/MacOS/hd-rum-transcode GUI_EXE=uv-qt.app/Contents/MacOS/uv-qt | |
for n in lib opt; do sudo mv /usr/local/$n- /usr/local/$n; done # return back | |
sudo mv /tmp/FRMWK $(xcrun --show-sdk-path)/System/Library/Frameworks | |
- name: sign+notarize | |
run: .github/scripts/macOS/sign.sh uv-qt.app | |
- name: make dmg | |
run: | | |
for n in `seq 5`; do # do more attempts | |
if make osx-gui-dmg; then break; fi | |
if [ $n -eq 5 ]; then false; fi | |
sleep $((n * 10)) | |
done | |
mv UltraGrid.dmg UltraGrid-$VERSION.dmg | |
- name: Upload Release Asset | |
id: upload-release | |
if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') | |
run: | | |
brew list jq 2>/dev/null || brew install jq | |
.github/scripts/replace-asset.sh $TAG UltraGrid-$VERSION.dmg application/x-apple-diskimage macOS%20$(uname -m)%20build | |
- name: Upload Build | |
if: steps.upload-release.conclusion == 'skipped' | |
uses: actions/upload-artifact@main | |
with: | |
name: UltraGrid-${{ env.VERSION }}-macOS | |
path: UltraGrid-${{ env.VERSION }}.dmg | |
Windows: | |
name: run Windows | |
needs: prepare | |
runs-on: windows-latest | |
defaults: | |
run: | |
shell: C:\shells\msys2bash.cmd {0} | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
MSYS2_PATH_TYPE: inherit | |
SDK_URL: ${{ secrets.SDK_URL }} | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Fetch SDKs ETags | |
id: etags | |
run: | | |
echo "ndi=$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://downloads.ndi.tv/SDK/NDI_SDK/NDI%206%20SDK.exe)" >> $GITHUB_OUTPUT | |
echo "ximea=$($GITHUB_WORKSPACE/.github/scripts/get-etags.sh https://www.ximea.com/support/attachments/download/37/XIMEA_API_Installer.exe)" >> $GITHUB_OUTPUT | |
- name: Set environment | |
run: .github/scripts/environment.sh | |
- name: Find MSVC | |
run: .github/scripts/Windows/find_msvc.ps1 | |
shell: pwsh -command ". '{0}'" | |
- name: Cache NDI | |
id: cache-ndi | |
uses: actions/cache@main | |
with: | |
path: 'C:\ndi.exe' | |
key: cache-ndi-${{ runner.os }}-${{ steps.etags.outputs.ndi }} | |
- name: Download NDI | |
if: steps.cache-ndi.outputs.cache-hit != 'true' | |
run: curl 'https://downloads.ndi.tv/SDK/NDI_SDK/NDI%206%20SDK.exe' -o 'C:\ndi.exe' | |
- name: Cache XIMEA | |
id: cache-macos-ximea | |
uses: actions/cache@main | |
with: | |
path: 'C:\XIMEA_API_Installer.exe' | |
key: cache-ximea-${{ runner.os }}-${{ steps.etags.outputs.ximea }} | |
- name: Download XIMEA | |
if: steps.cache-macos-ximea.outputs.cache-hit != 'true' | |
run: curl 'https://www.ximea.com/support/attachments/download/37/XIMEA_API_Installer.exe' -o 'C:\XIMEA_API_Installer.exe' | |
- name: bootsrap | |
run: .github/scripts/Windows/prepare.ps1 | |
shell: pwsh -command ". '{0}'" | |
- name: Cache JACK | |
id: cache-jack | |
uses: actions/cache@main | |
with: | |
path: 'C:\Program Files\JACK2' | |
key: cache-jack-${{ runner.os }}-${{ hashFiles('.github/scripts/Windows/install_jack.ps1') }} | |
- name: Install JACK | |
if: steps.cache-jack.outputs.cache-hit != 'true' | |
run: .github/scripts/Windows/install_jack.ps1 | |
shell: pwsh -command ". '{0}'" | |
- name: bootsrap MSYS2 | |
run: $GITHUB_WORKSPACE/.github/scripts/Windows/prepare_msys.sh | |
- name: Cache live555 | |
id: cache-live555 | |
uses: actions/cache@main | |
with: | |
path: 'C:\live555' | |
key: cache-live555-${{ runner.os }}-${{ hashFiles('.github/scripts/Windows/build_live555.sh') }} | |
- name: Build live555 | |
if: steps.cache-live555.outputs.cache-hit != 'true' | |
run: $GITHUB_WORKSPACE/.github/scripts/Windows/build_live555.sh | |
- name: Install live555 | |
run: make -C /c/live555 install | |
- name: Cache Spout build | |
id: cache-spout | |
uses: actions/cache@main | |
with: | |
path: 'C:\Spout2' | |
key: cache-spout-${{ runner.os }}-${{ hashFiles('.github/scripts/Windows/install_spout.sh') }} | |
- name: Build Spout | |
if: steps.cache-spout.outputs.cache-hit != 'true' | |
run: $GITHUB_WORKSPACE/.github/scripts/Windows/install_spout.sh build | |
- name: Install Spout | |
run: $GITHUB_WORKSPACE/.github/scripts/Windows/install_spout.sh install | |
- name: Cache CineForm build | |
id: cache-cineform | |
uses: actions/cache@main | |
with: | |
path: 'C:\cineform-sdk' | |
key: cache-cineform-${{ runner.os }}-${{ hashFiles('.github/scripts/Windows/install_cineform.sh') }} | |
- name: Build CineForm | |
if: steps.cache-cineform.outputs.cache-hit != 'true' | |
run: $GITHUB_WORKSPACE/.github/scripts/Windows/install_cineform.sh build | |
- name: Install CineForm | |
run: $GITHUB_WORKSPACE/.github/scripts/Windows/install_cineform.sh install | |
- name: configure | |
run: ./autogen.sh --prefix=/ --bindir=/ --docdir=/doc $FEATURES || { RC=$?; cat config.log; exit $RC; } | |
- name: make | |
run: make -j4 | |
- name: make check | |
run: make check | |
- name: make bundle | |
run: | | |
cp gui/QT/uv-qt.exe bin | |
rm bin/run_tests.exe | |
export DESTDIR=build/UltraGrid-$VERSION-win64 | |
make install | |
for exe in "$DESTDIR"/*exe; do data/scripts/get_dll_depends.sh "$exe" | while read -r n; do cp "$n" "$DESTDIR"; done; done | |
if command -v windeployqt-qt6 >/dev/null; then windeployqt-qt6 "$DESTDIR/uv-qt.exe"; else windeployqt "$DESTDIR/uv-qt.exe"; fi | |
cp -r data/Windows/* "$DESTDIR" | |
data/scripts/get_dll_depends.sh "$DESTDIR/screen-capture-recorder-x64.dll" | while read -r n; do cp "$n" "$DESTDIR"; done | |
- name: make dist-check | |
run: PATH= /usr/bin/make distcheck TARGET=build/UltraGrid-$VERSION-win64/uv.exe REFLECTOR_TARGET=build/UltraGrid-$VERSION-win64/hd-rum-transcode.exe GUI_EXE=build/UltraGrid-$VERSION-win64/uv-qt.exe | |
- name: Upload Release Asset | |
id: upload-release | |
if: (github.repository == 'CESNET/UltraGrid' && github.ref == 'refs/heads/master') || startsWith(github.ref, 'refs/tags/') | |
run: | | |
cd build; zip -9 -r UltraGrid-$VERSION-win64.zip UltraGrid-$VERSION-win64 | |
$GITHUB_WORKSPACE/.github/scripts/replace-asset.sh $TAG UltraGrid-$VERSION-win64.zip application/zip Windows%20build | |
- name: Upload Build | |
if: steps.upload-release.conclusion == 'skipped' | |
uses: actions/upload-artifact@main | |
with: | |
name: UltraGrid-Windows | |
path: build | |
# vi: set expandtab sw=2: |