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

Posted

技术标签:

【中文标题】如何在 gitlab ci 的构建脚本中使用 sudo?【英文标题】:How to use sudo in build script for gitlab ci? 【发布时间】:2013-10-23 09:57:12 【问题描述】:

当我想做一些需要 sudo 权限的事情时,构建过程会卡住,而当 ps aux 执行该命令时,它会挂在列表中但什么也不做。

例如:

在构建脚本中:

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

在 gitlab ci 输出控制台中:

INFO: stopping nginx. pid [2741]

kill $(cat /opt/nginx/logs/nginx.pid) # with a spinning wheel

在 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

所以:

不是sudo kill $(cat /opt/nginx/logs/nginx.pid) 将执行,而是sh -c sudo kill $(cat /opt/nginx/logs/nginx.pid) 它挂断了,没有响应(听起来像是交互式地要求输入密码)

【问题讨论】:

这个问题unix.stackexchange.com/a/83405 有帮助吗? (即使这里不涉及 ssh) 【参考方案1】:

它对我有用,正如 Reactgular 所写。 但有一点澄清。您必须在之前添加% 符号gitlab-runner ALL = (ALL) NOPASSWD: ALL。 很长一段时间我都无法理解为什么它对我没有帮助。然后我放了百分比图标,它就起作用了。

【讨论】:

为了澄清您描述的确切机会,请使用例如比如“将wrong code 更改为right %code”。 (看看***.com/editing-help )理想情况下解释为什么这是必要的,或者至少解释语法的含义。然后我会认为这是一个可接受的“增量答案”,否则它可以被视为对另一个答案的评论,即可标记为“不是答案”。祝你好运。【参考方案2】:

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

授予 sudo 权限

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

$ sudo usermod -a -G sudo gitlab-runner

您现在必须为gitlab-runner 用户删除sudo 的密码限制。

启动 sudo 编辑器

$ sudo visudo

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

gitlab-runner ALL=(ALL) NOPASSWD: ALL

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

SSH 运行器

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

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

【讨论】:

除了允许所有命令到 gitlab-runner 之外,还可以允许一个命令,例如只允许 npm (source)。 gitlab-runner ALL=(ALL) NOPASSWD: /usr/bin/npm如果你这样做,你就不需要把用户添加到root组,你的系统会更安全。 如何使用 github CI/CD 实现这一目标? 运行您发布的第一个命令时出现错误=>“sudo : usermod command not found”

以上是关于如何在 gitlab ci 的构建脚本中使用 sudo?的主要内容,如果未能解决你的问题,请参考以下文章

gitlab ci 脚本在哪个 $?允许为非零

如何使用GitLab和Rancher构建CI/CD流水线 – Part 2

如何在Gitlab CI脚本中删除符号链接的目标?

使用 GitLab CI 通过 python 脚本部署到 FTP

构建后的测试将在 gitlab-ci 上的新环境中运行

如何在 .gitlab-ci.yml 中指定通配符工件子目录?