通过Jenkins pipeline build Maven项目

如之前的文章安装 CoreDNS、GitLab、Jenkins 容器 所述熟悉了基本的容器安装之后就可以配置 Jenkins pipeline 构建基于 maven 的 Java 项目了。

1)安装 JDK 及 Maven

不要通过 apt install 的方式安装,而通过下载 zip 解压的方式安装。

mkdir -p /home/devops/dockerSrvStorage/jenkins/tools/
cd /home/devops/dockerSrvStorage/jenkins/tools/
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
tar xvzf openjdk-11+28_linux-x64_bin.tar.gz
wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.zip
unzip apache-maven-3.8.1-bin.zip

2)启动 GitLab、Jenkins 容器。

停止并删除旧的 Jenkins, GitLab 容器:

docker stop jenkins gitlab
docker rm jenkins gitlab

Jenkins 和 GitLab 容器的互联互通至少有下面两种方式。一种是通过先定义出一个 network,然后 Jenkins 和 GitLab 加入这个网络来完成,这时容器间的访问是在 docker 自己内部网络上完成的而与宿主机 IP 无关。。一种是通过外部 DNS Server 完成容器间域名字的解析,这时容器间的访问是通过宿主机的 IP+映射到宿主机的端口完成的。

docker 网络内部互联的方式,如果是跨主机容器间通讯可以通过 overlay 完成。(如果跨主机这种方式,就没有理由不上 K8S 了。)下面是用于在同一宿主机下的命令:
首先创建一个网络:

docker network create devopNet

启动 Jenkins 和 GitLab 容器,注意这里通过–net 设定它们的网络都是 devNet

docker run --detach \
--name jenkins \
--net devopNet \
--hostname jenkins.telbox.cn \
--publish 9183:8080 --publish 9184:50000 \
--restart always \
-v /home/devops/dockerSrvStorage/jenkins:/var/jenkins_home \
jenkins/jenkins:2.277.4-lts-jdk11

docker run --detach \
--name gitlab \
--net devopNet \
--hostname gitlab.telbox.cn \
--publish 9181:443 --publish 9180:80 --publish 9182:22 \
--restart always \
-v /home/devops/dockerSrvStorage/gitlab/config:/etc/gitlab \
-v /home/devops/dockerSrvStorage/gitlab/logs:/var/log/gitlab \
-v /home/devops/dockerSrvStorage/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:13.11.3-ce.0

通过 DNS 来通许的容器,相当于容器可以使用传入的 DNS 服务,也就可以通过 DNS 中定义的机器名通讯了。这样 jenkins 容器和 gitlab 容器运行在不同的主机,DNS 解析不同宿主机 IP/域名。这种情形, Jenkins 容器 ssh 到非 22 的 GitLab 上(假设 gitlab 容器映射 22 端口到其宿主机的 9182 端口),那么就需要设置 Jenkins 里 ssh config 文件。比如下面的/home/devops/dockerSrvStorage/jenkins/.ssh/config 这样:

Host gitlab.telbox.cn
    Hostname gitlab.telbox.cn
    Port 9182
    User dhyuan

这样在 jenkins 容器的 ssh 才能默认连接到 gitlab 容器宿主机的 9182 端口。

docker run --detach \
--name jenkins \
--dns 192.168.0.114 \
--hostname jenkins.telbox.cn \
--publish 9183:8080 --publish 9184:50000 \
--restart always \
-v /home/devops/dockerSrvStorage/jenkins:/var/jenkins_home \
jenkins/jenkins:2.277.4-lts-jdk11

docker run --detach \
--name gitlab \
--dns 192.168.0.114 \
--hostname gitlab.telbox.cn \
--publish 9181:443 --publish 9180:80 --publish 9182:22 \
--restart always \
-v /home/devops/dockerSrvStorage/gitlab/config:/etc/gitlab \
-v /home/devops/dockerSrvStorage/gitlab/logs:/var/log/gitlab \
-v /home/devops/dockerSrvStorage/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:13.11.3-ce.0

另外,之前使用的 GitLab 容器镜像 gitlab/gitlab-ce:13.9.2-ce.0 的 Integration-Jenkins CI 部分有 bug,换用 gitlab/gitlab-ce:13.11.3-ce.0 后 webhook 就可以工作了。

3)配置 Jenkins 使用 JDK、Maven, 如图:

配置 JDK
设置JDK

配置 Maven
设置JDK

4)通过 ssh-gen 生成 RSA 公私钥对,并配置 Jenkins 和 GitLab

ssh-keygen -t rsa -b 2048 -C "Used for dhyuan GitLab"

把生成的私钥通过 Jenkins 界面:Dashboard –> Credentials –> System Global credentials 设置为 GitLab 账号的私钥。

把生成的公钥通过 GitLab 界面进行设置, 如下图:

4)创建一个 Pipeline 项目并以从 GitLab 获取 Jenkinsfile 的形式定义 pipeline。

设置 pipeline 文件来自 git 管理的仓库:

需要注意的是,如果 branch 设置为*/master,那么就不要勾选 Lightweight checkout。如果勾选了 Lightweight checkout
,可把 branch 设置为*/*。

设置 pipeline 可由 GitLab 代码仓库事件触发执行,并在其高级选项中生成 Secret token。

5) 设置当 GitLab 发生 push 等操作是触发 Jenkins Pipeline 运行。

如图设置完毕就可以通过点击测试按钮发送“push”消息来触发 pipeline 的运行了。