获取使用 .gitlab-ci.yml 运行的 Windows Docker 容器

Posted

技术标签:

【中文标题】获取使用 .gitlab-ci.yml 运行的 Windows Docker 容器【英文标题】:Getting a Windows Docker Container running with .gitlab-ci.yml 【发布时间】:2022-01-09 10:12:38 【问题描述】:

我正在尝试使用我的 Gitlab 管道脚本让 Windows docker 容器与 Python3 一起运行。但是好像下面的yaml配置只启动了一个Linux docker容器。如何配置我的 .yml 文件以使用最新版本的 python 启动 Windows 映像?

.gitlab-ci.yml:

image: python:latest

【问题讨论】:

Windows 运行器在 gitlab.com 共享运行器上不可用 -- 要在 Windows 上运行,您需要自行托管运行器。 【参考方案1】:

还有另一个答案,那就是Pywine。它模拟了 linux for python 中的一个窗口。

因此是:

一个 docker runner 比打开另一个 docker runner 来模拟可以用来解决这个问题的窗口。在下面你会找到我的设置:

到目前为止,这不是最好的设置,但它对我有用。作为 docker 镜像,我使用的是 tobix/pywine:3.9。如果你找到更好的方法请告诉我。我很乐意改进设置。

image: python:3.9

# Change pip's cache directory to be inside the project directory since we can
# only cache local items.
variables:
  PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
  
stages:
  - "Static Code Analysis"
  - "test"
  - "deploy"

cache:
  paths:
    - .cache/pip
    - venv/

before_script:
  - python3.9 -V  # Print out python version for debugging
  - python3.9 -m pip install virtualenv
  - virtualenv venv
  - source venv/bin/activate

Black Linter:
  when: always
  stage: "Static Code Analysis"
  tags:
    - pi
  script:
    - pip install black
    - black  --check --diff ./
  allow_failure: true

Flake Linter:
  when: always
  stage: "Static Code Analysis"
  tags:
    - pi
  script:
    - pip install flake8
    - flake8 --statistics
  allow_failure: true

Type-test:
  when: always
  image: tobix/pywine:3.9
  tags:
    - win-docker
  stage: "Static Code Analysis"
  before_script:
    - . /opt/mkuserwineprefix
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -v
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install --upgrade pip setuptools
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install wheel --no-warn-script-location
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install -Ur requirements/test.txt --no-warn-script-location
  script:
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m mypy . --warn-redundant-casts --warn-unused-ignores --show-column-numbers --pretty --install-types --non-interactive
  allow_failure: true

test:
  needs: []
  tags:
    - win-docker
  image: tobix/pywine:3.9
  before_script:
    - . /opt/mkuserwineprefix
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -v
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install --upgrade pip setuptools --no-warn-script-location
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install wheel --no-warn-script-location
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install -Ur requirements/test.txt --no-warn-script-location
  script:
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pytest test/ --junitxml=/report.xml --cov=./
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m coverage report
    - wine /opt/wineprefix/drive_c/Python39/Python.exe -m coverage xml
  artifacts:
    when: always
    reports:
      junit: report.xml
      cobertura: coverage.xml

pyinstall:
  stage: deploy
  image: tobix/pywine:3.9
  retry: 2
  tags:
    - win-docker
  before_script:
      - . /opt/mkuserwineprefix
      - wine /opt/wineprefix/drive_c/Python39/Python.exe -v
      - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install --upgrade pip setuptools pyinstaller
      - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install wheel --no-warn-script-location
      - wine /opt/wineprefix/drive_c/Python39/Python.exe -m pip install -Ur requirements/base.txt --no-warn-script-location

  script:
    - wine /opt/wineprefix/drive_c/Python39/Scripts/pyinstaller.exe main.spec --clean
  artifacts:
    paths:
      - "dist/*.exe"
  rules:
  - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH

请注意,我不需要在 windows 上运行的所有内容都在普通 docker 容器中运行以提高效率。

【讨论】:

酷,谢谢!【参考方案2】:

您将获得 linux 版本的 python 容器,因为 GitLab 的共享运行器使用 linux。由于容器的工作方式,它们共享主机的内核,因此 linux 运行程序无法“托管” Windows 容器 - 它根本没有运行它的内核指令。

如果你想运行一个 windows docker 镜像,你需要一个你自己托管的 windows server with a supported version。您还需要确保您使用的 windows docker 容器能够正常工作。

所有这些都已经说了——如果您尝试使用 python,只需在 Linux 中运行它。似乎几乎没有什么理由需要 Python 专门在 Windows 上运行以用于您的 CI/CD,但如果您让我们知道它们是什么,我们可能会提供帮助。

【讨论】:

谢谢,我正在使用 Nuitka(python 编译器)将我的 python 脚本编译成二进制 Windows 可执行文件。我只是假设我无法从 Linux 编译 Windows 可执行文件,但我还没有研究过。 知道了。是的,对于 Nuitka 来说,它看起来像是从主机继承了 c 编译,所以你要么必须使用 WINE 在 linux 中运行类似 windows 的编译,要么使用 windows docker 容器。您已经找到了其中一个消失的原因:)。话虽如此,看起来使用带有 pyinstaller 或 Nuitka 的 WINE 并没有那么复杂,因此在尝试运行 Windows docker 映像之前可能值得研究一下。 太棒了,好的,谢谢指导!可以尝试使用 WINE :)

以上是关于获取使用 .gitlab-ci.yml 运行的 Windows Docker 容器的主要内容,如果未能解决你的问题,请参考以下文章

在 .gitlab-ci.yml 中运行 docker-compose build

gitlab-ci.yml 仅在 master 分支上

gitlab-ci.yml、before_script 和 artifact

从 Jenkins Ci 服务迁移到 gitlab-ci.yml

Gitlab-ci.yml 创建合并请求

在gitlab-ci.yml中`git clone project2`?