如何使用一些自定义变量制作 Gitlab CI/CD 运行 容器?
How to make Gitlab CI/CD run container with some custom variables?
我有一份工作开始 android UI-在 GitLab CI/CD 上进行测试。它以某种方式 运行 是来自注册表中图像 android-uitests:1.0
的容器。我不知道 Gitlab CI/CD 运行 使用命令“docker 运行 ...”在何处以及如何使用该图像,但我需要扩展该命令并且我想要在此命令中传递一些变量(或参数)。
下面是我希望 Gitlab 执行的命令示例:
docker run -d \
-t \
--privileged \
-e "SNAPSHOT_DISABLED"="true" \
-e "QTWEBENGINE_DISABLE_SANDBOX"=1 \
-e "WINDOW"="true" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
-p 5555:5555 -p 5554:5554 -p 5901:5901 \
--name emulator \
android-uitest:1.0
这是一个舞台及其与图像的工作
ui-tests:
image: registry.myproject:5000/android-uitests:1.0
stage: ui-tests
only:
- merge_requests
- schedules
when: manual
script:
- bash /run-emulator.sh
- adb devices
- adb shell input keyevent 82
- adb shell settings put global window_animation_scale 0 &
- adb shell settings put global transition_animation_scale 0 &
- adb shell settings put global animator_duration_scale 0 &
- ./gradlew mobile:connectedDevDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.package=app.online.tests.uitests
tags:
- androidtest
所以换句话说,我想配置 docker run
命令下的 运行 我的形象。
请告诉我该怎么做?
考虑到您使用的是 Docker 容器,当您没有为 运行 指定 docker 图像时,我假设您使用的是 a Gitlab Runner on Docker executor mode, which means you're essentially running a similar script to this CI 工作:
image: docker:19.03.13
variables:
DOCKER_TLS_CERTDIR: "/certs"
services:
- docker:19.03.13-dind
script:
- (your commands)
要了解发生了什么,让我们将其分解为多个步骤:
image: docker:19.03.13
(...)
services:
- docker:19.03.13-dind
docker-19.03.13-dind
,和docker:19.03.13
有什么区别?
为什么是服务而不是图片?
DIND 表示 Docker-in-Docker、this part of Gitlab's documentation can explain it in further technical details, but what is important to understand from this part is what is a service on Gitlab's CI context and why they have to specify an additional Docker image when already using a Docker image as a default environment. When you write a service
on Gitlab CI, you are able to use its command while you're inside an existing container。 例如当您想将 PostgreSQL(数据库)容器连接到您正在构建的后端容器时,但不必设置 docker-compose 或多个容器。
将 docker 服务与 docker 图像一起用于 运行,这意味着您可以直接在作业中使用 docker run
,无需任何额外设置。 进一步解释这个问题。
回到您的代码,而不是直接将注册表映像部署为作业:
ui-tests:
image: registry.myproject:5000/android-uitests:1.0
您可能需要先构建您的容器并将其上传到您的注册表:
image: docker:19.03.12
services:
- docker:19.03.12-dind
variables:
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
此代码段将在您的存储库的根文件夹中构建您的 Docker 文件,并将其上传到您的 Gitlab private( 或 public,如果您的项目设置为 public) 图像注册表。现在你可以指定一个额外的工作来专门做你想做的事:
最终示例
image: docker:19.03.12
stages:
- build
- release
services:
- docker:19.03.12-dind
variables:
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build:
stage: build
script:
- docker pull $CI_REGISTRY_IMAGE:latest || true
- docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
deploy:
stage: release
script:
- docker pull $CI_REGISTRY_IMAGE:latest || true
- docker run -d -t --privileged -e "SNAPSHOT_DISABLED"="true" -e "QTWEBENGINE_DISABLE_SANDBOX"=1 -e "WINDOW"="true" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" -p 5555:5555 -p 5554:5554 -p 5901:5901 --name emulator $CI_REGISTRY_IMAGE:latest
为什么要使用 $VARIABLES
?
如果环境变量听起来令人困惑,here's the list of default environment variables Gitlab generates for every job it creates。
我引用的最后一个示例将导致 Docker 容器 运行 在您的执行程序注册的同一台机器上,使用您指定的环境变量。
如果你需要一个实际的例子,you can use this gitlab-ci.yml
of a project of mine as reference。
我有一份工作开始 android UI-在 GitLab CI/CD 上进行测试。它以某种方式 运行 是来自注册表中图像 android-uitests:1.0
的容器。我不知道 Gitlab CI/CD 运行 使用命令“docker 运行 ...”在何处以及如何使用该图像,但我需要扩展该命令并且我想要在此命令中传递一些变量(或参数)。
下面是我希望 Gitlab 执行的命令示例:
docker run -d \
-t \
--privileged \
-e "SNAPSHOT_DISABLED"="true" \
-e "QTWEBENGINE_DISABLE_SANDBOX"=1 \
-e "WINDOW"="true" \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
-p 5555:5555 -p 5554:5554 -p 5901:5901 \
--name emulator \
android-uitest:1.0
这是一个舞台及其与图像的工作
ui-tests:
image: registry.myproject:5000/android-uitests:1.0
stage: ui-tests
only:
- merge_requests
- schedules
when: manual
script:
- bash /run-emulator.sh
- adb devices
- adb shell input keyevent 82
- adb shell settings put global window_animation_scale 0 &
- adb shell settings put global transition_animation_scale 0 &
- adb shell settings put global animator_duration_scale 0 &
- ./gradlew mobile:connectedDevDebugAndroidTest -Pandroid.testInstrumentationRunnerArguments.package=app.online.tests.uitests
tags:
- androidtest
所以换句话说,我想配置 docker run
命令下的 运行 我的形象。
请告诉我该怎么做?
考虑到您使用的是 Docker 容器,当您没有为 运行 指定 docker 图像时,我假设您使用的是 a Gitlab Runner on Docker executor mode, which means you're essentially running a similar script to this CI 工作:
image: docker:19.03.13
variables:
DOCKER_TLS_CERTDIR: "/certs"
services:
- docker:19.03.13-dind
script:
- (your commands)
要了解发生了什么,让我们将其分解为多个步骤:
image: docker:19.03.13
(...)
services:
- docker:19.03.13-dind
docker-19.03.13-dind
,和docker:19.03.13
有什么区别?
为什么是服务而不是图片?
DIND 表示 Docker-in-Docker、this part of Gitlab's documentation can explain it in further technical details, but what is important to understand from this part is what is a service on Gitlab's CI context and why they have to specify an additional Docker image when already using a Docker image as a default environment. When you write a service
on Gitlab CI, you are able to use its command while you're inside an existing container。 例如当您想将 PostgreSQL(数据库)容器连接到您正在构建的后端容器时,但不必设置 docker-compose 或多个容器。
将 docker 服务与 docker 图像一起用于 运行,这意味着您可以直接在作业中使用 docker run
,无需任何额外设置。
回到您的代码,而不是直接将注册表映像部署为作业:
ui-tests:
image: registry.myproject:5000/android-uitests:1.0
您可能需要先构建您的容器并将其上传到您的注册表:
image: docker:19.03.12
services:
- docker:19.03.12-dind
variables:
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
此代码段将在您的存储库的根文件夹中构建您的 Docker 文件,并将其上传到您的 Gitlab private( 或 public,如果您的项目设置为 public) 图像注册表。现在你可以指定一个额外的工作来专门做你想做的事:
最终示例
image: docker:19.03.12
stages:
- build
- release
services:
- docker:19.03.12-dind
variables:
# Use TLS https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#tls-enabled
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
build:
stage: build
script:
- docker pull $CI_REGISTRY_IMAGE:latest || true
- docker build --cache-from $CI_REGISTRY_IMAGE:latest --tag $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA --tag $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
- docker push $CI_REGISTRY_IMAGE:latest
deploy:
stage: release
script:
- docker pull $CI_REGISTRY_IMAGE:latest || true
- docker run -d -t --privileged -e "SNAPSHOT_DISABLED"="true" -e "QTWEBENGINE_DISABLE_SANDBOX"=1 -e "WINDOW"="true" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" -p 5555:5555 -p 5554:5554 -p 5901:5901 --name emulator $CI_REGISTRY_IMAGE:latest
为什么要使用 $VARIABLES
?
如果环境变量听起来令人困惑,here's the list of default environment variables Gitlab generates for every job it creates。
我引用的最后一个示例将导致 Docker 容器 运行 在您的执行程序注册的同一台机器上,使用您指定的环境变量。
如果你需要一个实际的例子,you can use this gitlab-ci.yml
of a project of mine as reference。