diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 00000000000..ecef7aa3b50 --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,12 @@ +# main Gitlab CI script + +stages: + - image + - build + - test + - deploy + +include: + - local: "/tools/gitlab/image.yml" + - local: "/tools/gitlab/build.yml" + - local: "/tools/gitlab/release.yml" diff --git a/tools/gitlab/build-linux b/tools/gitlab/build-linux new file mode 100755 index 00000000000..659ff0a0c17 --- /dev/null +++ b/tools/gitlab/build-linux @@ -0,0 +1,28 @@ +#!/bin/bash + +echo "Building $(git log -1)" +echo "---" + +set -Eeuxo pipefail + +./tools/make_requests +./tools/make_makefiles +autoreconf + +cd build64 +../configure -q -C --enable-win64 --enable-werror --with-mingw +make -s -j$(nproc) +cd .. + +cd build32 +../configure -q -C --enable-werror --with-mingw +make -s -j$(nproc) +cd .. + +if ! test -s .git/rebase-merge/git-rebase-todo +then + make -s -j$(nproc) -C build32 install-lib install-test DESTDIR=$BASEDIR + make -s -j$(nproc) -C build64 install-lib install-test DESTDIR=$BASEDIR +fi + +git reset --hard diff --git a/tools/gitlab/build-mac b/tools/gitlab/build-mac new file mode 100755 index 00000000000..701366277fc --- /dev/null +++ b/tools/gitlab/build-mac @@ -0,0 +1,17 @@ +#!/bin/bash + +echo "Building $(git log -1)" +echo "---" + +set -Eeuxo pipefail + +./tools/make_requests +./tools/make_makefiles +autoreconf + +cd build64 +../configure -C --enable-win64 --with-mingw BISON=/usr/local/opt/bison/bin/bison +make -s -j8 +cd .. + +git reset --hard diff --git a/tools/gitlab/build.yml b/tools/gitlab/build.yml new file mode 100644 index 00000000000..3cdc731467a --- /dev/null +++ b/tools/gitlab/build.yml @@ -0,0 +1,80 @@ +# CI script for building Wine + +.wine-build: + stage: build + image: $CI_REGISTRY/wine/wine:debian-bullseye + interruptible: true + variables: + GIT_DEPTH: 0 + cache: + - paths: + - ccache/ + - key: + files: + - configure.ac + paths: + - build32/config.cache + - build64/config.cache + before_script: + - export BASEDIR="$PWD" + - export CCACHE_BASEDIR="$BASEDIR" + - export CCACHE_DIR="$BASEDIR/ccache" + - export CCACHE_COMPILERCHECK=content + - export PATH="/usr/lib/ccache:$PATH" + - mkdir -p build32 build64 + - rm -fr .git/rebase-merge # in case a previous CI run failed in git rebase + +build-linux: + extends: .wine-build + rules: + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + artifacts: + expire_in: 1 day + paths: + - usr/local/ + script: + - ./tools/gitlab/build-linux + +build-mac: + extends: .wine-build + rules: + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + tags: + - mac + artifacts: + when: on_failure + paths: + - build64/config.log + - build32/config.log + script: + - export PATH="/usr/local/opt/ccache/libexec:$PATH" + - ./tools/gitlab/build-mac + +build-daily-linux: + extends: .wine-build + rules: + - if: $CI_PIPELINE_SOURCE == 'trigger' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + artifacts: + expire_in: 1 day + paths: + - usr/local/ + script: + - ./tools/gitlab/build-linux + +build-winetest: + stage: build + image: $CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX/debian:bullseye + rules: + - if: $CI_PIPELINE_SOURCE == 'trigger' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + needs: + - job: build-daily-linux + variables: + GIT_STRATEGY: none + artifacts: + name: winetest + paths: + - winetest.exe + - winetest64.exe + script: + - mv usr/local/lib/wine/i386-windows/winetest.exe winetest.exe + - mv usr/local/lib/wine/x86_64-windows/winetest.exe winetest64.exe diff --git a/tools/gitlab/image.docker b/tools/gitlab/image.docker new file mode 100644 index 00000000000..0d23a75483b --- /dev/null +++ b/tools/gitlab/image.docker @@ -0,0 +1,62 @@ +# FROM line will be added dynamically + +WORKDIR /tmp + +RUN export DEBIAN_FRONTEND=noninteractive; \ + echo 'path-exclude=/usr/share/doc/*' > /etc/dpkg/dpkg.cfg.d/99-exclude-cruft && \ + echo 'path-exclude=/usr/share/locale/*' >> /etc/dpkg/dpkg.cfg.d/99-exclude-cruft && \ + echo 'path-exclude=/usr/share/man/*' >> /etc/dpkg/dpkg.cfg.d/99-exclude-cruft && \ + echo 'APT::Install-Recommends "false";' > /etc/apt/apt.conf && \ + echo '#!/bin/sh' > /usr/sbin/policy-rc.d && \ + echo 'exit 101' >> /usr/sbin/policy-rc.d && \ + chmod +x /usr/sbin/policy-rc.d && \ + dpkg --add-architecture i386 && \ + apt-get update && \ + apt-get install -y gcc gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 gcc-multilib \ + git autoconf flex bison perl gettext \ + libasound2-dev:amd64 libasound2-dev:i386 \ + libcapi20-dev:amd64 libcapi20-dev:i386 \ + libcups2-dev:amd64 libcups2-dev:i386 \ + libdbus-1-dev:amd64 libdbus-1-dev:i386 \ + libfontconfig-dev:amd64 libfontconfig-dev:i386 \ + libfreetype-dev:amd64 libfreetype-dev:i386 \ + libgl1-mesa-dev:amd64 libgl1-mesa-dev:i386 \ + libgnutls28-dev:amd64 libgnutls28-dev:i386 \ + libgphoto2-dev:amd64 libgphoto2-dev:i386 \ + libgstreamer-plugins-base1.0-dev:amd64 libgstreamer-plugins-base1.0-dev:i386 \ + libice-dev:amd64 libice-dev:i386 \ + libkrb5-dev:amd64 libkrb5-dev:i386 \ + libldap-dev:amd64 libldap-dev:i386 \ + libopenal-dev:amd64 libopenal-dev:i386 \ + libosmesa6-dev:amd64 libosmesa6-dev:i386 \ + libpcap-dev:amd64 libpcap-dev:i386 \ + libpulse-dev:amd64 libpulse-dev:i386 \ + libsane-dev:amd64 libsane-dev:i386 \ + libsdl2-dev:amd64 libsdl2-dev:i386 \ + libudev-dev:amd64 libudev-dev:i386 \ + libusb-1.0-0-dev:amd64 libusb-1.0-0-dev:i386 \ + libv4l-dev:amd64 libv4l-dev:i386 \ + libvulkan-dev:amd64 libvulkan-dev:i386 \ + libx11-dev:amd64 libx11-dev:i386 \ + libxcomposite-dev:amd64 libxcomposite-dev:i386 \ + libxcursor-dev:amd64 libxcursor-dev:i386 \ + libxext-dev:amd64 libxext-dev:i386 \ + libxi-dev:amd64 libxi-dev:i386 \ + libxinerama-dev:amd64 libxinerama-dev:i386 \ + libxrandr-dev:amd64 libxrandr-dev:i386 \ + libxrender-dev:amd64 libxrender-dev:i386 \ + libxxf86vm-dev:amd64 libxxf86vm-dev:i386 \ + linux-libc-dev:amd64 linux-libc-dev:i386 \ + ocl-icd-opencl-dev:amd64 ocl-icd-opencl-dev:i386 \ + samba-dev:amd64 \ + unixodbc-dev:amd64 unixodbc-dev:i386 \ + x11proto-dev && \ + apt-get install -y ccache netbase curl ca-certificates xserver-xorg-video-dummy xserver-xorg xfonts-base xinit fvwm \ + winbind fonts-liberation2 fonts-noto-core fonts-noto-cjk pulseaudio libasound2-plugins:amd64 libasound2-plugins:i386 \ + libmjpegutils-2.1-0:amd64 libmjpegutils-2.1-0:i386 gstreamer1.0-libav:amd64 gstreamer1.0-libav:i386 \ + gstreamer1.0-plugins-base:amd64 gstreamer1.0-plugins-good:amd64 gstreamer1.0-plugins-bad:amd64 gstreamer1.0-plugins-ugly:amd64 \ + gstreamer1.0-plugins-base:i386 gstreamer1.0-plugins-good:i386 gstreamer1.0-plugins-bad:i386 gstreamer1.0-plugins-ugly:i386 && \ + apt-get clean && \ + useradd -m gitlab + +USER gitlab diff --git a/tools/gitlab/image.yml b/tools/gitlab/image.yml new file mode 100644 index 00000000000..7a866553dc2 --- /dev/null +++ b/tools/gitlab/image.yml @@ -0,0 +1,21 @@ +# CI script for creating the docker image used for Wine builds + +build-image: + stage: image + rules: + - if: $CI_PIPELINE_SOURCE == 'push' && $CI_PROJECT_PATH == "wine/wine" && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + changes: + - tools/gitlab/image.yml + - tools/gitlab/image.docker + image: + name: gcr.io/kaniko-project/executor:debug + entrypoint: [""] + variables: + IMAGE_SOURCE: "$CI_DEPENDENCY_PROXY_DIRECT_GROUP_IMAGE_PREFIX/debian:bullseye" + IMAGE_LOCAL: "$CI_REGISTRY_IMAGE:debian-bullseye" + DOCKER_FILE: "$CI_PROJECT_DIR/tools/gitlab/image.docker" + script: + - mkdir -p /kaniko/.docker + - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(printf "%s:%s" "$CI_REGISTRY_USER" "$CI_REGISTRY_PASSWORD" | base64 | tr -d '\n')\"},\"$CI_DEPENDENCY_PROXY_SERVER\":{\"auth\":\"$(printf "%s:%s" "$CI_DEPENDENCY_PROXY_USER" "$CI_DEPENDENCY_PROXY_PASSWORD" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json + - sed -i "1iFROM $IMAGE_SOURCE" "$DOCKER_FILE" + - /kaniko/executor --context "$CI_PROJECT_DIR" --dockerfile "$DOCKER_FILE" --destination "$IMAGE_LOCAL" diff --git a/tools/gitlab/release.yml b/tools/gitlab/release.yml new file mode 100644 index 00000000000..9a09e654513 --- /dev/null +++ b/tools/gitlab/release.yml @@ -0,0 +1,22 @@ +# CI script for creating releases + +create-release: + stage: deploy + image: registry.gitlab.com/gitlab-org/release-cli:latest + rules: + - if: $CI_COMMIT_TAG && $CI_PROJECT_PATH == "wine/wine" + script: + - VERSION=$(expr "$CI_COMMIT_TAG" ":" 'wine-\(.*\)') + - URL=$(grep -o "https://dl.winehq.org/.*" ANNOUNCE) + - FILEPATH=$(expr "$URL" ":" '.*\(/.*\)') + - | + sed -e '/^The source/,/^----------/d + /^----------/,$d + /^Bugs fixed/i-------- + s/^\*\*\*/###/' ANNOUNCE >announce.md + - release-cli create + --name "Wine $VERSION" + --tag-name "$CI_COMMIT_TAG" + --released-at "$CI_COMMIT_TIMESTAMP" + --description announce.md + --assets-link "{\"name\":\"Source code\",\"url\":\"$URL\",\"link_type\":\"other\",\"filepath\":\"$FILEPATH\"}" diff --git a/tools/gitlab/test.yml b/tools/gitlab/test.yml new file mode 100644 index 00000000000..d59a70c8892 --- /dev/null +++ b/tools/gitlab/test.yml @@ -0,0 +1,73 @@ +# CI script for testing Wine + +.wine-test: + stage: test + image: $CI_REGISTRY/wine/wine:debian-bullseye + interruptible: true + variables: + GIT_STRATEGY: none + GECKO_VER: 2.47.2 + MONO_VER: 7.0.0 + cache: + - key: wine-gecko-$GECKO_VER + paths: + - wine-gecko-$GECKO_VER-x86.msi + - wine-gecko-$GECKO_VER-x86_64.msi + - key: wine-mono-$MONO_VER + paths: + - wine-mono-$MONO_VER-x86.msi + before_script: + - export BASEDIR=$PWD + - export PATH=$BASEDIR/usr/local/bin:$PATH + - export DISPLAY=:0 + - export LC_ALL=C.UTF-8 + - export WINEDEBUG=err-all,fixme-all + - | + cat >$HOME/xorg.conf << EOF + Section "Device" + Identifier "dummy" + Driver "dummy" + VideoRam 32768 + EndSection + EOF + - echo 'exec /usr/bin/fvwm -f config -c "Style * MwmDecor" 2>/dev/null' >$HOME/.xinitrc + - startx -- -config $HOME/xorg.conf $DISPLAY & + - test -f wine-gecko-$GECKO_VER-x86.msi || curl -o wine-gecko-$GECKO_VER-x86.msi https://dl.winehq.org/wine/wine-gecko/$GECKO_VER/wine-gecko-$GECKO_VER-x86.msi + - test -f wine-gecko-$GECKO_VER-x86_64.msi || curl -o wine-gecko-$GECKO_VER-x86_64.msi https://dl.winehq.org/wine/wine-gecko/$GECKO_VER/wine-gecko-$GECKO_VER-x86_64.msi + - test -f wine-mono-$MONO_VER-x86.msi || curl -o wine-mono-$MONO_VER-x86.msi https://dl.winehq.org/wine/wine-mono/$MONO_VER/wine-mono-$MONO_VER-x86.msi + - mkdir -p $HOME/Documents $HOME/Desktop usr/local/share/wine/gecko usr/local/share/wine/mono + - ln -sf $BASEDIR/wine-gecko-$GECKO_VER-x86.msi $BASEDIR/wine-gecko-$GECKO_VER-x86_64.msi usr/local/share/wine/gecko + - ln -sf $BASEDIR/wine-mono-$MONO_VER-x86.msi usr/local/share/wine/mono + - pulseaudio --start --exit-idle-time=-1 + - wine wineboot.exe -u + - wineserver -w + +test-linux-32: + extends: .wine-test + variables: + EXCLUDE_TESTS: "d3d10core:d3d10core d3d11:d3d11 d3d8:device d3d8:visual d3d9:d3d9ex d3d9:device d3d9:visual" + rules: + - if: $CI_PIPELINE_SOURCE == 'merge_request_event' + needs: + - job: build-linux + script: + - export WINETEST_COLOR=1 + - wine usr/local/lib/wine/i386-windows/winetest.exe -q -q -o - -t gitlab -u $CI_JOB_URL -n $EXCLUDE_TESTS + +debian-32: + extends: .wine-test + rules: + - if: $CI_PIPELINE_SOURCE == 'trigger' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + needs: + - job: build-daily-linux + script: + - wine usr/local/lib/wine/i386-windows/winetest.exe -q -t gitlab-$CI_JOB_NAME -u $CI_JOB_URL + +debian-64: + extends: .wine-test + rules: + - if: $CI_PIPELINE_SOURCE == 'trigger' && $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH + needs: + - job: build-daily-linux + script: + - wine usr/local/lib/wine/x86_64-windows/winetest.exe -q -t gitlab-$CI_JOB_NAME -u $CI_JOB_URL