获取使用 .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、before_script 和 artifact