Build Artifacts #37
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: Build Artifacts | |
on: | |
workflow_call: | |
inputs: | |
version: | |
required: true | |
type: string | |
channel: | |
required: false | |
default: stable | |
type: string | |
unix: | |
default: true | |
type: boolean | |
linux_arm: | |
default: true | |
type: boolean | |
macos: | |
default: true | |
type: boolean | |
macos_legacy: | |
default: true | |
type: boolean | |
windows: | |
default: true | |
type: boolean | |
windows32: | |
default: true | |
type: boolean | |
meta_files: | |
default: true | |
type: boolean | |
origin: | |
required: false | |
default: '' | |
type: string | |
secrets: | |
GPG_SIGNING_KEY: | |
required: false | |
workflow_dispatch: | |
inputs: | |
version: | |
description: | | |
VERSION: yyyy.mm.dd[.rev] or rev | |
required: true | |
type: string | |
channel: | |
description: | | |
SOURCE of this build's updates: stable/nightly/master/<repo> | |
required: true | |
default: stable | |
type: string | |
unix: | |
description: yt-dlp, yt-dlp.tar.gz, yt-dlp_linux, yt-dlp_linux.zip | |
default: true | |
type: boolean | |
linux_arm: | |
description: yt-dlp_linux_aarch64, yt-dlp_linux_armv7l | |
default: true | |
type: boolean | |
macos: | |
description: yt-dlp_macos, yt-dlp_macos.zip | |
default: true | |
type: boolean | |
macos_legacy: | |
description: yt-dlp_macos_legacy | |
default: true | |
type: boolean | |
windows: | |
description: yt-dlp.exe, yt-dlp_min.exe, yt-dlp_win.zip | |
default: true | |
type: boolean | |
windows32: | |
description: yt-dlp_x86.exe | |
default: true | |
type: boolean | |
meta_files: | |
description: SHA2-256SUMS, SHA2-512SUMS, _update_spec | |
default: true | |
type: boolean | |
origin: | |
description: . | |
required: false | |
default: '' | |
type: choice | |
options: | |
- '' | |
permissions: | |
contents: read | |
jobs: | |
process: | |
runs-on: ubuntu-latest | |
outputs: | |
origin: ${{ steps.process_origin.outputs.origin }} | |
steps: | |
- name: Process origin | |
id: process_origin | |
run: | | |
echo "origin=${{ inputs.origin || github.repository }}" >> "$GITHUB_OUTPUT" | |
unix: | |
needs: process | |
if: inputs.unix | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.10" | |
- uses: conda-incubator/setup-miniconda@v2 | |
with: | |
miniforge-variant: Mambaforge | |
use-mamba: true | |
channels: conda-forge | |
auto-update-conda: true | |
activate-environment: "" | |
auto-activate-base: false | |
- name: Install Requirements | |
run: | | |
sudo apt -y install zip pandoc man sed | |
reqs=$(mktemp) | |
cat > "$reqs" << EOF | |
python=3.10.* | |
pyinstaller | |
cffi | |
brotli-python | |
secretstorage | |
EOF | |
sed -E '/^(brotli|secretstorage).*/d' requirements.txt >> "$reqs" | |
mamba create -n build --file "$reqs" | |
- name: Prepare | |
run: | | |
python devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" | |
python devscripts/make_lazy_extractors.py | |
- name: Build Unix platform-independent binary | |
run: | | |
make all tar | |
- name: Build Unix standalone binary | |
shell: bash -l {0} | |
run: | | |
unset LD_LIBRARY_PATH # Harmful; set by setup-python | |
conda activate build | |
python -m pip install -U pip setuptools wheel pip-tools | |
python -m piptools compile -o requirements-all.txt --extra curl_cffi setup.py | |
python -m pip install -U -r requirements-all.txt | |
python pyinst.py --onedir | |
(cd ./dist/yt-dlp_linux && zip -r ../yt-dlp_linux.zip .) | |
python pyinst.py | |
mv ./dist/yt-dlp_linux ./yt-dlp_linux | |
mv ./dist/yt-dlp_linux.zip ./yt-dlp_linux.zip | |
- name: Verify --update-to | |
if: vars.UPDATE_TO_VERIFICATION | |
run: | | |
binaries=("yt-dlp" "yt-dlp_linux") | |
for binary in "${binaries[@]}"; do | |
chmod +x ./${binary} | |
cp ./${binary} ./${binary}_downgraded | |
version="$(./${binary} --version)" | |
./${binary}_downgraded -v --update-to yt-dlp/[email protected] | |
downgraded_version="$(./${binary}_downgraded --version)" | |
[[ "$version" != "$downgraded_version" ]] | |
done | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: | | |
yt-dlp | |
yt-dlp.tar.gz | |
yt-dlp_linux | |
yt-dlp_linux.zip | |
linux_arm: | |
needs: process | |
if: inputs.linux_arm | |
permissions: | |
contents: read | |
packages: write # for creating cache | |
runs-on: ubuntu-latest | |
strategy: | |
matrix: | |
architecture: | |
- armv7 | |
- aarch64 | |
steps: | |
- uses: actions/checkout@v4 | |
with: | |
path: ./repo | |
- name: Virtualized Install, Prepare & Build | |
uses: yt-dlp/run-on-arch-action@v2 | |
with: | |
# Ref: https://github.com/uraimo/run-on-arch-action/issues/55 | |
env: | | |
GITHUB_WORKFLOW: build | |
githubToken: ${{ github.token }} # To cache image | |
arch: ${{ matrix.architecture }} | |
distro: ubuntu18.04 # Standalone executable should be built on minimum supported OS | |
dockerRunArgs: --volume "${PWD}/repo:/repo" | |
install: | # Installing Python 3.10 from the Deadsnakes repo raises errors | |
apt update | |
apt -y install zlib1g-dev python3.8 python3.8-dev python3.8-distutils python3-pip | |
python3.8 -m pip install -U pip setuptools wheel | |
# Cannot access requirements.txt from the repo directory at this stage | |
python3.8 -m pip install -U Pyinstaller mutagen pycryptodomex websockets brotli certifi secretstorage | |
run: | | |
cd repo | |
python3.8 -m pip install -U Pyinstaller secretstorage -r requirements.txt # Cached version may be out of date | |
python3.8 devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" | |
python3.8 devscripts/make_lazy_extractors.py | |
python3.8 pyinst.py | |
if ${{ vars.UPDATE_TO_VERIFICATION && 'true' || 'false' }}; then | |
arch="${{ (matrix.architecture == 'armv7' && 'armv7l') || matrix.architecture }}" | |
chmod +x ./dist/yt-dlp_linux_${arch} | |
cp ./dist/yt-dlp_linux_${arch} ./dist/yt-dlp_linux_${arch}_downgraded | |
version="$(./dist/yt-dlp_linux_${arch} --version)" | |
./dist/yt-dlp_linux_${arch}_downgraded -v --update-to yt-dlp/[email protected] | |
downgraded_version="$(./dist/yt-dlp_linux_${arch}_downgraded --version)" | |
[[ "$version" != "$downgraded_version" ]] | |
fi | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: | # run-on-arch-action designates armv7l as armv7 | |
repo/dist/yt-dlp_linux_${{ (matrix.architecture == 'armv7' && 'armv7l') || matrix.architecture }} | |
macos: | |
needs: process | |
if: inputs.macos | |
runs-on: macos-11 | |
steps: | |
- uses: actions/checkout@v4 | |
# NB: Building universal2 does not work with python from actions/setup-python | |
- name: Install Requirements | |
run: | | |
brew install coreutils gnu-sed | |
python3 -m pip install -U --user pip setuptools wheel delocate | |
# curl_cffi must be removed from reqs | |
gsed -i -E '/^curl_cffi.*/d' requirements.txt | |
# We need to ignore wheels otherwise we break universal2 builds | |
python3 -m pip install -U --user --no-binary :all: Pyinstaller -r requirements.txt | |
mkdir curl_cffi_whls curl_cffi_universal2 | |
python3 -m pip download --only-binary=:all: --platform macosx_11_0_arm64 curl_cffi --pre -d curl_cffi_whls | |
python3 -m pip download --only-binary=:all: --platform macosx_11_0_x86_64 curl_cffi --pre -d curl_cffi_whls | |
python3 -m delocate.cmd.delocate_fuse curl_cffi_whls/curl_cffi* -w curl_cffi_universal2 | |
python3 -m delocate.cmd.delocate_fuse curl_cffi_whls/cffi-* -w curl_cffi_universal2 | |
cd curl_cffi_universal2 | |
for file in *cffi-*x86_64*; do mv -n "${file}" "${file/x86_64/universal2}"; done | |
python3 -m pip install -U --user curl_cffi-* cffi-* | |
- name: Prepare | |
run: | | |
python3 devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" | |
python3 devscripts/make_lazy_extractors.py | |
- name: Build | |
run: | | |
python3 pyinst.py --target-architecture universal2 --onedir | |
(cd ./dist/yt-dlp_macos && zip -r ../yt-dlp_macos.zip .) | |
python3 pyinst.py --target-architecture universal2 | |
- name: Verify --update-to | |
if: vars.UPDATE_TO_VERIFICATION | |
run: | | |
chmod +x ./dist/yt-dlp_macos | |
cp ./dist/yt-dlp_macos ./dist/yt-dlp_macos_downgraded | |
version="$(./dist/yt-dlp_macos --version)" | |
./dist/yt-dlp_macos_downgraded -v --update-to yt-dlp/[email protected] | |
downgraded_version="$(./dist/yt-dlp_macos_downgraded --version)" | |
[[ "$version" != "$downgraded_version" ]] | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: | | |
dist/yt-dlp_macos | |
dist/yt-dlp_macos.zip | |
macos_legacy: | |
needs: process | |
if: inputs.macos_legacy | |
runs-on: macos-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- name: Install Python | |
# We need the official Python, because the GA ones only support newer macOS versions | |
env: | |
PYTHON_VERSION: 3.10.5 | |
MACOSX_DEPLOYMENT_TARGET: 10.9 # Used up by the Python build tools | |
run: | | |
# Hack to get the latest patch version. Uncomment if needed | |
#brew install [email protected] | |
#export PYTHON_VERSION=$( $(brew --prefix)/opt/[email protected]/bin/python3 --version | cut -d ' ' -f 2 ) | |
curl https://www.python.org/ftp/python/${PYTHON_VERSION}/python-${PYTHON_VERSION}-macos11.pkg -o "python.pkg" | |
sudo installer -pkg python.pkg -target / | |
python3 --version | |
- name: Install Requirements | |
run: | | |
brew install coreutils | |
python3 -m pip install -U --user pip setuptools wheel pip-tools | |
python3 -m piptools compile -o requirements-all.txt --extra curl_cffi setup.py | |
python3 -m pip install -U --user Pyinstaller -r requirements-all.txt | |
- name: Prepare | |
run: | | |
python3 devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" | |
python3 devscripts/make_lazy_extractors.py | |
- name: Build | |
run: | | |
python3 pyinst.py | |
mv dist/yt-dlp_macos dist/yt-dlp_macos_legacy | |
- name: Verify --update-to | |
if: vars.UPDATE_TO_VERIFICATION | |
run: | | |
chmod +x ./dist/yt-dlp_macos_legacy | |
cp ./dist/yt-dlp_macos_legacy ./dist/yt-dlp_macos_legacy_downgraded | |
version="$(./dist/yt-dlp_macos_legacy --version)" | |
./dist/yt-dlp_macos_legacy_downgraded -v --update-to yt-dlp/[email protected] | |
downgraded_version="$(./dist/yt-dlp_macos_legacy_downgraded --version)" | |
[[ "$version" != "$downgraded_version" ]] | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: | | |
dist/yt-dlp_macos_legacy | |
windows: | |
needs: process | |
if: inputs.windows | |
runs-on: windows-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v4 | |
with: # 3.8 is used for Win7 support | |
python-version: "3.8" | |
- name: Install Requirements | |
run: | # Custom pyinstaller built with https://github.com/yt-dlp/pyinstaller-builds | |
python -m pip install -U pip setuptools wheel py2exe pip-tools | |
python -m piptools compile -o requirements-all.txt --extra curl_cffi setup.py | |
pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-5.8.0-py3-none-any.whl" -r requirements-all.txt | |
- name: Prepare | |
run: | | |
python devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" | |
python devscripts/make_lazy_extractors.py | |
- name: Build | |
run: | | |
python setup.py py2exe | |
Move-Item ./dist/yt-dlp.exe ./dist/yt-dlp_min.exe | |
python pyinst.py | |
python pyinst.py --onedir | |
Compress-Archive -Path ./dist/yt-dlp/* -DestinationPath ./dist/yt-dlp_win.zip | |
- name: Verify --update-to | |
if: vars.UPDATE_TO_VERIFICATION | |
run: | | |
foreach ($name in @("yt-dlp","yt-dlp_min")) { | |
Copy-Item "./dist/${name}.exe" "./dist/${name}_downgraded.exe" | |
$version = & "./dist/${name}.exe" --version | |
& "./dist/${name}_downgraded.exe" -v --update-to yt-dlp/[email protected] | |
$downgraded_version = & "./dist/${name}_downgraded.exe" --version | |
if ($version -eq $downgraded_version) { | |
exit 1 | |
} | |
} | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: | | |
dist/yt-dlp.exe | |
dist/yt-dlp_min.exe | |
dist/yt-dlp_win.zip | |
windows32: | |
needs: process | |
if: inputs.windows32 | |
runs-on: windows-latest | |
steps: | |
- uses: actions/checkout@v4 | |
- uses: actions/setup-python@v4 | |
with: | |
python-version: "3.8" | |
architecture: "x86" | |
- name: Install Requirements | |
run: | | |
python -m pip install -U pip setuptools wheel | |
pip install -U "https://yt-dlp.github.io/Pyinstaller-Builds/i686/pyinstaller-5.8.0-py3-none-any.whl" -r requirements.txt | |
- name: Prepare | |
run: | | |
python devscripts/update-version.py -c "${{ inputs.channel }}" -r "${{ needs.process.outputs.origin }}" "${{ inputs.version }}" | |
python devscripts/make_lazy_extractors.py | |
- name: Build | |
run: | | |
python pyinst.py | |
- name: Verify --update-to | |
if: vars.UPDATE_TO_VERIFICATION | |
run: | | |
foreach ($name in @("yt-dlp_x86")) { | |
Copy-Item "./dist/${name}.exe" "./dist/${name}_downgraded.exe" | |
$version = & "./dist/${name}.exe" --version | |
& "./dist/${name}_downgraded.exe" -v --update-to yt-dlp/[email protected] | |
$downgraded_version = & "./dist/${name}_downgraded.exe" --version | |
if ($version -eq $downgraded_version) { | |
exit 1 | |
} | |
} | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: | | |
dist/yt-dlp_x86.exe | |
meta_files: | |
if: inputs.meta_files && always() && !cancelled() | |
needs: | |
- process | |
- unix | |
- linux_arm | |
- macos | |
- macos_legacy | |
- windows | |
- windows32 | |
runs-on: ubuntu-latest | |
steps: | |
- uses: actions/download-artifact@v3 | |
- name: Make SHA2-SUMS files | |
run: | | |
cd ./artifact/ | |
sha256sum * > ../SHA2-256SUMS | |
sha512sum * > ../SHA2-512SUMS | |
- name: Make Update spec | |
run: | | |
cat >> _update_spec << EOF | |
# This file is used for regulating self-update | |
lock 2022.08.18.36 .+ Python 3\.6 | |
lock 2023.11.16 (?!win_x86_exe).+ Python 3\.7 | |
lock 2023.11.16 win_x86_exe .+ Windows-(?:Vista|2008Server) | |
lockV2 yt-dlp/yt-dlp 2022.08.18.36 .+ Python 3\.6 | |
lockV2 yt-dlp/yt-dlp 2023.11.16 (?!win_x86_exe).+ Python 3\.7 | |
lockV2 yt-dlp/yt-dlp 2023.11.16 win_x86_exe .+ Windows-(?:Vista|2008Server) | |
lockV2 yt-dlp/yt-dlp-nightly-builds 2023.11.15.232826 (?!win_x86_exe).+ Python 3\.7 | |
lockV2 yt-dlp/yt-dlp-nightly-builds 2023.11.15.232826 win_x86_exe .+ Windows-(?:Vista|2008Server) | |
lockV2 yt-dlp/yt-dlp-master-builds 2023.11.15.232812 (?!win_x86_exe).+ Python 3\.7 | |
lockV2 yt-dlp/yt-dlp-master-builds 2023.11.15.232812 win_x86_exe .+ Windows-(?:Vista|2008Server) | |
EOF | |
- name: Sign checksum files | |
env: | |
GPG_SIGNING_KEY: ${{ secrets.GPG_SIGNING_KEY }} | |
if: env.GPG_SIGNING_KEY != '' | |
run: | | |
gpg --batch --import <<< "${{ secrets.GPG_SIGNING_KEY }}" | |
for signfile in ./SHA*SUMS; do | |
gpg --batch --detach-sign "$signfile" | |
done | |
- name: Upload artifacts | |
uses: actions/upload-artifact@v3 | |
with: | |
path: | | |
SHA*SUMS* | |
_update_spec |