我有一个
mvn
项目,必须以非 root 用户身份构建
但默认情况下 gitlab-ci 允许运行者以 root 用户身份运行。
我通过设置 gitlab.com
文件来使用 gitlab-ci.yml
跑步者。
我尝试创建一个用户并像这样切换到它:
$ useradd ***
$ su -***
$ whoami
root
它仍然说我是root。 我该如何解决这个问题?
您可以使用
sudo
轻松实现此目的,例如,
摘自我的 .gitlab-ci.yml:
script:
- useradd -d /builds/{GITLAB_USER} -g users -M -N builder
- chown -R builder:users ..
- |
sudo -H -i -u builder sh -e -x << EOS
umask 0077
export CONTINUOUS_INTEGRATION_SYSTEM="gitlab" TIMESTAMP=`date +%Y%m%d%H%M%S` DEFAULT_TARGET="debug"
export PREFIX="\${HOME}/usr" SYSCONFDIR="\${HOME}/etc/conf" LOCALSTATEDIR="\${HOME}/var"
cd my-project
make install
make -C _deploy/debian clean package bundle BUILD_ID="-0{other}\${TIMESTAMP}"
EOS
其中 {GITLAB_USER} 是您实际的 gitlab 用户。 请记住在脚本中转义 $
只需为正确的用户安装 gitlab-runner 服务即可:
gitlab-runner install --working-directory /home/ubuntu --user ubuntu
这里,
ubuntu
是任意非root用户。
sudo gitlab-runner install --working-directory /home/username --user username
您需要 root 身份才能使用
--user
标志进行安装,这样您就可以作为非特权用户运行 gitlab-runner。
最后,我使用 Dockerfile 构建了一个基础镜像,其中包括允许新用户使用 sudo:
RUN yum makecache \
&& yum -y install shadow-utils sudo \
&& /usr/sbin/useradd -d /builds -g users -M -N builder \
&& echo 'builder ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
USER builder
然后修复管道文件中
/builds
部分中的before_script
权限:.gitlab-cy.yml
before_script:
- sudo /bin/chown -R builder:users /builds
script:
- ...
以下是我在 Vagrant VM 中为非 root 用户设置
gitlab-runner
的方法(也应该适用于非 VM 机器):
ps aux | grep gitlab
/usr/bin/gitlab-runner run --config /etc/gitlab/runner/config.toml --service gitlab-runner
gitlab-runner
systemd 服务:sudo systemctl stop gitlab-runner
如果您再次输入
ps aux | grep gitlab
,该进程不应再出现。
卸载现有用户的“gitlab-runner”服务:
sudo gitlab-runner uninstall
# Copy over the default 'gitlab-runner' config to the user's home directory
mkdir -p ~/.config/gitlab-runner
sudo cp /etc/gitlab-runner/config.toml ~/.config/gitlab-runner/
sudo chown $USER:$USER ~/.config/gitlab-runner/config.toml
chmod 600 ~/.config/gitlab-runner/config.toml
sudo gitlab-runner install \
--service gitlab-runner \
--user $USER \
--working-directory /home/$USER \
--config /home/$USER/.config/gitlab-runner/config.toml
sudo systemctl daemon-reload
gitlab-runner
systemd 服务:sudo systemctl start gitlab-runner
ps aux | grep gitlab
vagrant
):/usr/bin/gitlab-runner run --working-directory /home/vagrant --config /home/vagrant/.config/gitlab-runner/config.toml --service gitlab-runner --user vagrant
有多种方法可以实现这一点。 由于 gitlab-ci 作业只是运行进程的 docker 容器, 实现这一目标的一种方法 就是使用 gosu ,您可以以非 root 用户身份运行进程。 一些显示如何使用 gosu 的链接: