summaryrefslogtreecommitdiffstats
path: root/.github/workflows/ci.yml
diff options
context:
space:
mode:
Diffstat (limited to '.github/workflows/ci.yml')
-rw-r--r--.github/workflows/ci.yml526
1 files changed, 526 insertions, 0 deletions
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..adbbb1f
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,526 @@
+name: GitHub CI
+
+on:
+ push:
+ branches: ['**']
+ pull_request:
+
+jobs:
+ linux:
+ runs-on: ubuntu-latest
+
+ env:
+ CC: ${{ matrix.compiler }}
+ TEST: test
+ SRCDIR: ./src
+ LEAK_CFLAGS: -DEXITFREE
+ LOG_DIR: ${{ github.workspace }}/logs
+ TERM: xterm
+ DISPLAY: ':99'
+ DEBIAN_FRONTEND: noninteractive
+
+ strategy:
+ fail-fast: false
+ matrix:
+ features: [tiny, small, normal, huge]
+ compiler: [clang, gcc]
+ extra: [none]
+ include:
+ - features: tiny
+ compiler: clang
+ extra: nogui
+ - features: tiny
+ compiler: gcc
+ extra: nogui
+ - features: normal
+ shadow: ./src/shadow
+ - features: huge
+ coverage: true
+ - features: huge
+ compiler: gcc
+ coverage: true
+ extra: testgui
+ - features: huge
+ compiler: clang
+ extra: asan
+ - features: huge
+ compiler: gcc
+ coverage: true
+ extra: unittests
+ - features: normal
+ compiler: gcc
+ extra: vimtags
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Install packages
+ run: |
+ sudo apt-get install -y \
+ autoconf \
+ lcov \
+ gettext \
+ libcanberra-dev \
+ libperl-dev \
+ python-dev \
+ python3-dev \
+ liblua5.3-dev \
+ lua5.3 \
+ ruby-dev \
+ tcl-dev \
+ cscope \
+ libgtk2.0-dev \
+ desktop-file-utils \
+ libtool-bin
+
+ - name: Install clang-11
+ if: matrix.compiler == 'clang'
+ run: |
+ wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
+ . /etc/lsb-release
+ sudo add-apt-repository -y "deb http://apt.llvm.org/${DISTRIB_CODENAME}/ llvm-toolchain-${DISTRIB_CODENAME}-11 main"
+ sudo apt-get install -y clang-11
+ sudo update-alternatives --install /usr/bin/clang clang /usr/bin/clang-11 100
+ sudo update-alternatives --set clang /usr/bin/clang-11
+ sudo update-alternatives --install /usr/bin/llvm-cov llvm-cov /usr/bin/llvm-cov-11 100
+
+ - name: Set up environment
+ run: |
+ mkdir -p "${LOG_DIR}"
+ mkdir -p "${HOME}/bin"
+ echo "${HOME}/bin" >> $GITHUB_PATH
+ (
+ echo "LINUX_VERSION=$(uname -r)"
+ echo "NPROC=$(getconf _NPROCESSORS_ONLN)"
+ echo "SND_DUMMY_DIR=${HOME}/snd-dummy"
+ echo "TMPDIR=${{ runner.temp }}"
+
+ case "${{ matrix.features }}" in
+ tiny|small)
+ echo "TEST=testtiny"
+ if ${{ contains(matrix.extra, 'nogui') }}; then
+ echo "CONFOPT=--disable-gui"
+ fi
+ ;;
+ normal)
+ ;;
+ huge)
+ echo "TEST=scripttests test_libvterm"
+ echo "CONFOPT=--enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp"
+ ;;
+ esac
+
+ if ${{ matrix.coverage == true }}; then
+ echo "CFLAGS=--coverage -DUSE_GCOV_FLUSH"
+ echo "LDFLAGS=--coverage"
+ fi
+ if ${{ contains(matrix.extra, 'testgui') }}; then
+ echo "TEST=-C src testgui"
+ fi
+ if ${{ contains(matrix.extra, 'unittests') }}; then
+ echo "TEST=unittests"
+ fi
+ if ${{ contains(matrix.extra, 'asan') }}; then
+ echo "SANITIZER_CFLAGS=-g -O1 -DABORT_ON_INTERNAL_ERROR -DEXITFREE -fsanitize-recover=all -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer"
+ echo "ASAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/asan"
+ echo "UBSAN_OPTIONS=print_stacktrace=1 log_path=${LOG_DIR}/ubsan"
+ echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/src/testdir/lsan-suppress.txt"
+ fi
+ if ${{ contains(matrix.extra, 'vimtags') }}; then
+ echo "TEST=-C runtime/doc vimtags VIMEXE=../../${SRCDIR}/vim"
+ fi
+ ) >> $GITHUB_ENV
+
+ - name: Set up system
+ run: |
+ if [[ ${CC} = clang ]]; then
+ # Use llvm-cov instead of gcov when compiler is clang.
+ ln -fs /usr/bin/llvm-cov ${HOME}/bin/gcov
+ fi
+ # Setup lua5.3 manually since its package doesn't provide alternative.
+ # https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
+ if [[ ${CONFOPT} =~ luainterp ]]; then
+ sudo update-alternatives --install /usr/bin/lua lua /usr/bin/lua5.3 10
+ fi
+ sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0
+ sudo usermod -a -G audio "${USER}"
+ sudo bash ci/setup-xvfb.sh
+
+ - name: Cache snd-dummy
+ uses: actions/cache@v2
+ with:
+ path: ${{ env.SND_DUMMY_DIR }}
+ key: linux-${{ env.LINUX_VERSION }}-snd-dummy
+
+ - name: Set up snd-dummy
+ run: |
+ if [[ ! -e ${SND_DUMMY_DIR}/snd-dummy.ko ]]; then
+ bash ci/build-snd-dummy.sh
+ fi
+ cd "${SND_DUMMY_DIR}"
+ sudo insmod soundcore.ko
+ sudo insmod snd.ko
+ sudo insmod snd-pcm.ko
+ sudo insmod snd-dummy.ko
+
+ - name: Check autoconf
+ if: contains(matrix.extra, 'unittests')
+ run: |
+ make -C src autoconf
+
+ - name: Set up shadow dir
+ if: matrix.shadow
+ run: |
+ make -C src shadow
+ echo "SRCDIR=${{ matrix.shadow }}" >> $GITHUB_ENV
+ echo "SHADOWOPT=-C ${{ matrix.shadow }}" >> $GITHUB_ENV
+
+ - name: Configure
+ run: |
+ ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing
+ # Append various warning flags to CFLAGS.
+ sed -i -f ci/config.mk.sed ${SRCDIR}/auto/config.mk
+ sed -i -f ci/config.mk.${CC}.sed ${SRCDIR}/auto/config.mk
+
+ - name: Build
+ if: (!contains(matrix.extra, 'unittests'))
+ run: |
+ make ${SHADOWOPT} -j${NPROC}
+
+ - name: Check version
+ if: (!contains(matrix.extra, 'unittests'))
+ run: |
+ "${SRCDIR}"/vim --version
+ "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit
+ "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit
+
+ - name: Test
+ timeout-minutes: 20
+ run: |
+ do_test() { sg audio "sg $(id -gn) '$*'"; }
+ do_test make ${SHADOWOPT} ${TEST}
+
+ - name: Coveralls
+ if: matrix.coverage && success() && github.event_name != 'pull_request'
+ env:
+ COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
+ COVERALLS_PARALLEL: true
+ TRAVIS_JOB_ID: ${{ github.run_id }}
+ run: |
+ sudo apt-get install -y python3-setuptools python3-wheel
+ # needed for https support for coveralls building cffi only works with gcc, not with clang
+ CC=gcc pip3 install --user cpp-coveralls pyopenssl ndg-httpsclient pyasn1
+ ~/.local/bin/coveralls -b "${SRCDIR}" -x .xs -e "${SRCDIR}"/if_perl.c -e "${SRCDIR}"/xxd -e "${SRCDIR}"/libvterm --encodings utf-8
+
+ - name: Codecov
+ if: matrix.coverage && success()
+ run: |
+ cd "${SRCDIR}"
+ bash <(curl -s https://codecov.io/bash) -F "${{ matrix.features }}-${{ matrix.compiler }}-${{ matrix.extra }}"
+
+ - name: ASan logs
+ if: contains(matrix.extra, 'asan') && !cancelled()
+ run: |
+ for f in $(grep -lR '#[[:digit:]]* *0x[[:digit:]a-fA-F]*' "${LOG_DIR}"); do
+ asan_symbolize-11 -l "$f"
+ false # in order to fail a job
+ done
+
+ coveralls:
+ runs-on: ubuntu-latest
+
+ needs: linux
+ if: always() && github.event_name != 'pull_request'
+
+ steps:
+ - name: Parallel finished
+ env:
+ COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
+ run: |
+ curl -k "https://coveralls.io/webhook?repo_token=${COVERALLS_REPO_TOKEN}" -d "payload[build_num]=${GITHUB_RUN_ID}&payload[status]=done"
+
+ macos:
+ runs-on: macos-latest
+
+ env:
+ CC: ${{ matrix.compiler }}
+ TEST: test
+ SRCDIR: ./src
+ LEAK_CFLAGS: -DEXITFREE
+ TERM: xterm
+
+ strategy:
+ fail-fast: false
+ matrix:
+ features: [tiny, huge]
+ compiler: [clang, gcc]
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Install packages
+ env:
+ HOMEBREW_NO_AUTO_UPDATE: 1
+ run: |
+ brew install lua
+ echo "LUA_PREFIX=/usr/local" >> $GITHUB_ENV
+
+ - name: Set up environment
+ run: |
+ (
+ echo "NPROC=$(getconf _NPROCESSORS_ONLN)"
+ case "${{ matrix.features }}" in
+ tiny)
+ echo "TEST=testtiny"
+ echo "CONFOPT=--disable-gui"
+ ;;
+ huge)
+ echo "CONFOPT=--enable-perlinterp --enable-python3interp --enable-rubyinterp --enable-luainterp --enable-tclinterp"
+ ;;
+ esac
+ ) >> $GITHUB_ENV
+
+ - name: Configure
+ run: |
+ ./configure --with-features=${{ matrix.features }} ${CONFOPT} --enable-fail-if-missing
+ # Append various warning flags to CFLAGS.
+ # BSD sed needs backup extension specified.
+ sed -i.bak -f ci/config.mk.sed ${SRCDIR}/auto/config.mk
+ # On macOS, the entity of gcc is clang.
+ sed -i.bak -f ci/config.mk.clang.sed ${SRCDIR}/auto/config.mk
+
+ - name: Build
+ env:
+ LC_ALL: C
+ run: |
+ make -j${NPROC}
+
+ - name: Check version
+ run: |
+ "${SRCDIR}"/vim --version
+ "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-1.vim -c quit
+ "${SRCDIR}"/vim -u NONE -i NONE --not-a-term -esNX -V1 -S ci/if_ver-2.vim -c quit
+
+ - name: Test
+ timeout-minutes: 20
+ run: |
+ make ${TEST}
+
+ windows:
+ runs-on: windows-latest
+
+ env:
+ VCVARSALL: C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Auxiliary\Build\vcvarsall.bat
+ # Interfaces
+ # Lua
+ LUA_VER: 54
+ LUA_VER_DOT: '5.4'
+ LUA_RELEASE: 5.4.0
+ LUA32_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win32_dllw6_lib.zip
+ LUA64_URL: https://downloads.sourceforge.net/luabinaries/lua-%LUA_RELEASE%_Win64_dllw6_lib.zip
+ LUA_DIR: D:\Lua
+ # Python 2
+ PYTHON_VER: 27
+ PYTHON_VER_DOT: '2.7'
+ # Python 3
+ PYTHON3_VER: 38
+ PYTHON3_VER_DOT: '3.8'
+ # Other dependencies
+ # winpty
+ WINPTY_URL: https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip
+ # Escape sequences
+ COL_RED: "\x1b[31m"
+ COL_GREEN: "\x1b[32m"
+ COL_YELLOW: "\x1b[33m"
+ COL_RESET: "\x1b[m"
+
+ strategy:
+ fail-fast: false
+ matrix:
+ toolchain: [msvc, mingw]
+ arch: [x64, x86]
+ features: [HUGE, NORMAL]
+ include:
+ - arch: x64
+ vcarch: amd64
+ warch: x64
+ bits: 64
+ msystem: MINGW64
+ cygreg: registry
+ pyreg: ""
+ - arch: x86
+ vcarch: x86
+ warch: ia32
+ bits: 32
+ msystem: MINGW32
+ cygreg: registry32
+ pyreg: "-32"
+ exclude:
+ - toolchain: msvc
+ arch: x64
+ features: NORMAL
+ - toolchain: mingw
+ arch: x86
+ features: NORMAL
+
+ steps:
+ - name: Initalize
+ id: init
+ shell: bash
+ run: |
+ git config --global core.autocrlf input
+ python_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON_VER_DOT}/InstallPath/@")
+ python3_dir=$(cat "/proc/${{ matrix.cygreg }}/HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${PYTHON3_VER_DOT}${{ matrix.pyreg }}/InstallPath/@")
+ echo "PYTHON_DIR=$python_dir" >> $GITHUB_ENV
+ echo "PYTHON3_DIR=$python3_dir" >> $GITHUB_ENV
+
+ - uses: msys2/setup-msys2@v2
+ if: matrix.toolchain == 'mingw'
+ with:
+ msystem: ${{ matrix.msystem }}
+ release: false
+
+ - uses: actions/checkout@v2
+
+ - name: Create a list of download URLs
+ shell: cmd
+ run: |
+ type NUL > urls.txt
+ echo %LUA_RELEASE%>> urls.txt
+ echo %WINPTY_URL%>> urls.txt
+
+ - name: Cache downloaded files
+ uses: actions/cache@v2
+ with:
+ path: downloads
+ key: ${{ runner.os }}-${{ matrix.bits }}-${{ hashFiles('urls.txt') }}
+
+ - name: Download dependencies
+ shell: cmd
+ run: |
+ path C:\Program Files\7-Zip;%path%
+ if not exist downloads mkdir downloads
+
+ echo %COL_GREEN%Download Lua%COL_RESET%
+ call :downloadfile %LUA${{ matrix.bits }}_URL% downloads\lua.zip
+ 7z x downloads\lua.zip -o%LUA_DIR% > nul || exit 1
+
+ echo %COL_GREEN%Download winpty%COL_RESET%
+ call :downloadfile %WINPTY_URL% downloads\winpty.zip
+ 7z x -y downloads\winpty.zip -oD:\winpty > nul || exit 1
+ copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty.dll src\winpty${{ matrix.bits }}.dll
+ copy /Y D:\winpty\${{ matrix.warch }}\bin\winpty-agent.exe src\
+
+ goto :eof
+
+ :downloadfile
+ :: call :downloadfile <URL> <localfile>
+ if not exist %2 (
+ curl -f -L %1 -o %2
+ )
+ if ERRORLEVEL 1 (
+ rem Retry once.
+ curl -f -L %1 -o %2 || exit 1
+ )
+ goto :eof
+
+ - name: Copy src directory to src2
+ shell: cmd
+ run: |
+ xcopy src src2\ /E > nul
+
+ - name: Build (MSVC)
+ if: matrix.toolchain == 'msvc'
+ shell: cmd
+ run: |
+ call "%VCVARSALL%" ${{ matrix.vcarch }}
+ cd src
+ :: Filter out the progress bar from the build log
+ sed -e "s/@<<$/@<< | sed -e 's#.*\\\\r.*##'/" Make_mvc.mak > Make_mvc2.mak
+ if "${{ matrix.features }}"=="HUGE" (
+ nmake -nologo -f Make_mvc2.mak ^
+ FEATURES=${{ matrix.features }} ^
+ GUI=yes IME=yes ICONV=yes VIMDLL=yes ^
+ DYNAMIC_LUA=yes LUA=%LUA_DIR% ^
+ DYNAMIC_PYTHON=yes PYTHON=%PYTHON_DIR% ^
+ DYNAMIC_PYTHON3=yes PYTHON3=%PYTHON3_DIR%
+ ) else (
+ nmake -nologo -f Make_mvc2.mak ^
+ FEATURES=${{ matrix.features }} ^
+ GUI=yes IME=yes ICONV=yes VIMDLL=yes
+ )
+ if not exist vim${{ matrix.bits }}.dll (
+ echo %COL_RED%Build failure.%COL_RESET%
+ exit 1
+ )
+
+ - name: Build (MinGW)
+ if: matrix.toolchain == 'mingw'
+ shell: msys2 {0}
+ run: |
+ cd src
+ if [ "${{ matrix.features }}" = "HUGE" ]; then
+ mingw32-make -f Make_ming.mak -j2 \
+ FEATURES=${{ matrix.features }} \
+ GUI=yes IME=yes ICONV=yes VIMDLL=yes \
+ DYNAMIC_LUA=yes LUA=${LUA_DIR} \
+ DYNAMIC_PYTHON=yes PYTHON=${PYTHON_DIR} \
+ DYNAMIC_PYTHON3=yes PYTHON3=${PYTHON3_DIR} \
+ STATIC_STDCPLUS=yes
+ else
+ mingw32-make -f Make_ming.mak -j2 \
+ FEATURES=${{ matrix.features }} \
+ GUI=yes IME=yes ICONV=yes VIMDLL=yes \
+ STATIC_STDCPLUS=yes
+ fi
+
+ #- name: Prepare Artifact
+ # shell: cmd
+ # run: |
+ # mkdir artifacts
+ # copy src\*vim.exe artifacts
+ # copy src\vim*.dll artifacts
+ #
+ #- name: Upload Artifact
+ # uses: actions/upload-artifact@v1
+ # with:
+ # name: vim${{ matrix.bits }}-${{ matrix.toolchain }}
+ # path: ./artifacts
+
+ - name: Test
+ shell: cmd
+ timeout-minutes: 20
+ run: |
+ PATH %LUA_DIR%;C:\msys64\${{ matrix.msystem }}\bin;%PATH%;%PYTHON3_DIR%
+ call "%VCVARSALL%" ${{ matrix.vcarch }}
+ cd src
+ echo.
+ echo %COL_GREEN%vim version:%COL_RESET%
+ .\vim --version || exit 1
+
+ echo %COL_GREEN%Start testing vim in background.%COL_RESET%
+ start cmd /c "cd ..\src2\testdir & nmake -nologo -f Make_dos.mak VIMPROG=..\..\src\vim > nul & echo done>done.txt"
+
+ echo %COL_GREEN%Test gvim:%COL_RESET%
+ cd testdir
+ nmake -nologo -f Make_dos.mak VIMPROG=..\gvim || exit 1
+ cd ..
+
+ echo %COL_GREEN%Wait for vim tests to finish.%COL_RESET%
+ cd ..\src2\testdir
+ :: Wait about 10 minutes.
+ for /L %%i in (1,1,60) do (
+ if exist done.txt goto exitloop
+ timeout 10 > NUL 2>&1
+ if ERRORLEVEL 1 ping -n 11 localhost > NUL
+ )
+ set timeout=1
+ :exitloop
+
+ echo %COL_GREEN%Test results of vim:%COL_RESET%
+ if exist messages type messages
+ nmake -nologo -f Make_dos.mak report VIMPROG=..\..\src\vim || exit 1
+ if "%timeout%"=="1" (
+ echo %COL_RED%Timed out.%COL_RESET%
+ exit 1
+ )