给定 2 个免费套餐上的 gitlab.com 项目:
- 源项目在其“包注册表”中包含一些包(例如 id:12345678),
- 消费者项目有一个 CI 管道,该作业执行
yarn install
从源项目的包注册表中获取 npm 包的操作。
安装失败,因为消费者项目似乎没有访问源项目包注册表的正确权限。
An unexpected error occurred: "https://gitlab.com/api/v4/projects/12345678/packages/npm/@myscope/mypackage/-/@myscope/mypackage-1.0.0.tgz: Request failed \"404 Not Found\"".
这是缺少权限的特征(gitlab 显示 404 而不是 403)。该包确实存在,并且当使用正确的权限连接时,可以通过此 URL 访问。
我该如何设置以便消费者项目的管道可以到达源项目的注册表?
答案1
$CI_JOB_TOKEN
我们可以通过使用Gitlab 在每个管道执行的唯一持续时间内自动创建的特殊变量来实现这一点。
此令牌允许从管道正在执行的消费者项目访问源项目,前提是源项目允许这样做(见下文)。
消费者项目 CI 管道
在需要访问包的阶段.gitlab-ci.yml
,添加:
before_script:
- echo "@package-scope:registry=https://gitlab.com/api/v4/projects/12345678/packages/npm/" > .npmrc
- echo "//gitlab.com/api/v4/projects/12345678/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc
# replace 12345678 by the Source project id on gitlab
笔记:如果你的 Consumer 项目已经包含一个.npmrc
文件,你可以用以下方式替换第一个 echo 行:
- echo >> .npmrc
# this ensure the next echo line will be in a separate line
源项目的授权
包含 Consumer 管道需要访问的包的 Source 项目必须与 Consumer 项目位于同一组中。此外,必须为每个 Consumer 项目提供明确的授权。
在 Gitlab > 源项目 > 设置 > CI/CD > 令牌访问中:
确保选中“限制对此项目的访问”(出于安全考虑)
在“允许以下项目的 CI 作业令牌访问此项目”中,使用其路径添加消费者项目(对于托管在 上的项目
https://gitlab.com/mycompany/mygroup/myproject
,请使用mycompany/mygroup/myproject
)
如果使用 Docker
如果 Consumer 管道包含 Docker 镜像的构建,则 Docker 构建环境需要针对 Source 项目进行身份验证才能访问其包。利用 来$CI_JOB_TOKEN
执行此操作。
Dockerfile
ARG PACKAGE_REGISTRY_TOKEN
...
RUN echo "@package-scope:registry=https://gitlab.com/api/v4/projects/12345678/packages/npm/" > .npmrc
# or `RUN echo >> .npmrc` if you copied the .npmrc in the build context
RUN echo "//gitlab.com/api/v4/projects/12345678/packages/npm/:_authToken=${CI_JOB_TOKEN}" >> .npmrc
# replace 12345678 by the Source project id on gitlab
RUN yarn install
# Remove the .npmrc after (not needed anymore)
RUN rm -f .npmrc
.gitlab-ci.yml
在每次出现时docker build
,添加参数:
docker build ... --build-arg PACKAGE_REGISTRY_TOKEN="${CI_JOB_TOKEN}" ...