具有GCP凭证的Gitlab Runner映像

时间:2018-09-24 07:10:44

标签: docker gitlab gitlab-ci gitlab-ci-runner

我正在尝试教我的Gitlab Runner映像从我的私有Docker Registry(在Google Cloud中运行的GCR)获取自定义生成器映像。

什么没有解决? 我使用正确设置的ServiceAccount创建了一个自定义的Gitlab Runner图像。我以非特权模式开始,但虫洞模式(通过docker.sock)开始。在执行到该容器(基于gitlab/gitlab-runner:v11.3.0)时,我必须认识到我无法在其中执行任何docker命令(既不是root用户,也不是gitlab-user)。 gitlab-runner之后如何启动构建器容器是远远超出我的认知能力的。 ;)

# got started via eu.gcr.io/my-project/gitlab-runner:0.0.5 which got taught the GCR credentials

stages:
    - build

build:
    image: docker pull eu.gcr.io/my-project/gitlab-builder-docker:0.0.2
    stage: build
    script: 
        # only for test if I have access to private docker registry
        - docker pull eu.gcr.io/my-project/gitlab-builder-docker:0.0.1 

有什么结果? 根据此tutorial,您可以通过before_script文件中的.gitlab-ci.yml块进行身份验证。解决了。​​

# got started via gitlab/gitlab-runner:v11.3.0 

stages:
    - build

before_script:
    - apk add --update curl python which bash
    - curl -sSL https://sdk.cloud.google.com | bash
    - export PATH="$PATH:/root/google-cloud-sdk/bin"
    - gcloud components install docker-credential-gcr
    - gcloud auth activate-service-account --key-file=/key.json
    - gcloud auth configure-docker --quiet

build:
    image: docker:18.03.1-ce
    stage: build
        # only for test if I have access to private docker registry
        - docker pull eu.gcr.io/my-project/gitlab-builder-docker:0.0.1 

问题 这意味着我必须在每次构建运行中都执行此操作(安装gcloud和authenticate)-我希望在gitlab-runner映像中执行此操作。您知道如何实现这一目标吗?

3 个答案:

答案 0 :(得分:1)

最后,我找到了完成此任务的方法。

教普通的gitlab-runner如何从您的私人GCR Docker存储库中提取信息

GCP

  1. IAM & Admin中创建没有权限的服务帐户
  2. 下载Json Key
  3. Storage Browser中添加权限
    1. 选择保存图像的存储桶(例如 eu.artifacts.my-project.appspot.com
    2. 授予服务帐户Storage Object Admin的权限

本地 Docker 容器

  1. 启动一个library/docker容器并执行到其中(使用Docker Wormhole Pattern docker.sock卷安装)
  2. 通过{登录您的回购网址(在我的情况下,该网址位于欧洲,因此使用 eu 前缀)登录GCR docker login -u _json_key --password-stdin https://eu.gcr.io < /etc/gitlab-runner/<MY_KEY>.json
  3. 验证它是否可以通过某些docker pull <MY_GCR_IMAGE>
  4. 使用
  5. 复制〜/ .docker / config.json
  6. 的内容

Gitlab config.toml 配置

  1. 将以下内容添加到您的 config.toml 文件中 [[runners]] environment = ["DOCKER_AUTH_CONFIG={ \"auths\": { \"myregistryurl.com:port\": { \"auth\": \"<TOKEN-FROM-DOCKER-CONFIG-FILE>\" } } }"]

香草Gitlab转轮容器

  1. 像这样跑跑步者 docker run -it \ --name gitlab-runner \ --rm \ -v <FOLDER-CONTAININNG-GITLAB-RUNNER-CONFIG-FILE>:/etc/gitlab-runner:ro \ -v /var/run/docker.sock:/var/run/docker.sock \ gitlab/gitlab-runner:v11.3.0

您的.gitlab-ci.yml文件

  1. 通过 .gitlab-ci.yml 验证完成的工作
    1. 使用位于您的私人GCP Container Registry中的图片

教您的构建器映像如何推送到您的私有GCR Docker Repo

GCP

  1. 向您的服务帐户添加权限
    1. 授予您Storage Legacy Bucket Reader中服务帐户的权限Storage Browser

自定义Docker Builder映像

  1. 将您的服务帐户密钥文件添加到您的自定义图像中 FROM docker:18.03.1-ce ADD key.json /<MY_KEY>.json

您的.gitlab-ci.yml文件

  1. 将以下脚本添加到您的before_script部分中 docker login -u _json_key --password-stdin https://eu.gcr.io < /key.json

最终思想

现在,香草gitlab-runner可以从您的私人GCR Docker Repo中提取您的自定义映像。此外,这些可拉动的自定义映像还能够与您的私有GCR Docker Repo进行对话,例如,将生成的映像推送到构建管道中。

那是相当复杂的东西。也许Gitlab将来会增强对此用例的支持。

答案 1 :(得分:0)

您是否尝试过使用Google cloudbuild? 我遇到了同样的问题,并像这样解决了它:

echo ${GCR_AUTH_KEY} > key.json
gcloud auth activate-service-account --key-file key.json
gcloud auth configure-docker

gcloud builds submit . --config=cloudbuild.yaml --substitutions _CI_PROJECT_NAME=$CI_PROJECT_NAME,_CI_COMMIT_TAG=${CI_COMMIT_TAG},_CI_PROJECT_NAMESPACE=${CI_PROJECT_NAMESPACE}

cloudbuild.yaml:

steps:
 - name: gcr.io/cloud-builders/docker
    id: builder
    args: 
      - 'build'
      - '-t'
      - 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:$_CI_COMMIT_TAG'
      - '.'
 - name: gcr.io/cloud-builders/docker
    id: tag-runner-image
    args: 
      - 'tag'
      - 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:$_CI_COMMIT_TAG'
      - 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:latest'
images:
 - 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:$_CI_COMMIT_TAG'
 - 'eu.gcr.io/projectID/$_CI_PROJECT_NAMESPACE-$_CI_PROJECT_NAME:latest'

在gitlab-ci阶段只需使用google / cloud-sdk:alpine作为图片

答案 2 :(得分:0)

我也终于找到了一种方法。请检查this answer。这几乎是相同的问题,但是不允许将任何键存储在图像中。