如何在gitlab ci的构建脚本中使用sudo?

sta*_*tic 21 bash nginx gitlab

当我想要做一些需要sudo privelegies的东西时,构建过程会停滞不前,而且ps aux对于那个命令来说,它会挂在列表中但什么都不做.

例如:

在buildscript中:

# stop nginx
echo "INFO: stopping nginx. pid [$(cat /opt/nginx/logs/nginx.pid)]"
sudo kill $(cat /opt/nginx/logs/nginx.pid)
Run Code Online (Sandbox Code Playgroud)

在gitlab ci输出控制台中:

INFO: stopping nginx. pid [2741]

kill $(cat /opt/nginx/logs/nginx.pid) # with a spinning wheel
Run Code Online (Sandbox Code Playgroud)

在bash中:

> ps aux | grep nginx

root      6698  0.0  0.1  37628  1264 ?        Ss   19:25   0:00 nginx: master process /opt/nginx/sbin/nginx
nobody    6700  0.3  0.3  41776  3832 ?        S    19:25   0:00 nginx: worker process
kai   7015  0.0  0.0   4176   580 pts/0    S+   19:27   0:00 sh -c sudo kill $(cat /opt/nginx/logs/nginx.pid)
kai   7039  0.0  0.0   7828   844 pts/2    S+   19:27   0:00 grep nginx
Run Code Online (Sandbox Code Playgroud)

所以:

  • 不是sudo kill $(cat /opt/nginx/logs/nginx.pid)要执行,而是sh -c sudo kill $(cat /opt/nginx/logs/nginx.pid)
  • 它是挂起的,没有响应(对我而言,它就像是交互式地要求输入密码)

Rea*_*lar 34

有几种方法可以解决这个问题.

授予sudo权限

您可以向gitlab-runner用户授予sudo权限,因为这是执行构建脚本的人员.

$ sudo usermod -a -G sudo gitlab-runner
Run Code Online (Sandbox Code Playgroud)

现在,您可以删除密码,限制了sudogitlab-runner用户.

启动sudo编辑器

$ sudo visudo
Run Code Online (Sandbox Code Playgroud)

现在将以下内容添加到文件的底部

gitlab-runner ALL=(ALL) NOPASSWD: ALL
Run Code Online (Sandbox Code Playgroud)

不要为不受信任的用户执行的gitlab运行器执行此操作.

SSH Runner

您可以配置gitlab-ci-runner使用SSH连接到远程主机.您将其配置为远程使用具有sudo权限的用户,并使用该用户执行构建.远程主机可以是gitlab运行器正在执行的同一台机器,也可以是另一台主机.

此构建用户帐户仍需要具有sudo和无密码权限.按照以下说明进行操作,但gitlab-runner使用构建用户进行替换.

  • 不是允许所有命令到gitlab-runner,也可以允许一个命令,例如只有npm [(source)](http://www.atrixnet.com/allow-an-unprivileged-user-to-运行-A-某些命令与 - 须藤/).````gitlab-runner ALL =(ALL)NOPASSWD:/ usr/bin/npm```如果你这样做,你就不需要将用户添加到根组了,你的系统会更安全. (18认同)
  • 我如何使用 github CI/CD 实现这一目标? (2认同)
  • 当我运行您发布的第一个命令时,我收到错误=>“sudo:找不到 usermod 命令” (2认同)
  • sudo usermod -a -G sudo gitlab-runner 运行上述命令后,出现错误“usermod:组 'sudo' 不存在” (2认同)