如何使用一些自定义变量制作 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