在Docker中运行gocd

时间:2023-03-09 03:42:16
在Docker中运行gocd

gocd是一个持续集成的工具,可视化效果非常好

运行gocd-server

1
2
3
4
5
docker run -d --name server 
-p8153:8153 -p8154:8154
-v /path/to/godata:/godata
-v /path/to/go:/home/go
gocd/gocd-server:v18.1.0

我们就可以通过http://go-server-ip:8153来访问gocd-server的web了

运行gocd-agent

1
2
3
4
5
6
7
docker run -d --name gocd 
-e AGENT_AUTO_REGISTER_KEY=53f57d90-c749-4758-b430-5af341117b0e
-e AGENT_AUTO_REGISTER_RESOURCES=diagnosis,bj
-e AGENT_AUTO_REGISTER_ENVIRONMENTS=bj
-e AGENT_AUTO_REGISTER_HOSTNAME=diagnosis_bj
-e GO_SERVER_URL=https://go-server-ip:8154/go
gocd/gocd-agent-centos-7:v18.1.0

其中AGENT_AUTO_REGISTER_KEY是在gocd-server的配置中。
执行完之后,就可以在web中看到添加的agent。

安装插件

1
2
cd /path/to/godata/plugins/external
wget https://github.com/gocd-contrib/script-executor-task/releases/download/0.3/script-executor-0.3.0.jar

DOOD

我们通常希望在agent中执行docker命令在宿主中建立镜像运行容器网上大家把这种技术称之为DOOD(docker outside of docker)。
docker命令只能在root权限下执行,但是gocd的脚本是在go用户下运行的所以会报错,解决办法就是想办法让脚本切换到root下运行脚本,具体办法如下:

创建su文件

su的文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#%PAM-1.0
auth sufficient pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
auth sufficient pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth required pam_wheel.so use_uid
auth substack system-auth
auth include postlogin
account sufficient pam_succeed_if.so uid = 0 use_uid quiet
account include system-auth
password include syste 大专栏  在Docker中运行gocdm-auth
session include system-auth
session include postlogin
session optional pam_xauth.so

创建dockerfile制作dood-gocd镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM gocd/gocd-agent-centos-7:v18.1.0
RUN yum install -y yum-utils
device-mapper-persistent-data
lvm2
RUN yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
RUN yum install -y docker-ce
RUN yum -y install sudo
RUN echo 'go ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
RUN gpasswd -a go wheel
COPY su /etc/pam.d/su
RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

这里的root方案就是在脚本中调用su root切换到root账户,并且取消输入密码。

1
2
3
4
5
6
7
8
9
10
docker build -t gocd-agent-dood .

docker run -d --name gocd 
-e AGENT_AUTO_REGISTER_KEY=53f57d90-c749-4758-b430-5af341117b0e
-e AGENT_AUTO_REGISTER_RESOURCES=diagnosis,bj
-e AGENT_AUTO_REGISTER_ENVIRONMENTS=bj
-e AGENT_AUTO_REGISTER_HOSTNAME=diagnosis_bj
-e GO_SERVER_URL=https://go-server-ip:8154/go
-v /var/run/docker.sock:/var/run/docker.sock
gocd-agent-dood

上面命令里的挂载就是把宿主机的docker.sock挂载到容器中,这样我们就能在gocd-agent-dood的容器中运行dock命名在宿主机上创建镜像运行容器了。

script如下:

1
2
3
4
su - root <<EOF
xxx
xxx
xxx