通过Jenkins pipeline build Maven项目

2022-05-30 14:29:50 浏览数 (1)

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

1)安装 JDK 及 Maven

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

代码语言:javascript复制
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 容器:

代码语言:javascript复制
docker stop jenkins gitlab
docker rm jenkins gitlab

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

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

代码语言:javascript复制
docker network create devopNet

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

代码语言:javascript复制
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 这样:

代码语言:javascript复制
Host gitlab.telbox.cn
    Hostname gitlab.telbox.cn
    Port 9182
    User dhyuan

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

代码语言:javascript复制
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

配置 Maven

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

代码语言:javascript复制
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 的运行了。

以上只是个基本步骤适合小团队环境devops环境的搭建。物质条件较好、人力配置强的工作环境中可基于k8s来做或者直接利用Openshift直接提供的功能。

0 人点赞