Skip to content

Build FFmpeg

Build FFmpeg #96

Workflow file for this run

name: Build FFmpeg
on:
schedule:
- cron: '7 11 * * 0'
workflow_dispatch:
inputs:
force_build:
description: Disable checking for newer commit
type: boolean
no_release:
description: Don't create release
type: boolean
use_own_fork:
description: Use own ffmpeg-windows-build-helpers fork
type: boolean
watch:
types: [started]
concurrency:
group: ${{ github.workflow }}
jobs:
check:
runs-on: ubuntu-latest
steps:
- name: Get FFmpeg latest commit
id: ffmpeg-info
run: |
git_sha=$(gh api repos/FFmpeg/FFmpeg/commits/master -q .sha)
echo git-sha=$git_sha >> $GITHUB_OUTPUT
echo git-sha-short=${git_sha::7} >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Get ${{ inputs.use_own_fork && github.repository_owner || 'rdp' }}/ffmpeg-windows-build-helpers latest commit
id: ffmpeg-helper-info
run: |
git_owner=${{ inputs.use_own_fork && github.repository_owner || 'rdp' }}
git_sha=$(gh api repos/$git_owner/ffmpeg-windows-build-helpers/commits/master -q .sha)
echo git-owner=$git_owner >> $GITHUB_OUTPUT
echo git-sha=$git_sha >> $GITHUB_OUTPUT
echo git-sha-short=${git_sha::7} >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Get ffmpeg-autobuild latest build
id: ffmpeg-autobuild-info
run: |
tag_name=$(gh api repos/$GITHUB_REPOSITORY/releases/latest -q .tag_name)
echo git-sha=${tag_name:17:7} >> $GITHUB_OUTPUT
echo helper-git-sha=${tag_name:25:7} >> $GITHUB_OUTPUT
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Check if there is newer commit
if: '! inputs.force_build'
run: >
[[ "${{ steps.ffmpeg-info.outputs.git-sha-short }}" != "${{ steps.ffmpeg-autobuild-info.outputs.git-sha }}" ]] ||
[[ "${{ steps.ffmpeg-helper-info.outputs.git-sha-short }}" != "${{ steps.ffmpeg-autobuild-info.outputs.helper-git-sha }}" ]]
outputs:
git-sha: ${{ steps.ffmpeg-info.outputs.git-sha }}
git-sha-short: ${{ steps.ffmpeg-info.outputs.git-sha-short }}
helper-git-owner: ${{ steps.ffmpeg-helper-info.outputs.git-owner }}
helper-git-sha: ${{ steps.ffmpeg-helper-info.outputs.git-sha }}
helper-git-sha-short: ${{ steps.ffmpeg-helper-info.outputs.git-sha-short }}
build:
needs: check
runs-on: ubuntu-latest
strategy:
matrix:
os: [win64, win32]
steps:
- name: Checkout ${{ needs.check.outputs.helper-git-owner }}/ffmpeg-windows-build-helpers
uses: actions/checkout@v4
with:
repository: ${{ needs.check.outputs.helper-git-owner }}/ffmpeg-windows-build-helpers
ref: ${{ needs.check.outputs.helper-git-sha }}
persist-credentials: false
- name: Checkout FFmpeg
uses: actions/checkout@v4
with:
repository: FFmpeg/FFmpeg
ref: ${{ needs.check.outputs.git-sha }}
persist-credentials: false
path: ffmpeg-source
- name: Install APT dependencies
uses: awalsh128/cache-apt-pkgs-action@v1
with:
packages: ragel cvs yasm pax nasm gperf autogen autoconf-archive
- name: Install pip dependencies
run: sudo -H pip3 -qq install meson ninja
- name: Get current FFmpeg git date
id: git-date
working-directory: ffmpeg-source
run: echo git-date=$(git log -1 --format=%ci) >> $GITHUB_OUTPUT
- name: Get current date & time before build
id: date-time-before
run: echo date-time=$(date +'%Y-%m-%d %H:%M') >> $GITHUB_OUTPUT
- name: Compile FFmpeg ${{ needs.check.outputs.git-sha-short }} using ffmpeg-windows-build-helpers ${{ needs.check.outputs.helper-git-sha-short }}
run: ./cross_compile_ffmpeg.sh --ffmpeg-source-dir=$GITHUB_WORKSPACE/ffmpeg-source --gcc-cpu-count=$(nproc) --disable-nonfree=n --sandbox-ok=y --compiler-flavors=${{ matrix.os }}
- name: Get current date & time after build
id: date-time-after
run: |
echo date-time=$(date +'%Y-%m-%d %H:%M') >> $GITHUB_OUTPUT
echo date-time-tag=$(date +'%Y-%m-%d-%H-%M') >> $GITHUB_OUTPUT
- name: Upload FFmpeg binaries
uses: actions/upload-artifact@v4
with:
name: ffmpeg-${{ matrix.os }}
path: |
ffmpeg-source/ffmpeg.exe
ffmpeg-source/ffprobe.exe
ffmpeg-source/ffplay.exe
if-no-files-found: error
retention-days: ${{ inputs.no_release && '0' || '1' }}
outputs:
date-time-before: ${{ steps.date-time-before.outputs.date-time }}
date-time-after: ${{ steps.date-time-after.outputs.date-time }}
date-time-after-tag: ${{ steps.date-time-after.outputs.date-time-tag }}
git-date: ${{ steps.git-date.outputs.git-date }}
archive:
permissions:
id-token: write
attestations: write
needs: [check, build]
runs-on: ubuntu-latest
strategy:
matrix:
os: [win64, win32]
steps:
- name: Download FFmpeg binaries
uses: actions/download-artifact@v4
with:
name: ffmpeg-${{ matrix.os }}
- name: Create LICENSE
run: |
echo "This version of ffmpeg has nonfree parts compiled in." >> LICENSE
echo "Therefore it is not legally redistributable." >> LICENSE
- name: Generate artifact attestation for FFmpeg binaries
if: '! inputs.no_release'
uses: actions/attest-build-provenance@v1
with:
subject-path: ff*.exe
- name: 7-Zip FFmpeg binaries
run: 7z a -mx9 ffmpeg-${{ needs.check.outputs.git-sha-short }}-${{ needs.check.outputs.helper-git-sha-short }}-${{ matrix.os }}-nonfree.7z ff{mpeg,probe,play}.exe LICENSE
- name: Generate artifact attestation for FFmpeg archive
if: '! inputs.no_release'
uses: actions/attest-build-provenance@v1
with:
subject-path: ffmpeg-${{ needs.check.outputs.git-sha-short }}-${{ needs.check.outputs.helper-git-sha-short }}-${{ matrix.os }}-nonfree.7z
- name: Upload FFmpeg archive
uses: actions/upload-artifact@v4
with:
name: ffmpeg-archive-${{ matrix.os }}
path: ffmpeg-${{ needs.check.outputs.git-sha-short }}-${{ needs.check.outputs.helper-git-sha-short }}-${{ matrix.os }}-nonfree.7z
retention-days: ${{ inputs.no_release && '0' || '1' }}
compression-level: 0
release:
needs: [check, build, archive]
if: '! inputs.no_release'
runs-on: ubuntu-latest
steps:
- name: Download FFmpeg archives
uses: actions/download-artifact@v4
with:
pattern: ffmpeg-archive-*
merge-multiple: true
- name: Release FFmpeg archives
run: |
gh release create "${{ needs.build.outputs.date-time-after-tag }}-${{ needs.check.outputs.git-sha-short }}-${{ needs.check.outputs.helper-git-sha-short }}" \
ffmpeg-${{ needs.check.outputs.git-sha-short }}-${{ needs.check.outputs.helper-git-sha-short }}-{win64,win32}-nonfree.7z \
-n "FFmpeg nonfree git-${{ needs.check.outputs.git-sha }} in ${{ needs.build.outputs.git-date }} built on ${{ needs.build.outputs.date-time-after }} started at ${{ needs.build.outputs.date-time-before }}
Using ${{ needs.check.outputs.helper-git-owner }}/ffmpeg-windows-build-helpers git-${{ needs.check.outputs.helper-git-sha }}" \
-t "${{ needs.build.outputs.date-time-after }} ${{ needs.check.outputs.git-sha-short }}"
env:
GITHUB_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}