diff options
Diffstat (limited to '.github/workflows')
-rw-r--r-- | .github/workflows/build.yml | 543 | ||||
-rw-r--r-- | .github/workflows/cleanup_caches.yml | 40 | ||||
-rw-r--r-- | .github/workflows/comment.yml | 46 | ||||
-rw-r--r-- | .github/workflows/docs.yml | 26 | ||||
-rw-r--r-- | .github/workflows/lint.yml | 35 |
5 files changed, 690 insertions, 0 deletions
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000000..763655cf34 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,543 @@ +name: build + +on: + push: + branches: + - master + - ci + - 'release/**' + paths-ignore: + - 'DOCS/**' + - 'TOOLS/lua/**' + - '.editorconfig' + - '.gitignore' + - 'Copyright' + - 'README.md' + - 'RELEASE_NOTES' + pull_request: + branches: [master] + paths-ignore: + - 'DOCS/**' + - 'TOOLS/lua/**' + - '.editorconfig' + - '.gitignore' + - 'Copyright' + - 'README.md' + - 'RELEASE_NOTES' + +jobs: + mingw: + runs-on: ubuntu-22.04 + env: + CCACHE_BASEDIR: ${{ github.workspace }} + CCACHE_DIR: ${{ github.workspace }}/.ccache + CCACHE_MAXSIZE: 500M + strategy: + fail-fast: false + matrix: + target: [i686-w64-mingw32, x86_64-w64-mingw32] + steps: + - uses: actions/checkout@v4 + + - name: Get time + id: get_time + run: echo "timestamp=`date +%s%N`" >> $GITHUB_OUTPUT + + - name: Restore cache + uses: actions/cache/restore@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: ${{ matrix.target }}-${{ steps.get_time.outputs.timestamp }} + restore-keys: ${{ matrix.target }}- + + - name: Install dependencies + run: | + sudo dpkg --add-architecture i386 + sudo apt-get update + sudo apt-get install -y ccache g++-mingw-w64 gcc-multilib nasm ninja-build pkg-config python3-pip wine + sudo python3 -m pip install meson + + - name: Build libraries + run: | + ./ci/build-mingw64.sh + env: + TARGET: ${{ matrix.target }} + + - name: Build with meson + id: build + run: | + ./ci/build-mingw64.sh meson pack + env: + TARGET: ${{ matrix.target }} + + - name: Print meson log + if: ${{ failure() && steps.build.outcome == 'failure' }} + run: | + cat ./build/meson-logs/meson-log.txt + + - name: Functional test + id: tests + run: | + cd artifact && wine ./mpv.com -v --no-config + env: + WINEDEBUG: '+loaddll' + + - uses: actions/upload-artifact@v4 + with: + name: mpv-${{ matrix.target }} + path: mpv-git-*.zip + + - name: Save Cache + uses: actions/cache/save@v4 + if: always() + with: + path: ${{ env.CCACHE_DIR }} + key: ${{ matrix.target }}-${{ steps.get_time.outputs.timestamp }} + + win32: + runs-on: windows-latest + env: + VS: "C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise" + CC: "ccache clang" + CXX: "ccache clang++" + CC_LD: "lld" + CXX_LD: "lld" + WINDRES: "llvm-rc" + CCACHE_BASEDIR: ${{ github.workspace }} + CCACHE_DIR: "${{ github.workspace }}\\.ccache" + CCACHE_MAXSIZE: 500M + steps: + - name: Disable autocrlf + run: | + git config --global core.autocrlf false + git config --global core.eol lf + + - uses: actions/checkout@v4 + + - name: Get time + id: get_time + run: | + "timestamp=$((Get-Date).Ticks)" >> $env:GITHUB_OUTPUT + + - name: Restore cache + uses: actions/cache/restore@v4 + with: + path: ${{ env.CCACHE_DIR }} + key: x86_64-windows-msvc-${{ steps.get_time.outputs.timestamp }} + restore-keys: x86_64-windows-msvc- + + # https://github.com/mesonbuild/meson/pull/11715 + - name: Install dependencies + run: | + git clone https://github.com/kasper93/meson --depth 1 -b 8981 + python -m pip install build wheel + python -m build --wheel --no-isolation meson + python -m pip install (Get-Item ./meson/dist/meson-*-py3-none-any.whl).FullName + choco install ccache + + - name: Update Meson WrapDB + run: | + meson wrap update-db + # Explicitly download wraps, as nested projects may have older versions of them. + meson wrap install expat + meson wrap install harfbuzz + meson wrap install libpng + meson wrap install zlib + + - name: Build + id: build + run: | + $env:PATH = ($env:PATH -split ';' | Where-Object { $_ -ne 'C:\Program Files\LLVM\bin' -and ` + $_ -ne 'C:\Strawberry\c\bin' }) -join ';' + Import-Module "$env:VS\Common7\Tools\Microsoft.VisualStudio.DevShell.dll" + Enter-VsDevShell -VsInstallPath $env:VS -SkipAutomaticLocation -DevCmdArguments "-arch=x64 -host_arch=x64" + ./ci/build-win32.ps1 + + - name: Print build log + if: ${{ failure() && steps.build.outcome == 'failure' }} + run: | + cat ./build/meson-logs/meson-log.txt + + - name: Run meson tests + id: tests + run: | + $env:PATH = ($env:PATH -split ';' | Where-Object { $_ -ne 'C:\Program Files\LLVM\bin' -and ` + $_ -ne 'C:\Strawberry\c\bin' }) -join ';' + Import-Module "$env:VS\Common7\Tools\Microsoft.VisualStudio.DevShell.dll" + Enter-VsDevShell -VsInstallPath $env:VS -SkipAutomaticLocation -DevCmdArguments "-arch=x64 -host_arch=x64" + meson test -C build mpv: + + - name: Print meson test log + if: ${{ failure() && steps.tests.outcome == 'failure' }} + run: | + cat ./build/meson-logs/testlog.txt + + - uses: actions/upload-artifact@v4 + with: + name: mpv-x86_64-windows-msvc + path: | + build/mpv.??? + build/vulkan-*.dll + !build/mpv.lib + + - name: Save Cache + uses: actions/cache/save@v4 + if: always() + with: + path: ${{ env.CCACHE_DIR }} + key: x86_64-windows-msvc-${{ steps.get_time.outputs.timestamp }} + + macos: + runs-on: ${{ matrix.os }} + strategy: + matrix: + cc: + - "clang" + cxx: + - "clang++" + os: + - "macos-12" + - "macos-13" + - "macos-14" + include: + - os: "macos-12" + arch: "intel" + - os: "macos-13" + arch: "intel" + - os: "macos-14" + arch: "arm" + xcode: "Xcode_15.2" + steps: + - uses: actions/checkout@v4 + + - name: Remove stray upstream python binary symlinks under /usr/local + run: | + find /usr/local/bin -lname '*/Library/Frameworks/Python.framework/*' -delete -print + brew unlink python && brew link --overwrite python + + - name: Change Xcode version + if: ${{ matrix.xcode != '' }} + run: | + sudo xcode-select -s /Applications/${{ matrix.xcode }}.app + + - name: Install dependencies + run: | + brew update + brew install -q autoconf automake pkg-config libtool python freetype fribidi little-cms2 \ + luajit libass ffmpeg meson uchardet mujs libplacebo molten-vk vulkan-loader vulkan-headers + + - name: Build with meson + id: build + run: | + ./ci/build-macos.sh + env: + CC: "${{ matrix.cc }}" + CXX: "${{ matrix.cxx }}" + TRAVIS_OS_NAME: "${{ matrix.os }}" + + - name: Create App Bundle + run: | + meson compile -C build macos-bundle + tar -czvf mpv.tar.gz -C build mpv.app + + - name: Print meson log + if: ${{ failure() && steps.build.outcome == 'failure' }} + run: | + cat ./build/meson-logs/meson-log.txt + + - name: Run meson tests + id: tests + run: | + meson test -C build + + - name: Print meson test log + if: ${{ failure() && steps.tests.outcome == 'failure' }} + run: | + cat ./build/meson-logs/testlog.txt + + - uses: actions/upload-artifact@v4 + with: + name: mpv-${{ matrix.os }}-${{ matrix.arch }} + path: mpv.tar.gz + + linux: + runs-on: ubuntu-latest + container: + image: "registry.opensuse.org/home/mia/images/images/mpv-ci:stable-deps" + env: + CC: "${{ matrix.config.cc }}" + CXX: "${{ matrix.config.cxx }}" + strategy: + matrix: + config: + - { + cc: "gcc", + cxx: "g++", + } + - { + cc: "clang", + cxx: "clang++", + } + steps: + - uses: actions/checkout@v4 + + - name: Install dependencies + run: | + # workaround to avoid "fatal: unsafe repository" error + git config --global --add safe.directory "$GITHUB_WORKSPACE" + + - name: Build with meson + id: build + run: | + ./ci/build-tumbleweed.sh + + - name: Print meson log + if: ${{ failure() && steps.build.outcome == 'failure' }} + run: | + cat ./build/meson-logs/meson-log.txt + + - name: Run meson tests + id: tests + run: | + meson test -C build + + - name: Print meson test log + if: ${{ failure() && steps.tests.outcome == 'failure' }} + run: | + cat ./build/meson-logs/testlog.txt + + linux-fuzz: + runs-on: ubuntu-latest + container: + image: "registry.opensuse.org/home/mia/images/images/mpv-ci:stable-deps" + env: + CC: "clang" + CXX: "clang++" + steps: + - uses: actions/checkout@v4 + + - name: Build with meson + id: build + run: | + meson setup build \ + --werror \ + -Dc_args="-Wno-error=deprecated -Wno-error=deprecated-declarations" \ + -Dfuzzers=true -Dlibmpv=true -Dcplayer=false + meson compile -C build + + - name: Print meson log + if: ${{ failure() && steps.build.outcome == 'failure' }} + run: | + cat ./build/meson-logs/meson-log.txt + + linux-ffmpeg-4-4: + runs-on: ubuntu-latest + container: + # We want to test ffmpeg 4.4 which alpine 3.15 has exactly. + # Furthermore, this is a very minimal build of mpv without commonly + # used features to test build compatibility. Musl is a nice bonus as well + image: alpine:3.15 + steps: + - uses: actions/checkout@v4 + - name: Install dependencies + run: | + apk update + apk add \ + binutils \ + ffmpeg-dev \ + gcc \ + git \ + g++ \ + libass-dev \ + lua5.2-dev \ + pulseaudio-dev \ + libx11-dev \ + libxfixes-dev \ + libxkbcommon-dev \ + libxrandr-dev \ + libxpresent-dev \ + libxscrnsaver-dev \ + musl-dev \ + py3-pip \ + samurai + pip install meson + + - name: Build with meson + id: build + run: | + ./ci/build-linux-old.sh + + - name: Print meson log + if: ${{ failure() && steps.build.outcome == 'failure' }} + run: | + cat ./build/meson-logs/meson-log.txt + + - name: Run meson tests + id: tests + run: | + meson test -C build + + - name: Print meson test log + if: ${{ failure() && steps.tests.outcome == 'failure' }} + run: | + cat ./build/meson-logs/testlog.txt + + openbsd: + runs-on: ubuntu-latest # until https://github.com/actions/runner/issues/385 + timeout-minutes: 30 # avoid any weirdness with the VM + steps: + - uses: actions/checkout@v4 + - name: Test in OpenBSD VM + uses: cross-platform-actions/action@v0.23.0 + with: + operating_system: openbsd + version: '7.4' + run: | + sudo pkg_add -U \ + cmake \ + ffmpeg \ + git \ + libarchive \ + libbluray \ + libcaca \ + libcdio-paranoia \ + libdvdnav \ + libiconv \ + libv4l \ + libxkbcommon \ + luajit \ + meson \ + openal \ + pkgconf \ + pulseaudio \ + python3 \ + rubberband \ + sdl2 \ + shaderc \ + spirv-cross \ + spirv-headers \ + uchardet \ + vulkan-loader \ + vulkan-headers \ + zimg + ./ci/build-openbsd.sh + meson test -C build + + freebsd: + runs-on: ubuntu-latest # until https://github.com/actions/runner/issues/385 + timeout-minutes: 30 # avoid any weirdness with the VM + steps: + - uses: actions/checkout@v4 + - name: Test in FreeBSD VM + uses: cross-platform-actions/action@v0.23.0 + with: + operating_system: freebsd + version: '14.0' + run: | + sudo pkg update + sudo pkg install -y \ + alsa-lib \ + cmake \ + evdev-proto \ + ffmpeg \ + git \ + iconv \ + jackit \ + libarchive \ + libbluray \ + libcaca \ + libcdio-paranoia \ + libdvdnav \ + libplacebo \ + libXinerama \ + libxkbcommon \ + libxpresent \ + libXv \ + luajit \ + meson \ + mujs \ + openal-soft \ + pipewire \ + pkgconf \ + pulseaudio \ + python3 \ + rubberband \ + sekrit-twc-zimg \ + sdl2 \ + sndio \ + uchardet \ + v4l_compat \ + vulkan-headers \ + wayland-protocols + ./ci/build-freebsd.sh + meson test -C build + + msys2: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + sys: + - clang64 + - mingw64 + - ucrt64 + defaults: + run: + shell: msys2 {0} + steps: + - name: Disable autocrlf + shell: pwsh + run: | + git config --global core.autocrlf false + git config --global core.eol lf + - uses: actions/checkout@v4 + - uses: msys2/setup-msys2@v2 + with: + msystem: ${{ matrix.sys }} + update: true + install: git + pacboy: >- + angleproject:p + ca-certificates:p + cc:p + diffutils:p + ffmpeg:p + lcms2:p + libarchive:p + libass:p + libcdio-paranoia:p + libdvdnav:p + libjpeg-turbo:p + libplacebo:p + lua51:p + meson:p + ninja:p + pkgconf:p + python:p + rst2pdf:p + rubberband:p + shaderc:p + spirv-cross:p + uchardet:p + vapoursynth:p + vulkan-devel:p + + - name: Build with meson + id: build + run: | + ./ci/build-msys2.sh meson + + - name: Print meson log + if: ${{ failure() && steps.build.outcome == 'failure' }} + run: | + cat ./build/meson-logs/meson-log.txt + + - name: Run meson tests + id: tests + run: | + meson test -C build + + - name: Print meson test log + if: ${{ failure() && steps.tests.outcome == 'failure' }} + run: | + cat ./build/meson-logs/testlog.txt diff --git a/.github/workflows/cleanup_caches.yml b/.github/workflows/cleanup_caches.yml new file mode 100644 index 0000000000..b839cea15f --- /dev/null +++ b/.github/workflows/cleanup_caches.yml @@ -0,0 +1,40 @@ +name: Cleanup caches + +on: + workflow_run: + workflows: [build] + types: [completed] + +jobs: + cache: + runs-on: ubuntu-latest + steps: + - run: | + gh cache list -L 100 --json id,key,ref -S last_accessed_at -O desc --jq ' + map(select(.key | startswith("x86_64-w64-mingw32-") or + startswith("i686-w64-mingw32-") or + startswith("x86_64-windows-msvc-"))) | + group_by(.ref) | + map({ + ref: .[0].ref, + caches: map({ + key: .key, + prefix: (.key | capture("^(?<prefix>[\\w_-]+-)\\d+$").prefix) + }) | group_by(.prefix) | map({keys: map(.key)}) + }) | + .[] + ' | + while read -r group; do + pr=$(echo "$group" | jq -r '.ref | capture("refs/pull/(?<num>[0-9]+)/merge").num') + if [[ -n "$pr" ]] && [ "$(gh pr view $pr --json state --jq '.state')" != "OPEN" ]; then + keys=$(echo "$group" | jq -c '.caches | map(.keys) | .[]') + else + keys=$(echo "$group" | jq -c '.caches | map(.keys[1:]) | .[]') + fi + for key in $(echo "$keys" | jq -r '.[]'); do + gh cache delete "$key" + done + done + env: + GH_REPO: ${{ github.repository }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/comment.yml b/.github/workflows/comment.yml new file mode 100644 index 0000000000..4038ff8de1 --- /dev/null +++ b/.github/workflows/comment.yml @@ -0,0 +1,46 @@ +name: comment + +on: + workflow_run: + workflows: [build] + types: [completed] + +jobs: + pr_comment: + if: github.event.workflow_run.event == 'pull_request' && + github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + steps: + - env: + GH_REPO: ${{ github.repository }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + pr=$(gh pr list --state open --json headRefOid,number \ + --jq '.[] | select(.headRefOid == "${{ github.event.workflow_run.head_sha }}") | .number') + if [ -z "$pr" ]; then + echo "No matching pull request found" + exit 1 + fi + + artifacts=$(gh api repos/{owner}/{repo}/actions/runs/${{ github.event.workflow_run.id }}/artifacts --jq '.artifacts') + if [ "$(echo "$artifacts" | jq 'length')" -eq 0 ]; then + echo "No artifacts found" + exit 0 + fi + + body=$(echo "$artifacts" | jq -r ' + def link: "https://nightly.link/${{ github.repository }}/actions/artifacts/\(.id).zip"; + def entry: "* [\(.name)](\(link))"; + "Download the artifacts for this pull request:\n<details><summary>Windows</summary>\n\n" + + (sort_by(.name) | map(select(.name | test("w64|msvc")) | entry) | join("\n")) + + "\n</details>\n<details><summary>macOS</summary>\n\n" + + (sort_by(.name) | map(select(.name | test("macos")) | entry) | join("\n")) + + "\n</details>" + ') + + comment_id=$(gh issue view $pr --json comments \ + --jq '.comments[] | select(.author.login == "github-actions") | .id') + if [ -n "$comment_id" ]; then + edit=--edit-last + fi + gh pr comment $pr --body "$body" $edit diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000000..3936769854 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,26 @@ +name: docs + +on: + push: + branches: + - master + - ci + - 'release/**' + paths: + - 'DOCS/**' + pull_request: + branches: [master] + paths: + - 'DOCS/**' + +jobs: + check-docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Docs + run: | + sudo apt-get install python3-docutils rst2pdf + ./TOOLS/docutils-wrapper.py rst2man --strip-elements-with-class=contents --halt=2 ./DOCS/man/mpv.rst mpv.1 + ./TOOLS/docutils-wrapper.py rst2html --halt=2 ./DOCS/man/mpv.rst mpv.html + ./TOOLS/docutils-wrapper.py rst2pdf -c -b 1 --repeat-table-rows ./DOCS/man/mpv.rst -o mpv.pdf diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 0000000000..425e8d1a07 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,35 @@ +name: lint + +on: + push: + branches: + - master + - ci + - 'release/**' + pull_request: + branches: [master] + +jobs: + commit-msg: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 50 + + - name: Lint + run: | + ./ci/lint-commit-msg.py + + swift-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: norio-nomura/action-swiftlint@3.2.1 + + lua-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: lunarmodules/luacheck@v1 |