Gitlab Runner 出现 Docker 和 shell 错误 — 权限被拒绝

Emi*_* C. 6 gitlab docker gitlab-ci-runner

在 Ubuntu Server 20.04.2.0 上安装了全新的 Gitlab CE 13.9.1。这是管道

image: node:latest

before_script:
  - apt-get update -qq

stages:
  - install

install:
  stage: install
  script:
    - npm install --verbose
Run Code Online (Sandbox Code Playgroud)

为了运行它,我使用与之前的 Gitlab CE 12 相同的过程配置我的 Gitlab Runner:

我拉取最后一个 Gitlab 运行程序图像:

docker pull gitlab/gitlab-runner:latest
Run Code Online (Sandbox Code Playgroud)

第一次尝试:

启动在本地卷上安装 GitLab Runner 容器

docker run -d \
--name gitlab-runner \
--restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
Run Code Online (Sandbox Code Playgroud)

并注册跑步者

docker run --rm -t -i \
-v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register
Run Code Online (Sandbox Code Playgroud)

注册跑步者时,我选择执行者shell

最后,当我推送到 Gitlab 时,在管道上,我看到以下错误:

$ apt-get update -qq
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
ERROR: Job failed: exit status 1
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

启动在 Docker 卷上安装 GitLab Runner 容器

  1. 创建卷
docker volume create gitlab-runner-config
Run Code Online (Sandbox Code Playgroud)
  1. 启动 GitLab Runner 容器
docker run -d \
--name gitlab-runner \
--restart always \
-v gitlab-runner-config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest
Run Code Online (Sandbox Code Playgroud)
  1. 注册运行器(再次选择 shell 作为执行器)
docker run \
--rm -t -i \
-v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner register
Run Code Online (Sandbox Code Playgroud)

结果相同。

$ apt-get update -qq
E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied)
ERROR: Job failed: exit status 1
Run Code Online (Sandbox Code Playgroud)

第三次尝试:

授予 gitlab-runner 权限

我最终阅读了In gitlab CI the gitlab runner select bad executorhttps://docs.gitlab.com/runner/executors/shell.html#running-as-unprivileged-user,其中指出了这些解决方案:

  1. 移动到码头工人
  2. 授予用户 gitlab-runner 运行指定命令所需的权限。gitlab-runner 可以在没有 sudo 的情况下运行 apt-get,他还需要 npm install 和 npm run 的权限。
  3. 将 sudo nopasswd 授予用户 gitlab-runner。将 gitlab-runner ALL=(ALL) NOPASSWD: ALL (或类似)添加到安装了 gitlab-runner 的计算机上的 /etc/sudoers 并将 apt-get update 行更改为 sudo apt-get update,这将以特权身份执行它们用户(根)。
  1. 我需要使用shell
  2. 我已经这样做了sudo usermod -aG docker gitlab-runner
  3. 也尝试过在管道中使用sudo nano /etc/sudoers、添加gitlab-runner ALL=(ALL) NOPASSWD: ALL和使用sudo apt-get update -qq,结果是bash: line 106: sudo: command not found

我现在在这里很迷路。任何想法都会受到欢迎。

emi*_*emi 2

恕我直言,shell在已经安装了 Docker 套接字的 Docker 运行器上使用执行器并不是一个好主意。您最好使用dockerexecutor,它将处理所有事情,并且可能就是它应该如何运行。

编辑

或者,您可以使用自定义的 Docker 映像来允许使用具有root权限的 shell 执行器。首先,您需要创建一个Dockerfile

FROM gitlab/gitlab-runner:latest
# Change user to root
USER root
Run Code Online (Sandbox Code Playgroud)

然后,您必须构建图像(在这里,我将其标记为custom-gitlab-runner):

FROM gitlab/gitlab-runner:latest
# Change user to root
USER root
Run Code Online (Sandbox Code Playgroud)

最后,您需要使用此图像:

$ docker build -t custom-gitlab-runner .
Run Code Online (Sandbox Code Playgroud)