本文涉及一种根据实际需求定制 jenkins 镜像的方法及实践。其目的是在官方镜像基础上添加自定义软件、库,以便更加适应项目的开发情况。
一、引言
官方镜像基本能实现了常见的持续集成功能,但还存在部分要求不符合实际需要。因此,有必要研究制作自定义的镜像,以加深对对 jenkins 运行机制的理解。
官方提供了各版本的脚本和 Dockerfile,可以直接用这些文件生成镜像,笔者认为,可以在官方镜像基础直接修改、新加功能。
二、技术小结
- 根据实际情况选定jenkins版本。在该版本基础上再额外添加自定义功能。
- 按需安装软件,如本文的镜像安装了gcc、node、golang等软件。
- 如果涉及其它的库,可以直接在 Dockerfile 中拷贝到镜像中。
三、定制配置
3.1 运行容器
笔者所涉 Linux 系统,均为 centos7,并且 gcc 编译器版本必须为 4.8.5。在 jenkins 官方提供的众多版本中,恰好有 centos7,镜像名称为 jenkins/jenkins:centos7。
在笔者实践中,是先运行 jenkins 容器,再进入容器中安装软件并测试的,但最终得到的仅有 Dockerfile 及必要的配置文件和脚本。本节记录在容器中安装软件的过程。
启动并用root权限进入容器:
1 2 3
| docker run -itd --name jenkins_build jenkins/jenkins:centos7 bash
sudo docker exec -it -u root jenkins_build bash
|
注:在运行容器(命令docker exec
)时,使用-u root
指定 root 权限,因为在容器中无法切换到 root 用户,而软件安装又需要该权限,因此,在运行容器时直接指定。
3.2 安装软件
安装gcc编译器及编译相关的工具软件:
1 2
| yum -y install gcc gcc-c++ yum -y install automake autoconf libtool make
|
此外,还可以安装其它软件,如:
1
| yum -y install vim sshpass wget
|
一般原则是尽量只安装必要的软件,过多软件会增加体积。
由于项目中有前端的框架,因此要安装node等工具:
1 2 3 4 5 6 7 8
| 安装前端的 node: curl --silent --location https://rpm.nodesource.com/setup_12.x | bash - 再执行: yum -y install nodejs
安装yarn: curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo yum -y install yarn
|
3.3 关闭 CSFR
从容器拿到/usr/local/bin/jenkins.sh
文件,编辑之,找到 exec java 行,在 -Duser.home="$JENKINS_HOME"
后添加:
-Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true
完整的语句为:
1
| exec java -Duser.home="$JENKINS_HOME" -Dhudson.security.csrf.GlobalCrumbIssuerConfiguration.DISABLE_CSRF_PROTECTION=true "${java_opts_array[@]}" -jar ${JENKINS_WAR} "${jenkins_opts_array[@]}" "$@"
|
注意,此步骤是为了解决 gitlab+jenkins实现 CICD 过程出现的gitlab 触发 webhooks 认证失败的问题。参见后续文章。
四、最终成果
新建myinit.sh文件,内容:
cat > myinit.sh <<-EOF
#!/bin/bash
## set golang
export GOROOT=/usr/local/go
export GOBIN=$GOROOT/bin
export PATH=$PATH:$GOBIN
export GOPATH=/vagrant/golang_linux
export GOPROXY=https://goproxy.io,direct
export MYGO=$GOPATH/golang/src/github.com/latelee
## set my locale
export LANG=en_US.utf8
export LANGUAGE=en_US.utf8
export LC_ALL=en_US.utf8
export LANG=zh_CN.utf8
export LANGUAGE=zh_CN.utf8
export LC_ALL=zh_CN.utf8
EOF
注:上述myinit.sh暂未测试通过,仅作备档。
Dockerfile 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| cat > Dockerfile <<-EOF FROM jenkins/jenkins:centos7
### I changed jenkins.sh file COPY --chown=jenkins:jenkins jenkins.sh /usr/local/bin/
# if we want to install tools USER root
RUN echo "Late Lee build" > /my.info && \ date >> /my.info
## C++ # install other tools... RUN yum -y install gcc gcc-c++ automake autoconf libtool make sshpass wget
## Node RUN curl --silent --location https://rpm.nodesource.com/setup_12.x | bash - && \ yum -y install nodejs RUN curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo && \ yum -y install yarn
## Golang RUN wget https://studygolang.com/dl/golang/go1.15.6.linux-amd64.tar.gz && \ tar zxf go1.15.6.linux-amd64.tar.gz -C /usr/local/ && \ rm -rf go1.15.6.linux-amd64.tar.gz
## Maven # ...
# need clean yum clean all
# drop back to the regular jenkins user - good practice USER jenkins EOF
|
由上述 Dockerfile 构建新的镜像,命令如下:
1
| docker build -t latelee/jenkins:centos7_new .
|
五、小结
本文只是将定制的过程步骤罗列出来,安装软件的方式多种多样,如文中直接使用 yum 安装,但有些软件可能要手动编译,比如有些项目可能还需要安装 cppcheck、valgrind 等软件。
新的用于临时测试的(后面与上面的合并)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| cat > Dockerfile_new <<-EOF FROM latelee/jenkins:centos7
### I changed jenkins.sh file COPY --chown=jenkins:jenkins --chmod=755 jenkins.sh /usr/local/bin/ COPY --chown=jenkins:jenkins --chmod=755 myinit.sh /usr/local/bin/ ADD usr.tar.bz2 /
## add maven(note: jdk already in the image) ADD apache-maven-3.8.2-bin.tar.gz /usr/local/
ENV MAVEN_HOME /usr/local/apache-maven-3.8.2
ENV GOROOT /usr/local/go ENV GOBIN /usr/local/go/bin ENV GOPROXY https://goproxy.io,direct
# seems cant pass $MAVEN_HOME here ENV PATH $PATH:/usr/local/apache-maven-3.8.2/bin:/usr/local/go/bin
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/lib64/mysql/
USER root
## set my time RUN rm -rf /etc/localtime && \ ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN ln -s /usr/lib64/libsqlite3.so.0 /usr/lib64/libsqlite3.so && \ trueln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl.so && \ trueln -s /usr/lib64/libcrypto.so.10 /usr/lib64/libcrypto.so && \ trueln -s /usr/lib64/libuuid.so.1 /usr/lib64/libuuid.so && \ trueln -s /usr/lib64/libz.so.1 /usr/lib64/libz.so
# drop back to the regular jenkins user - good practice USER jenkins
EOF
docker build -t latelee/jenkins:centos7_new -f Dockerfile_new .
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| cp -av --parents /usr/local/curl/ /tmp/dataserver_lib/
cp -av --parents /usr/include/z* /tmp/dataserver_lib/
cp -av --parents /usr/include/sqlite3* /tmp/dataserver_lib/
cp -av --parents /usr/include/openssl/ /tmp/dataserver_lib/
cp -av --parents /usr/lib64/mysql/ /tmp/dataserver_lib/
scp -r curl.tar.bz2 lijj@10.0.153.12:/tmp
scp -r include.tar.bz2 lijj@10.0.153.12:/tmp
scp -r usr.tar.bz2 lijj@10.0.153.12:/tmp
LDFLAGS += -L/usr/lib64/
链接: ln -s /usr/lib64/libsqlite3.so.0 /usr/lib64/libsqlite3.so ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl.so ln -s /usr/lib64/libcrypto.so.10 /usr/lib64/libcrypto.so ln -s /usr/lib64/libuuid.so.1 /usr/lib64/libuuid.so ln -s /usr/lib64/libz.so.1 /usr/lib64/libz.so
echo "/usr/lib64/mysql/" > /etc/ld.so.conf.d/mysql.conf
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64/mysql/
|
遗留问题
jenkins 控制台中文乱码,未解决。