我的docker随笔36:定制jenkins镜像

本文涉及一种根据实际需求定制 jenkins 镜像的方法及实践。其目的是在官方镜像基础上添加自定义软件、库,以便更加适应项目的开发情况。

一、引言

官方镜像基本能实现了常见的持续集成功能,但还有一些不符合要求,因此,有必要研究制作自定义的镜像。

官方提供了各版本的脚本和 Dockerfile,可以直接用这些文件生成镜像,笔者认为,可以在官方镜像基础直接修改、新加功能。

二、技术小结

  • 根据实际情况选定jenkins版本。在该版本基础上再额外添加自定义功能。
  • 按需安装软件,如本文的镜像安装了gcc、node、golang等软件。
  • 如果涉及其它的库,可以直接在 Dockerfile 中拷贝到镜像中。

三、定制配置

笔者所涉 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

安装软件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
yum -y install gcc gcc-c++

yum -y install automake autoconf libtool make sshpass


前端的 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

从容器拿到/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[@]}" "$@"

四、最终成果

新建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
37
38
39
40
41
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

## my compile
RUN tar xf cppcheck-2.5.tar.gz && cd cppcheck-2.5 && make -j && make install && cd - && \
truetar xf valgrind-3.17.0.tar.bz2 && cd valgrind-3.17.0 && ./configure && make -j && make install && cd -




# drop back to the regular jenkins user - good practice
USER jenkins
EOF
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
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 /

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 && \
trueecho "/usr/lib64/mysql/" > /etc/ld.so.conf.d/mysql.conf

# drop back to the regular jenkins user - good practice
USER jenkins
EOF


RUN yum -y install glibc-common && \
yum -y install kde-l10n-Chinese && \
localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 && \
echo LC_ALL=\""zh_CN.utf8\"" > /etc/locale.conf

docker build -t latelee/jenkins:centos7_new -f Dockerfile_new .

构建:

1
docker build -t latelee/jenkins:centos7 .
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 控制台中文乱码,未解决。