mirror of
https://gitlab.freedesktop.org/dbus/dbus.git
synced 2026-05-14 12:08:08 +02:00
gitlab-ci: build a Windows docker image, with VS15 & msys
Based on GStreamer & Mesa freedesktop gitlab CI, use the Windows 1809 runner provided by the GStreamer Foundation. https://www.freedesktop.org/wiki/Infrastructure/ Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
parent
f8067a07c3
commit
98c903656d
4 changed files with 180 additions and 0 deletions
|
|
@ -23,6 +23,7 @@
|
|||
image: debian:buster-slim
|
||||
|
||||
stages:
|
||||
- 'build docker'
|
||||
- build
|
||||
|
||||
variables:
|
||||
|
|
@ -32,6 +33,42 @@ variables:
|
|||
ci_sudo: "yes"
|
||||
ci_distro: "debian"
|
||||
ci_suite: "buster"
|
||||
###
|
||||
# IMPORTANT
|
||||
# These are the version tags for the docker images the CI runs against.
|
||||
# If you are hacking on them or need a them to rebuild, its enough
|
||||
# to change any part of the string of the image you want.
|
||||
###
|
||||
WINDOWS_TAG: "2022-01-07.1"
|
||||
|
||||
UPSTREAM_BRANCH: 'master'
|
||||
UPSTREAM_REPO: 'dbus/dbus'
|
||||
WINDOWS_AMD64_SUFFIX: 'amd64/windows'
|
||||
WINDOWS_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$UPSTREAM_BRANCH"
|
||||
WINDOWS_UPSTREAM_IMAGE: "$CI_REGISTRY/$UPSTREAM_REPO/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$UPSTREAM_BRANCH"
|
||||
|
||||
|
||||
windows amd64 docker:
|
||||
stage: "build docker"
|
||||
variables:
|
||||
# this file needs to be relative to docker/windows/ subdir
|
||||
# as it makes life easier in the powershell script
|
||||
DOCKERFILE: "tools/docker/windows/Dockerfile"
|
||||
timeout: 2h 30m
|
||||
tags:
|
||||
- windows
|
||||
- shell
|
||||
- "1809"
|
||||
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=$UPSTREAM_BRANCH")
|
||||
|
||||
- "& tools/docker/windows/container.ps1 $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $WINDOWS_IMAGE $WINDOWS_UPSTREAM_IMAGE $DOCKERFILE"
|
||||
- |
|
||||
if (!($?)) {
|
||||
echo "Failed to build the image"
|
||||
Exit 1
|
||||
}
|
||||
|
||||
.debian-build:
|
||||
stage: build
|
||||
|
|
|
|||
65
tools/docker/windows/Dockerfile
Normal file
65
tools/docker/windows/Dockerfile
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
# escape=`
|
||||
|
||||
FROM 'mcr.microsoft.com/windows/servercore:ltsc2019'
|
||||
|
||||
# Make sure any failure in PowerShell scripts is fatal
|
||||
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
|
||||
ENV ErrorActionPreference='Stop'
|
||||
|
||||
# Install Chocolatey
|
||||
RUN iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
|
||||
# Install required packages
|
||||
RUN choco install -y vcredist140
|
||||
RUN choco install -y cmake --installargs 'ADD_CMAKE_TO_PATH=System'
|
||||
RUN choco install -y git --params '/NoAutoCrlf /NoCredentialManager /NoShellHereIntegration /NoGuiHereIntegration /NoShellIntegration'
|
||||
RUN choco install -y windows-sdk-8.1
|
||||
RUN choco install -y python3
|
||||
RUN choco install -y msys2 --params '/NoPath /NoUpdate /InstallDir:C:\\msys64'
|
||||
|
||||
RUN 'git config --global user.email "cirunner@dbus.freedesktop.org"; git config --global user.name "D-Bus CI system"'
|
||||
|
||||
RUN pip3 install meson
|
||||
# FIXME: Python fails to validate SSL certificates, for unclear reasons
|
||||
# try various ways to update the store, certifi-win32 seems to work as long as we fetch before
|
||||
# See also: https://bugs.python.org/issue36011
|
||||
RUN pip3 install --upgrade certifi
|
||||
RUN pip3 install python-certifi-win32
|
||||
RUN (New-Object System.Net.WebClient).DownloadString('https://sourceforge.net') >$null
|
||||
RUN (New-Object System.Net.WebClient).DownloadString('https://wrapdb.mesonbuild.com/v2/pcre_8.37-2/get_patch') >$null
|
||||
RUN (New-Object System.Net.WebClient).DownloadString('https://zlib.net/fossils/') >$null
|
||||
|
||||
# MinGW environment
|
||||
RUN c:\msys64\usr\bin\bash -lc 'pacman -S --noconfirm mingw-w64-ucrt-x86_64-toolchain expat glib2-devel'
|
||||
|
||||
# Visual Studio can't be installed with choco.
|
||||
# It depends on dotnetfx v4.8.0.20190930, which requires a reboot: dotnetfx (exit code 3010)
|
||||
# https://github.com/microsoft/vs-dockerfiles/blob/main/native-desktop/
|
||||
# Set up environment to collect install errors.
|
||||
COPY Install.cmd C:\TEMP\
|
||||
ADD https://aka.ms/vscollect.exe C:\TEMP\collect.exe
|
||||
# Download channel for fixed install.
|
||||
ARG CHANNEL_URL=https://aka.ms/vs/15/release/channel
|
||||
ADD ${CHANNEL_URL} C:\TEMP\VisualStudio.chman
|
||||
# Download and install Build Tools for Visual Studio 2017 for native desktop workload.
|
||||
ADD https://aka.ms/vs/15/release/vs_buildtools.exe C:\TEMP\vs_buildtools.exe
|
||||
RUN C:\TEMP\Install.cmd C:\TEMP\vs_buildtools.exe --quiet --wait --norestart --nocache `
|
||||
--channelUri C:\TEMP\VisualStudio.chman `
|
||||
--installChannelUri C:\TEMP\VisualStudio.chman `
|
||||
--add Microsoft.VisualStudio.Workload.VCTools --includeRecommended`
|
||||
--installPath C:\BuildTools
|
||||
|
||||
# Upstream expat doesn't ship devel? let's build it then...
|
||||
# ADD https://github.com/libexpat/libexpat/releases/download/R_2_4_1/expat-win32bin-2.4.1.exe C:\TEMP\expat.exe
|
||||
# RUN C:\TEMP\expat.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-
|
||||
RUN git clone --depth 1 --branch R_2_4_2 https://github.com/libexpat/libexpat
|
||||
WORKDIR "/libexpat/expat"
|
||||
RUN cmake --install-prefix c:/ -G '"Visual Studio 15 2017 Win64"' .
|
||||
RUN cmake --build . --config Release
|
||||
RUN cmake --install . --config Release
|
||||
|
||||
# Build glib for MSVC
|
||||
RUN git clone --depth 1 --branch 2.70.2 https://gitlab.gnome.org/GNOME/glib.git \glib
|
||||
WORKDIR "/glib"
|
||||
RUN cmd /c 'C:\BuildTools\Common7\Tools\VsDevCmd.bat -arch=amd64 & meson setup builddir'
|
||||
RUN meson compile -C builddir
|
||||
RUN meson install --no-rebuild -C builddir
|
||||
18
tools/docker/windows/Install.cmd
Normal file
18
tools/docker/windows/Install.cmd
Normal file
|
|
@ -0,0 +1,18 @@
|
|||
@rem Copyright (C) Microsoft Corporation. All rights reserved.
|
||||
@rem https://github.com/MicrosoftDocs/visualstudio-docs/blob/main/docs/install/advanced-build-tools-container.md#install-script
|
||||
@rem Licensed under the MIT license.
|
||||
|
||||
@if not defined _echo echo off
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
call %*
|
||||
if "%ERRORLEVEL%"=="3010" (
|
||||
exit /b 0
|
||||
) else (
|
||||
if not "%ERRORLEVEL%"=="0" (
|
||||
set ERR=%ERRORLEVEL%
|
||||
call C:\TEMP\collect.exe -zip:C:\vslogs.zip
|
||||
|
||||
exit /b !ERR!
|
||||
)
|
||||
)
|
||||
60
tools/docker/windows/container.ps1
Normal file
60
tools/docker/windows/container.ps1
Normal file
|
|
@ -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/docker/windows"
|
||||
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
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue