summaryrefslogtreecommitdiffstats
path: root/.github/workflows/build.yml
blob: 93668a7bfa518257d700bd90850733c35e92bc8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
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
    secrets:
      GPG_SIGNING_KEY:
        required: false

  workflow_dispatch:
    inputs:
      version:
        description: Version tag (YYYY.MM.DD[.REV])
        required: true
        type: string
      channel:
        description: Update channel (stable/nightly)
        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

permissions:
  contents: read

jobs:
  unix:
    if: inputs.unix
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - 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-get -y install zip pandoc man sed
          python -m pip install -U pip setuptools wheel
          python -m pip install -U Pyinstaller -r requirements.txt
          reqs=$(mktemp)
          cat > $reqs << EOF
          python=3.10.*
          pyinstaller
          cffi
          brotli-python
          EOF
          sed '/^brotli.*/d' requirements.txt >> $reqs
          mamba create -n build --file $reqs

      - name: Prepare
        run: |
          python devscripts/update-version.py -c ${{ inputs.channel }} ${{ 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 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: Upload artifacts
        uses: actions/upload-artifact@v3
        with:
          path: |
            yt-dlp
            yt-dlp.tar.gz
            yt-dlp_linux
            yt-dlp_linux.zip

  linux_arm:
    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@v3
        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

          run: |
            cd repo
            python3.8 -m pip install -U Pyinstaller -r requirements.txt  # Cached version may be out of date
            python3.8 devscripts/update-version.py -c ${{ inputs.channel }} ${{ inputs.version }}
            python3.8 devscripts/make_lazy_extractors.py
            python3.8 pyinst.py

      - 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:
    if: inputs.macos
    runs-on: macos-11

    steps:
      - uses: actions/checkout@v3
      # NB: In order to create a universal2 application, the version of python3 in /usr/bin has to be used
      - name: Install Requirements
        run: |
          brew install coreutils
          /usr/bin/python3 -m pip install -U --user pip Pyinstaller -r requirements.txt

      - name: Prepare
        run: |
          /usr/bin/python3 devscripts/update-version.py -c ${{ inputs.channel }} ${{ inputs.version }}
          /usr/bin/python3 devscripts/make_lazy_extractors.py
      - name: Build
        run: |
          /usr/bin/python3 pyinst.py --target-architecture universal2 --onedir
          (cd ./dist/yt-dlp_macos && zip -r ../yt-dlp_macos.zip .)
          /usr/bin/python3 pyinst.py --target-architecture universal2

      - name: Upload artifacts
        uses: actions/upload-artifact@v3
        with:
          path: |
            dist/yt-dlp_macos
            dist/yt-dlp_macos.zip

  macos_legacy:
    if: inputs.macos_legacy
    runs-on: macos-latest

    steps:
      - uses: actions/checkout@v3
      - 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 python@3.10
          #export PYTHON_VERSION=$( $(brew --prefix)/opt/python@3.10/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 Pyinstaller -r requirements.txt

      - name: Prepare
        run: |
          python3 devscripts/update-version.py -c ${{ inputs.channel }} ${{ 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: Upload artifacts
        uses: actions/upload-artifact@v3
        with:
          path: |
            dist/yt-dlp_macos_legacy

  windows:
    if: inputs.windows
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v3
      - 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 install -U "https://yt-dlp.github.io/Pyinstaller-Builds/x86_64/pyinstaller-5.8.0-py3-none-any.whl" -r requirements.txt

      - name: Prepare
        run: |
          python devscripts/update-version.py -c ${{ inputs.channel }} ${{ 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: Upload artifacts
        uses: actions/upload-artifact@v3
        with:
          path: |
            dist/yt-dlp.exe
            dist/yt-dlp_min.exe
            dist/yt-dlp_win.zip

  windows32:
    if: inputs.windows32
    runs-on: windows-latest

    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-python@v4
        with: # 3.7 is used for Vista support. See https://github.com/yt-dlp/yt-dlp/issues/390
          python-version: "3.7"
          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 }} ${{ inputs.version }}
          python devscripts/make_lazy_extractors.py
      - name: Build
        run: |
          python pyinst.py

      - name: Upload artifacts
        uses: actions/upload-artifact@v3
        with:
          path: |
            dist/yt-dlp_x86.exe

  meta_files:
    if: inputs.meta_files && always()
    needs:
      - 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
          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