在 GitLab CI 管道中针对给定作业使用不同的操作系统

问题描述 投票:0回答:1

我有一个 GitLab CI 管道,默认情况下在所有阶段都使用适用于 Java 的 Temurin Docker (Linux) 映像。

我需要扩展构建目标以使用多个操作系统:Linux、macOS、Windows。因此,如果有以下 Docker 映像:

eclipse-temurin:21-jdk-jammy
eclipse-temurin:21-jdk-nanoserver
eclipse-temurin:21-jdk-macos
,是否有办法针对所有这些 Docker 映像运行给定作业,而不重复作业定义?

我最初采用的路线是使用 GitLab CI 的

matrix
但它不太有效:

assemble:
  image: eclipse-temurin:21-jdk-${OS}
  parallel:
    matrix:
      - OS: [jammy, nanoserver]
  script:
    - ./gradlew packageDistributionForCurrentOS
  stage: assemble

我看到 Docker 镜像已正确解析,但不知何故,GitLab 运行程序失败了

eclipse-temurin:21-jdk-nanoserver
:

Running with gitlab-runner 16.6.0~beta.105.gd2263193 (d2263193)
  on blue-5.saas-linux-small-amd64.runners-manager.gitlab.com/default -AzERasQ, system ID: s_4cb09cee29e2
  feature flags: FF_USE_IMPROVED_URL_MASKING:true
Preparing the "docker+machine" executor 00:05
Using Docker executor with image eclipse-temurin:21-jdk-nanoserver ...
Pulling docker image eclipse-temurin:21-jdk-nanoserver ...
WARNING: Failed to pull image with policy "always": no matching manifest for linux/amd64 in the manifest list entries (manager.go:237:0s)
ERROR: Job failed: failed to pull image "eclipse-temurin:21-jdk-nanoserver" with specified policies [always]: no matching manifest for linux/amd64 in the manifest list entries (manager.go:237:0s)

这个错误并没有告诉我太多信息。我只能推断 Docker 镜像

eclipse-temurin:21-jdk-nanoserver
不适用于
linux/amd64
架构,这可能是 GitLab 运行器的主机实际安装的,但这些 Docker 镜像应该与基础设施无关,并且
21-jdk-nanoserver 
确实是 Windows 映像。

关于如何推进这种方法以实现这一期望的行为有什么建议吗?

docker gitlab gitlab-ci gitlab-ci-runner
1个回答
0
投票

这里的问题是你的 GitLab 运行器看起来有一个

linux/amd64
的架构,但你试图拉出 docker 标签
21-jdk-nanoserver
,它只为 Windows 架构构建。所以你不能在 Linux 上运行这个标签版本的镜像。

因此,要么更改为使用为 GitLab 运行器的 Linux 架构构建的标签,要么更新运行器标签以能够在 Windows 运行器上运行此映像。

© www.soinside.com 2019 - 2024. All rights reserved.