xref: /vim-8.2.3635/.github/workflows/ci.yml (revision 4c295027)
1name: GitHub CI
2
3on:
4  push:
5    branches: ['**']
6  pull_request:
7
8jobs:
9  linux:
10    runs-on: ubuntu-18.04
11
12    env:
13      CC: ${{ matrix.compiler }}
14      TEST: test
15      SRCDIR: ./src
16      LEAK_CFLAGS: -DEXITFREE
17      LOG_DIR: ${{ github.workspace }}/logs
18      TERM: xterm
19      DISPLAY: ':99'
20      DEBIAN_FRONTEND: noninteractive
21
22    strategy:
23      fail-fast: false
24      matrix:
25        features: [tiny, small, normal, huge]
26        compiler: [clang, gcc]
27        extra: [none]
28        include:
29          - features: tiny
30            compiler: clang
31            extra: nogui
32          - features: tiny
33            compiler: gcc
34            extra: nogui
35          - features: normal
36            shadow: ./src/shadow
37          - features: huge
38            coverage: true
39          - features: huge
40            compiler: gcc
41            coverage: true
42            extra: testgui
43          - features: huge
44            compiler: clang
45            extra: asan
46          - features: huge
47            compiler: gcc
48            coverage: true
49            extra: unittests
50          - features: normal
51            compiler: gcc
52            extra: vimtags
53
54    steps:
55      - uses: actions/checkout@v2
56
57      - name: Install packages
58        run: |
59          sudo apt-get install -y \
60            autoconf \
61            lcov \
62            gettext \
63            libcanberra-dev \
64            libperl-dev \
65            python-dev \
66            python3-dev \
67            liblua5.3-dev \
68            lua5.3 \
69            ruby-dev \
70            tcl-dev \
71            cscope \
72            libgtk2.0-dev \
73            desktop-file-utils \
74            libtool-bin
75
76      - name: Install clang-11
77        if: matrix.compiler == 'clang'
78        run: |
79          wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
80          . /etc/lsb-release
81          sudo add-apt-repository -y "deb http://apt.llvm.org/${DISTRIB_CODENAME}/ llvm-toolchain-${DISTRIB_CODENAME}-11 main"
82          sudo apt-get install -y clang-11
83          sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-11 100
84          sudo update-alternatives --set clang /usr/bin/clang-11
85          sudo update-alternatives --install /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-11 100
86
87      - name: Set up environment
88        run: |
89          mkdir -p "${LOG_DIR}"
90          mkdir -p "${HOME}/bin"
91          echo "${HOME}/bin" >> $GITHUB_PATH
92          (
93          echo "LINUX_VERSION=$(uname -r)"
94          echo "NPROC=$(getconf _NPROCESSORS_ONLN)"
95          echo "SND_DUMMY_DIR=${HOME}/snd-dummy"
96          echo "TMPDIR=${{ runner.temp }}"
97
98          case "${{ matrix.features }}" in
99          tiny|small)
100            echo "TEST=testtiny"
101            if ${{ contains(matrix.extra, 'nogui') }}; then
102              echo "CONFOPT=--disable-gui"
103            fi
104            ;;
105          normal)
106            ;;
107          huge)
108            echo "TEST=scripttests test_libvterm"
109            echo "CONFOPT=--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp"
110            ;;
111          esac
112
113          if ${{ matrix.coverage == true }}; then
114            echo "CFLAGS=--coverage -DUSE_GCOV_FLUSH"
115            echo "LDFLAGS=--coverage"
116          fi
117          if ${{ contains(matrix.extra, 'testgui') }}; then
118            echo "TEST=-C src testgui"
119          fi
120          if ${{ contains(matrix.extra, 'unittests') }}; then
121            echo "TEST=unittests"
122          fi
123          if ${{ contains(matrix.extra, 'asan') }}; then
124            echo "SANITIZER_CFLAGS=-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize-recover=all -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer"
125            echo "ASAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/asan"
126            echo "UBSAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/ubsan"
127            echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/src/testdir/lsan-suppress.txt"
128          fi
129          if ${{ contains(matrix.extra, 'vimtags') }}; then
130            echo "TEST=-C runtime/doc vimtags VIMEXE=../../${SRCDIR}/vim"
131          fi
132          ) >> $GITHUB_ENV
133
134      - name: Set up system
135        run: |
136          if [[ ${CC} = clang ]]; then
137            # Use llvm-cov instead of gcov when compiler is clang.
138            ln -fs /usr/bin/llvm-cov ${HOME}/bin/gcov
139          fi
140          # Setup lua5.3 manually since its package doesn't provide alternative.
141          # https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
142          if [[ ${CONFOPT} =~ luainterp ]]; then
143            sudo update-alternatives --install /usr/bin/lua lua /usr/bin/lua5.3 10
144          fi
145          sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0
146          sudo usermod -a -G audio "${USER}"
147          sudo bash ci/setup-xvfb.sh
148
149      - name: Cache snd-dummy
150        uses: actions/cache@v2
151        with:
152          path: ${{ env.SND_DUMMY_DIR }}
153          key: linux-${{ env.LINUX_VERSION }}-snd-dummy
154
155      - name: Set up snd-dummy
156        run: |
157          if [[ ! -e ${SND_DUMMY_DIR}/snd-dummy.ko ]]; then
158            bash ci/build-snd-dummy.sh
159          fi
160          cd "${SND_DUMMY_DIR}"
161          sudo insmod soundcore.ko
162          sudo insmod snd.ko
163          sudo insmod snd-pcm.ko
164          sudo insmod snd-dummy.ko
165
166      - name: Check autoconf
167        if: contains(matrix.extra, 'unittests')
168        run: |
169          make -C src autoconf
170
171      - name: Set up shadow dir
172        if: matrix.shadow
173        run: |
174          make -C src shadow
175          echo "SRCDIR=${{ matrix.shadow }}" >> $GITHUB_ENV
176          echo "SHADOWOPT=-C ${{ matrix.shadow }}" >> $GITHUB_ENV
177
178      - name: Configure
179        run: |
180          ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing
181          # Append various warning flags to CFLAGS.
182          sed -i -f ci/config.mk.sed ${SRCDIR}/auto/config.mk
183          sed -i -f ci/config.mk.${CC}.sed ${SRCDIR}/auto/config.mk
184
185      - name: Build
186        if: (!contains(matrix.extra, 'unittests'))
187        run: |
188          make ${SHADOWOPT} -j${NPROC}
189
190      - name: Check version
191        if: (!contains(matrix.extra, 'unittests'))
192        run: |
193          "${SRCDIR}"/vim --version
194          "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit
195          "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit
196
197      - name: Test
198        timeout-minutes: 20
199        run: |
200          do_test() { sg audio "sg $(id -gn) '$*'"; }
201          do_test make ${SHADOWOPT} ${TEST}
202
203      - name: Coveralls
204        if: matrix.coverage && success() && github.event_name != 'pull_request'
205        env:
206          COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
207          COVERALLS_PARALLEL: true
208          TRAVIS_JOB_ID: ${{ github.run_id }}
209        run: |
210          sudo apt-get install -y python3-setuptools python3-wheel
211          sudo -H pip3 install pip -U
212          # needed for https support for coveralls building cffi only works with gcc, not with clang
213          CC=gcc pip3 install --user cpp-coveralls pyopenssl ndg-httpsclient pyasn1
214          ~/.local/bin/coveralls -b "${SRCDIR}" -x .xs -e "${SRCDIR}"/if_perl.c -e "${SRCDIR}"/xxd -e "${SRCDIR}"/libvterm --encodings utf-8
215
216      - name: Codecov
217        if: matrix.coverage && success()
218        run: |
219          cd "${SRCDIR}"
220          bash <(curl -s https://codecov.io/bash) -F "${{ matrix.features }}-${{ matrix.compiler }}-${{ matrix.extra }}"
221
222      - name: ASan logs
223        if: contains(matrix.extra, 'asan') && !cancelled()
224        run: |
225          for f in $(grep -lR '#[[:digit:]]* *0x[[:digit:]a-fA-F]*' "${LOG_DIR}"); do
226            asan_symbolize-11 -l "$f"
227            false # in order to fail a job
228          done
229
230  coveralls:
231    runs-on: ubuntu-18.04
232
233    needs: linux
234    if: always() && github.event_name != 'pull_request'
235
236    steps:
237      - name: Parallel finished
238        env:
239          COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
240        run: |
241          curl -k "https://coveralls.io/webhook?repo_token=${COVERALLS_REPO_TOKEN}" -d "payload[build_num]=${GITHUB_RUN_ID}&payload[status]=done"
242
243  macos:
244    runs-on: macos-latest
245
246    env:
247      CC: ${{ matrix.compiler }}
248      TEST: test
249      SRCDIR: ./src
250      LEAK_CFLAGS: -DEXITFREE
251      TERM: xterm
252
253    strategy:
254      fail-fast: false
255      matrix:
256        features: [tiny, huge]
257        compiler: [clang, gcc]
258
259    steps:
260      - uses: actions/checkout@v2
261
262      - name: Install packages
263        env:
264          HOMEBREW_NO_AUTO_UPDATE: 1
265        run: |
266          brew install lua
267          echo "LUA_PREFIX=/usr/local" >> $GITHUB_ENV
268
269      - name: Set up environment
270        run: |
271          (
272          echo "NPROC=$(getconf _NPROCESSORS_ONLN)"
273          case "${{ matrix.features }}" in
274          tiny)
275            echo "TEST=testtiny"
276            echo "CONFOPT=--disable-gui"
277            ;;
278          huge)
279            echo "CONFOPT=--enable-perlinterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp"
280            ;;
281          esac
282          ) >> $GITHUB_ENV
283
284      - name: Configure
285        run: |
286          ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing
287          # Append various warning flags to CFLAGS.
288          # BSD sed needs backup extension specified.
289          sed -i.bak -f ci/config.mk.sed ${SRCDIR}/auto/config.mk
290          # On macOS, the entity of gcc is clang.
291          sed -i.bak -f ci/config.mk.clang.sed ${SRCDIR}/auto/config.mk
292
293      - name: Build
294        env:
295          LC_ALL: C
296        run: |
297          make -j${NPROC}
298
299      - name: Check version
300        run: |
301          "${SRCDIR}"/vim --version
302          "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit
303          "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit
304
305      - name: Test
306        timeout-minutes: 20
307        run: |
308          make ${TEST}
309
310  windows:
311    runs-on: windows-latest
312
313    env:
314      VCVARSALL: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat
315      # Interfaces
316      # Lua
317      LUA_VER: 54
318      LUA_VER_DOT: '5.4'
319      LUA_RELEASE: 5.4.0
320      LUA32_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win32_dllw6_lib.zip
321      LUA64_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win64_dllw6_lib.zip
322      LUA_DIR: D:\Lua
323      # Python 2
324      PYTHON_VER: 27
325      PYTHON_VER_DOT: '2.7'
326      # Python 3
327      PYTHON3_VER: 38
328      PYTHON3_VER_DOT: '3.8'
329      # Other dependencies
330      # winpty
331      WINPTY_URL: https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip
332      # Escape sequences
333      COL_RED: "\x1b[31m"
334      COL_GREEN: "\x1b[32m"
335      COL_YELLOW: "\x1b[33m"
336      COL_RESET: "\x1b[m"
337
338    strategy:
339      fail-fast: false
340      matrix:
341        toolchain: [msvc, mingw]
342        arch: [x64, x86]
343        features: [HUGE, NORMAL]
344        include:
345          - arch: x64
346            vcarch: amd64
347            warch: x64
348            bits: 64
349            msystem: MINGW64
350            cygreg: registry
351            pyreg: ""
352          - arch: x86
353            vcarch: x86
354            warch: ia32
355            bits: 32
356            msystem: MINGW32
357            cygreg: registry32
358            pyreg: "-32"
359        exclude:
360          - toolchain: msvc
361            arch: x64
362            features: NORMAL
363          - toolchain: mingw
364            arch: x86
365            features: NORMAL
366
367    steps:
368      - name: Initalize
369        id: init
370        shell: bash
371        run: |
372          git config --global core.autocrlf input
373          python_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON_VER_DOT}/InstallPath/@")
374          python3_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON3_VER_DOT}${{ matrix.pyreg }}/InstallPath/@")
375          echo "PYTHON_DIR=$python_dir" >> $GITHUB_ENV
376          echo "PYTHON3_DIR=$python3_dir" >> $GITHUB_ENV
377
378      - uses: msys2/setup-msys2@v2
379        if: matrix.toolchain == 'mingw'
380        with:
381          msystem: ${{ matrix.msystem }}
382          release: false
383
384      - uses: actions/checkout@v2
385
386      - name: Create a list of download URLs
387        shell: cmd
388        run: |
389          type NUL > urls.txt
390          echo %LUA_RELEASE%>> urls.txt
391          echo %WINPTY_URL%>> urls.txt
392
393      - name: Cache downloaded files
394        uses: actions/cache@v2
395        with:
396          path: downloads
397          key: ${{ runner.os }}-${{ matrix.bits }}-${{ hashFiles('urls.txt') }}
398
399      - name: Download dependencies
400        shell: cmd
401        run: |
402          path C:\Program Files\7-Zip;%path%
403          if not exist downloads mkdir downloads
404
405          echo %COL_GREEN%Download Lua%COL_RESET%
406          call :downloadfile %LUA${{ matrix.bits }}_URL% downloads\lua.zip
407          7z x downloads\lua.zip -o%LUA_DIR% > nul || exit 1
408
409          echo %COL_GREEN%Download winpty%COL_RESET%
410          call :downloadfile %WINPTY_URL% downloads\winpty.zip
411          7z x -y downloads\winpty.zip -oD:\winpty > nul || exit 1
412          copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty.dll        src\winpty${{ matrix.bits }}.dll
413          copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty-agent.exe  src\
414
415          goto :eof
416
417          :downloadfile
418          :: call :downloadfile <URL> <localfile>
419          if not exist %2 (
420            curl -f -L %1 -o %2
421          )
422          if ERRORLEVEL 1 (
423            rem Retry once.
424            curl -f -L %1 -o %2 || exit 1
425          )
426          goto :eof
427
428      - name: Copy src directory to src2
429        shell: cmd
430        run: |
431          xcopy src src2\ /E > nul
432
433      - name: Build (MSVC)
434        if: matrix.toolchain == 'msvc'
435        shell: cmd
436        run: |
437          call "%VCVARSALL%" ${{ matrix.vcarch }}
438          cd src
439          :: Filter out the progress bar from the build log
440          sed -e "s/@<<$/@<< | sed -e 's#.*\\\\r.*##'/" Make_mvc.mak > Make_mvc2.mak
441          if "${{ matrix.features }}"=="HUGE" (
442            nmake -nologo -f Make_mvc2.mak ^
443              FEATURES=${{ matrix.features }} ^
444              GUI=yes IME=yes ICONV=yes VIMDLL=yes ^
445              DYNAMIC_LUA=yes LUA=%LUA_DIR% ^
446              DYNAMIC_PYTHON=yes PYTHON=%PYTHON_DIR% ^
447              DYNAMIC_PYTHON3=yes PYTHON3=%PYTHON3_DIR%
448          ) else (
449            nmake -nologo -f Make_mvc2.mak ^
450              FEATURES=${{ matrix.features }} ^
451              GUI=yes IME=yes ICONV=yes VIMDLL=yes
452          )
453          if not exist vim${{ matrix.bits }}.dll (
454            echo %COL_RED%Build failure.%COL_RESET%
455            exit 1
456          )
457
458      - name: Build (MinGW)
459        if: matrix.toolchain == 'mingw'
460        shell: msys2 {0}
461        run: |
462          cd src
463          if [ "${{ matrix.features }}" = "HUGE" ]; then
464            mingw32-make -f Make_ming.mak -j2 \
465              FEATURES=${{ matrix.features }} \
466              GUI=yes IME=yes ICONV=yes VIMDLL=yes \
467              DYNAMIC_LUA=yes LUA=${LUA_DIR} \
468              DYNAMIC_PYTHON=yes PYTHON=${PYTHON_DIR} \
469              DYNAMIC_PYTHON3=yes PYTHON3=${PYTHON3_DIR} \
470              STATIC_STDCPLUS=yes
471          else
472            mingw32-make -f Make_ming.mak -j2 \
473              FEATURES=${{ matrix.features }} \
474              GUI=yes IME=yes ICONV=yes VIMDLL=yes \
475              STATIC_STDCPLUS=yes
476          fi
477
478      #- name: Prepare Artifact
479      #  shell: cmd
480      #  run: |
481      #    mkdir artifacts
482      #    copy src\*vim.exe artifacts
483      #    copy src\vim*.dll artifacts
484      #
485      #- name: Upload Artifact
486      #  uses: actions/upload-artifact@v1
487      #  with:
488      #    name: vim${{ matrix.bits }}-${{ matrix.toolchain }}
489      #    path: ./artifacts
490
491      - name: Test
492        shell: cmd
493        timeout-minutes: 20
494        run: |
495          PATH %LUA_DIR%;C:\msys64\${{ matrix.msystem }}\bin;%PATH%;%PYTHON3_DIR%
496          call "%VCVARSALL%" ${{ matrix.vcarch }}
497          cd src
498          echo.
499          echo %COL_GREEN%vim version:%COL_RESET%
500          .\vim --version || exit 1
501
502          echo %COL_GREEN%Start testing vim in background.%COL_RESET%
503          start cmd /c "cd ..\src2\testdir & nmake -nologo -f Make_dos.mak VIMPROG=..\..\src\vim > nul & echo done>done.txt"
504
505          echo %COL_GREEN%Test gvim:%COL_RESET%
506          cd testdir
507          nmake -nologo -f Make_dos.mak VIMPROG=..\gvim || exit 1
508          cd ..
509
510          echo %COL_GREEN%Wait for vim tests to finish.%COL_RESET%
511          cd ..\src2\testdir
512          :: Wait about 10 minutes.
513          for /L %%i in (1,1,60) do (
514            if exist done.txt goto exitloop
515            timeout 10 > NUL 2>&1
516            if ERRORLEVEL 1 ping -n 11 localhost > NUL
517          )
518          set timeout=1
519          :exitloop
520
521          echo %COL_GREEN%Test results of vim:%COL_RESET%
522          if exist messages type messages
523          nmake -nologo -f Make_dos.mak report VIMPROG=..\..\src\vim || exit 1
524          if "%timeout%"=="1" (
525            echo %COL_RED%Timed out.%COL_RESET%
526            exit 1
527          )
528