From bdbef0449c9c20b59c7421d58c80a37cb7ee8d15 Mon Sep 17 00:00:00 2001 From: Jordan Petridis Date: Wed, 27 Jan 2021 09:54:59 +0200 Subject: [PATCH] ci_template: build windows image in the ci Build the images in the ci runners like we do, for the linux containers. Kudos to mesa for the powershell script that reimplements the ci-templates behavior. https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4304 Part-of: --- docker/windows/container.ps1 | 62 ++++++++++++++++++++++++++++++++++++ gitlab/ci_template.yml | 39 +++++++++++++++++++++-- 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 docker/windows/container.ps1 diff --git a/docker/windows/container.ps1 b/docker/windows/container.ps1 new file mode 100644 index 0000000000..fac0087f99 --- /dev/null +++ b/docker/windows/container.ps1 @@ -0,0 +1,62 @@ +# 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] + +Set-Location -Path ".\docker\windows" + +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 --no-cache -t "$registry_user_image" -f "$dockerfile" . +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/gitlab/ci_template.yml b/gitlab/ci_template.yml index bfc9044c3d..25765d02c4 100644 --- a/gitlab/ci_template.yml +++ b/gitlab/ci_template.yml @@ -27,6 +27,7 @@ variables: MANIFEST_TAG: '2020-10-22.0' TEST_MANIFEST_TAG: '2020-10-22.0' INDENT_TAG: '2020-10-22.0' + WINDOWS_TAG: "2021-02-24.0" GST_UPSTREAM_REPO: 'gstreamer/gst-ci' @@ -36,6 +37,7 @@ variables: MANIFEST_AMD64_SUFFIX: 'amd64/build-manifest' TEST_MANIFEST_AMD64_SUFFIX: 'amd64/test-manifest' INDENT_AMD64_SUFFIX: 'amd64/gst-indent' + WINDOWS_AMD64_SUFFIX: 'amd64/windows' FEDORA_IMAGE: "$CI_REGISTRY_IMAGE/$FEDORA_AMD64_SUFFIX:$FEDORA_TAG-$GST_UPSTREAM_BRANCH" FEDORA_DOCS_IMAGE: "registry.freedesktop.org/gstreamer/gst-ci/amd64/fedora:2020-07-03.0-master" @@ -44,11 +46,14 @@ variables: MANIFEST_IMAGE: "$CI_REGISTRY_IMAGE/$MANIFEST_AMD64_SUFFIX:$MANIFEST_TAG-$GST_UPSTREAM_BRANCH" TEST_MANIFEST_IMAGE: "$CI_REGISTRY_IMAGE/$TEST_MANIFEST_AMD64_SUFFIX:$TEST_MANIFEST_TAG-$GST_UPSTREAM_BRANCH" INDENT_IMAGE: "$CI_REGISTRY_IMAGE/$INDENT_AMD64_SUFFIX:$INDENT_TAG-$GST_UPSTREAM_BRANCH" - - WINDOWS_IMAGE: 'registry.freedesktop.org/gstreamer/gst-ci/amd64/windows:v13-master' + WINDOWS_IMAGE: "$CI_REGISTRY_IMAGE/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH" + WINDOWS_UPSTREAM_IMAGE: "$CI_REGISTRY/$GST_UPSTREAM_REPO/$WINDOWS_AMD64_SUFFIX:$WINDOWS_TAG-$GST_UPSTREAM_BRANCH" # Can't use $CI_* variables since we use this template in all repos, not just gst-ci CERBERO_SCRIPT_URL: "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/${GST_UPSTREAM_BRANCH}/gitlab/cerbero_setup.sh" + # FIXME: fix the file path url to point to the upstram once merged + # WINDOWS_CONTAINER_SCRIPT_URL: "https://gitlab.freedesktop.org/gstreamer/gst-ci/raw/${GST_UPSTREAM_BRANCH}/docker/windows/container.ps1" + WINDOWS_CONTAINER_SCRIPT_URL: "https://gitlab.freedesktop.org/alatiera/gst-ci/raw/alatiera/windows-build-redux/docker/windows/container.ps1" GIT_STRATEGY: none MESON_BUILDTYPE_ARGS: --default-library=both @@ -327,6 +332,36 @@ gst-indent amd64 docker: DOCKERFILE: "docker/indent/Dockerfile" extends: .base +windows amd64 docker: + stage: "build docker" + variables: + GIT_STRATEGY: fetch + REPO_SUFFIX: "$WINDOWS_AMD64_SUFFIX" + TAG: "$WINDOWS_TAG-$GST_UPSTREAM_BRANCH" + + # Unlike the buildah/linux jobs, this file + # needs to be relative to docker/windows/ 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 docker/windows/ + DOCKERFILE: "Dockerfile" + tags: + - windows + - shell + - "1809" + script: + - $env:WINDOWS_CONTAINER_SCRIPT_PATH = "$env:CI_PROJECT_DIR\container.ps1" + - echo "Fetching $env:WINDOWS_CONTAINER_SCRIPT_URL" + - Invoke-WebRequest -Uri $env:WINDOWS_CONTAINER_SCRIPT_URL -OutFile $env:WINDOWS_CONTAINER_SCRIPT_PATH + + - "& $env:WINDOWS_CONTAINER_SCRIPT_PATH $CI_REGISTRY $CI_REGISTRY_USER $CI_REGISTRY_PASSWORD $WINDOWS_IMAGE $WINDOWS_UPSTREAM_IMAGE $DOCKERFILE" + - | + if (!($?)) { + echo "Failed to build the image" + Exit 1 + } + # # Job to create the manifest.xml to used for our builds #