【问题标题】:How to include CI_JOB_TOKEN in Dockerfile on gitlab?如何在 gitlab 的 Dockerfile 中包含 CI_JOB_TOKEN?
【发布时间】:2018-05-24 13:59:36
【问题描述】:

我遇到了一个问题,我似乎很难在我的 CI/CD 流程中传递 CI_JOB_TOKEN,以便我可以从我的 Dockerfile 下载私有 gitlab npm 模块。

我的文件如下所示:

gitlab-ci.yml

image: tmaier/docker-compose:latest
  variables:
    CI_JOB_TOKEN: ${CI_JOB_TOKEN}
​
stages:
  - build
​
build:
  stage: build
  script:
    - docker-compose build --build-arg CI_JOB_TOKEN=${CI_JOB_TOKEN}
    - docker-compose push --arg CI_JOB_TOKEN=${CI_JOB_TOKEN}

docker-compose.yml

services:
  qa-service:
    build:
      context: .
      args:
        PORT: 3000
        CI_JOB_TOKEN: ${CI_JOB_TOKEN}

Dockerfile

FROM ubuntu:latest
​
ARG CI_JOB_TOKEN
RUN npm install \
    "git+https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.example.com/xxx/yyy.git"

我一直收到这个错误

npm 错误!执行时出错:

npm 错误! /usr/bin/git ls-remote -h -t https://gitlab-ci-token:%24%7BCI_JOB_TOKEN%7D@gitlab.example.com/xxx/yyy.git

npm 错误!

npm 错误!远程:HTTP 基本:访问被拒绝

npm 错误!致命:“https://gitlab-ci-token:%24%7BCI_JOB_TOKEN%7D@gitlab.example.com/xxx/yyy.git/”的身份验证失败

npm 错误!

npm 错误!退出错误代码:128

【问题讨论】:

    标签: docker gitlab gitlab-ci-runner


    【解决方案1】:

    不确定这是否仍然相关,但我发现,出于某种原因,还必须声明一个名为 CI_JOB_TOKEN 的 ENV(在这种情况下与 maven 结合使用),否则会出现身份验证失败,例如尝试访问 GitLab Maven 存储库时。

    作为一种解决方法,我建议使用多阶段构建,因此 CI_JOB_TOKEN 不会出现在最终图像中,即:

    ARG CI_JOB_TOKEN
    
    FROM maven:alpine as build
    
    ENV CI_JOB_TOKEN=$CI_JOB_TOKEN
    
    COPY . .
    
    RUN mvn package -s ci_settings.xml
    
    FROM java:8-jre-alpine
    
    COPY --from=build PATH/TO/app.jar /app.jar
    
    CMD exec java -jar /app.jar
    

    这样 CI_JOB_TOKEN 被成功识别为环境变量,当我尝试访问 GitLab maven 存储库时,我不再收到 401 错误。

    我认为这也将解决您的问题,这可能不是 GitLab CI 的限制,而是与构建参数在 Docker 中的工作方式有关。

    当然,您必须根据您的特定用例调整这些步骤。

    【讨论】:

      【解决方案2】:

      从你的 CI 脚本中我可以看出,变量语法应该是:

      image: tmaier/docker-compose:latest
        variables:
          CI_JOB_TOKEN: $CI_JOB_TOKEN
      

      $CI_JOB_TOKEN,而不是${CI_JOB_TOKEN}

      您也不需要使用variables 部分来定义CI_JOB_TOKEN,只需在需要的地方使用$CI_JOB_TOKEN,因为它已经是predefined variable

      来自documentation

      【讨论】:

        猜你喜欢
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 2021-11-19
        • 2021-12-04
        • 2021-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多