From 5e27da5a1c4f1e6582cfe5b8ce8be9b476e4cbfd Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Wed, 28 Oct 2020 00:03:02 +0200 Subject: [PATCH] ci: add an msvc 2017 test Tests disabled for now, till some quirks are worked out. Thi should be good enough to at least not break the build though. Part-of: --- .gitlab-ci.yml | 89 +++++++++++++++++++++++++++++++ ci/windows-docker/Dockerfile | 18 +++++++ ci/windows-docker/container.ps1 | 60 +++++++++++++++++++++ ci/windows-docker/install_gst.ps1 | 61 +++++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 ci/windows-docker/Dockerfile create mode 100644 ci/windows-docker/container.ps1 create mode 100644 ci/windows-docker/install_gst.ps1 diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 639208a80..30af5e21a 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -38,6 +38,13 @@ workflow: variables: FDO_UPSTREAM_REPO: gstreamer/gstreamer-rs + + # DIY CI-templates like setup for windows + WINDOWS_RUST_MINIMUM_IMAGE: "$CI_REGISTRY_IMAGE/windows:$GST_RS_IMG_TAG-main-$GST_RS_MSRV" + WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/windows:$GST_RS_IMG_TAG-main-$GST_RS_MSRV" + WINDOWS_RUST_STABLE_IMAGE: "$CI_REGISTRY_IMAGE/windows:$GST_RS_IMG_TAG-main-$GST_RS_STABLE" + WINDOWS_RUST_STABLE_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/windows:$GST_RS_IMG_TAG-main-$GST_RS_STABLE" + RUST_DOCS_FLAGS: "--extern-html-root-url=muldiv=https://docs.rs/muldiv/1.0.0/muldiv/ -Z unstable-options" NAMESPACE: gstreamer # format is = @@ -497,3 +504,85 @@ pages: rules: - if: ($CI_DEFAULT_BRANCH == $CI_COMMIT_BRANCH) && ($CI_PROJECT_NAMESPACE == $NAMESPACE) when: 'manual' + + +.windows rust docker build: + stage: 'container-final' + variables: + # Unlike the buildah/linux jobs, this file + # needs to be relative to windows-docker/ subdir + # as it makes life easier in the powershell script + # + # We also don't need a CONTEXT_DIR var as its also + # hardcoded to be windows-docker/ + DOCKERFILE: 'ci/windows-docker/Dockerfile' + GST_UPSTREAM_BRANCH: 'main' + tags: + - 'windows' + - 'shell' + - '2022' + script: + # We need to pass an array and to resolve the env vars, so we can't use a variable: + - $DOCKER_BUILD_ARGS = @("--build-arg", "DEFAULT_BRANCH=$GST_UPSTREAM_BRANCH", "--build-arg", "RUST_VERSION=$RUST_VERSION") + + - "& ci/windows-docker/container.ps1 $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $RUST_IMAGE $RUST_UPSTREAM_IMAGE $DOCKERFILE" + - | + if (!($?)) { + echo "Failed to build the image" + Exit 1 + } + +windows rust docker stable: + extends: '.windows rust docker build' + variables: + RUST_IMAGE: !reference [variables, "WINDOWS_RUST_STABLE_IMAGE"] + RUST_UPSTREAM_IMAGE: !reference [variables, "WINDOWS_RUST_STABLE_UPSTREAM_IMAGE"] + RUST_VERSION: !reference [variables, "GST_RS_STABLE"] + +windows rust docker msrv: + extends: '.windows rust docker build' + variables: + RUST_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_IMAGE"] + RUST_UPSTREAM_IMAGE: !reference [variables, "WINDOWS_RUST_MINIMUM_UPSTREAM_IMAGE"] + RUST_VERSION: !reference [variables, "GST_RS_MSRV"] + +.msvc2019 build: + stage: 'test' + tags: + - 'docker' + - 'windows' + - '2022' + script: + - $env:Path += ';C:\bin\' + + - cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=amd64 && + cargo build --all && + cargo build --tests --all" + - | + if (!$?) { + Write-Host "Failed to build!" + Exit 1 + } + + - cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=amd64 && + cargo test --workspace --no-fail-fast -- --skip 'cross_validate_constants_with_c' --skip 'cross_validate_layout_with_c'" + + - | + if (!$?) { + Write-Host "Tests Failed!" + Exit 1 + } + +test windows msrv: + image: $WINDOWS_RUST_MINIMUM_IMAGE + needs: + - job: 'windows rust docker msrv' + artifacts: false + extends: '.msvc2019 build' + +test windows stable: + needs: + - job: 'windows rust docker stable' + artifacts: false + image: "$WINDOWS_RUST_STABLE_IMAGE" + extends: '.msvc2019 build' diff --git a/ci/windows-docker/Dockerfile b/ci/windows-docker/Dockerfile new file mode 100644 index 000000000..2a57f6288 --- /dev/null +++ b/ci/windows-docker/Dockerfile @@ -0,0 +1,18 @@ +# escape=` + +FROM "registry.freedesktop.org/gstreamer/gstreamer/amd64/windows:2022-05-16.1-main" + +# Make sure any failure in PowerShell is fatal +ENV ErrorActionPreference='Stop' +SHELL ["powershell","-NoLogo", "-NonInteractive", "-Command"] + +ARG DEFAULT_BRANCH="main" +ARG RUST_VERSION="invalid" + +COPY install_gst.ps1 C:\ +RUN C:\install_gst.ps1 +RUN choco install -y pkgconfiglite +ENV PKG_CONFIG_PATH="C:/lib/pkgconfig" + +RUN Invoke-WebRequest -Uri https://win.rustup.rs/x86_64 -OutFile C:\rustup-init.exe +RUN C:\rustup-init.exe -y --profile minimal --default-toolchain $env:RUST_VERSION diff --git a/ci/windows-docker/container.ps1 b/ci/windows-docker/container.ps1 new file mode 100644 index 000000000..28fa2d61b --- /dev/null +++ b/ci/windows-docker/container.ps1 @@ -0,0 +1,60 @@ +# Copied from mesa, big kudos +# +# https://gitlab.freedesktop.org/mesa/mesa/-/blob/master/.gitlab-ci/windows/mesa_container.ps1 +# https://gitlab.freedesktop.org/mesa/mesa/-/blob/34e3e164936d1d3cef267da7780e87f062fedf39/.gitlab-ci/windows/mesa_container.ps1 + +# Implements the equivalent of ci-templates container-ifnot-exists, using +# Docker directly as we don't have buildah/podman/skopeo available under +# Windows, nor can we execute Docker-in-Docker +$registry_uri = $args[0] +$registry_username = $args[1] +$registry_password = $args[2] +$registry_user_image = $args[3] +$registry_central_image = $args[4] +$dockerfile = $args[5] + +docker --config "windows-docker.conf" login -u "$registry_username" -p "$registry_password" "$registry_uri" +if (!$?) { + Write-Host "docker login failed to $registry_uri" + Exit 1 +} + +# if the image already exists, don't rebuild it +docker --config "windows-docker.conf" pull "$registry_user_image" +if ($?) { + Write-Host "User image $registry_user_image already exists; not rebuilding" + docker --config "windows-docker.conf" logout "$registry_uri" + Exit 0 +} + +# if the image already exists upstream, copy it +docker --config "windows-docker.conf" pull "$registry_central_image" +if ($?) { + Write-Host "Copying central image $registry_central_image to user image $registry_user_image" + docker --config "windows-docker.conf" tag "$registry_central_image" "$registry_user_image" + docker --config "windows-docker.conf" push "$registry_user_image" + $pushstatus = $? + docker --config "windows-docker.conf" logout "$registry_uri" + if (!$pushstatus) { + Write-Host "Pushing image to $registry_user_image failed" + Exit 1 + } + Exit 0 +} + +Write-Host "No image found at $registry_user_image or $registry_central_image; rebuilding" +docker --config "windows-docker.conf" build $DOCKER_BUILD_ARGS --no-cache -t "$registry_user_image" -f "$dockerfile" "./ci/windows-docker" +if (!$?) { + Write-Host "Container build failed" + docker --config "windows-docker.conf" logout "$registry_uri" + Exit 1 +} +Get-Date + +docker --config "windows-docker.conf" push "$registry_user_image" +$pushstatus = $? +docker --config "windows-docker.conf" logout "$registry_uri" +if (!$pushstatus) { + Write-Host "Pushing image to $registry_user_image failed" + Exit 1 +} diff --git a/ci/windows-docker/install_gst.ps1 b/ci/windows-docker/install_gst.ps1 new file mode 100644 index 000000000..63bc93486 --- /dev/null +++ b/ci/windows-docker/install_gst.ps1 @@ -0,0 +1,61 @@ +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; + +# Download gstreamer and all its subprojects +git clone -b $env:DEFAULT_BRANCH --depth 1 https://gitlab.freedesktop.org/gstreamer/gstreamer.git C:\gstreamer +if (!$?) { + Write-Host "Failed to clone gstreamer" + Exit 1 +} + +Set-Location C:\gstreamer + +# Copy the cache we already have in the image to avoid massive redownloads +Move-Item C:/subprojects/* C:\gstreamer\subprojects + +if (!$?) { + Write-Host "Failed to copy subprojects cache" + Exit 1 +} + +# Update the subprojects cache +Write-Output "Running meson subproject reset" +meson subprojects update --reset + +if (!$?) { + Write-Host "Failed to reset subprojects state" + Exit 1 +} + +$env:MESON_ARGS = "-Dglib:installed_tests=false " + + "-Dlibnice:tests=disabled " + + "-Dlibnice:examples=disabled " + + "-Dffmpeg:tests=disabled " + + "-Dopenh264:tests=disabled " + + "-Dpygobject:tests=false " + + "-Dugly=enabled " + + "-Dbad=enabled " + + "-Dges=enabled " + + "-Drtsp_server=enabled " + + "-Ddevtools=enabled " + + "-Dsharp=disabled " + + "-Dpython=disabled " + + "-Dlibav=disabled " + + "-Dvaapi=disabled " + + "-Dgst-plugins-base:pango=enabled " + + "-Dgst-plugins-good:cairo=enabled " + + "-Dgpl=enabled " + +Write-Output "Building gst" +cmd.exe /C "C:\BuildTools\Common7\Tools\VsDevCmd.bat -host_arch=amd64 -arch=amd64 && meson _build $env:MESON_ARGS && meson compile -C _build && ninja -C _build install" + +if (!$?) { + Write-Host "Failed to build and install gst" + Exit 1 +} + +cd C:\ +cmd /c rmdir /s /q C:\gstreamer +if (!$?) { + Write-Host "Failed to remove gst checkout" + Exit 1 +}