如何在 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和Rancher构建CI/CD流水线 – Part 2