目录
一、持续集成时序图
二、Jenkins简介
三、其他软件使用及安装配置
四、Jenkins安装
五、使用Jenkins完成项目的持续集成,持续部署
( 一 ) Jenkins 初始化
( 二 ) Jenkins配置( Manage Jenkins )
( 三 ) Jenkins持续集成( CI )
六、遇到的问题及解决方法
官网链接:https://jenkins.io/zh/
用户手册:https://jenkins.io/zh/doc/
Jenkins下载:https://jenkins.io/download/
Jenkins 是一款开源 CI&CD 软件,是基于Java开发的一种持续集成工具,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
1、系统及软件版本使用情况
名称 | 版本 | 安装方法 |
---|---|---|
操作系统 | CentOS 7 | ISO 镜像安装 |
jdk | 1.8.0_201 | CentOS 安装 |
maven | 3.6.3 | CentOS 安装 |
Git | 1.8.3.1 | CentOS 安装 |
GitLab | docker.io/gitlab/gitlab-ce:latest | Docker 安装 |
registry | docker.io/registry:latest | Docker 安装 |
Jenkins | docker.io/jenkins/jenkins:lts | Docker 安装 |
Docker的安装方式及相关命令可参考:https://blog.csdn.net/DZP_dream/article/details/104670943
本次使用的版本控制工具为 Git
测试环境下,关闭防火墙 systemctl stop firewalld
2、jdk 安装
下载并安装jdk, ( 安装位置视个人情况而定,对应修改JAVA_HOME )
设置环境变量:JAVA_HOME = /opt/software/jdk1.8.0_201
3、maven 安装
下载并安装maven, ( 安装位置视个人情况而定,对应修改MAVEN_HOME)
wget http://mirror.bit.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
设置环境变量:MAVEN_HOME = /opt/software/apache-maven-3.6.3
4、设置环境变量的方法为:
打开编辑profile文件
vim /etc/profile
在文件的末尾添加jdk和maven的安装位置
export MAVEN_HOME =/opt/software/apache-maven-3.6.3
export PATH=$PATH:${MAVEN_HOME}/bin
export JAVA_HOME=/opt/software/jdk1.8.0_201
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
结束编辑并保存文件
:wq
执行文件
source /etc/profile
修改文件后,最好重启Docker.
5、GitLab安装
docker run -d \
-p 8443:443 \
-p 80:80 \
-p 222:22 \
--name gitlab \
--restart always \
--hostname 192.168.1.175 \
-v /home/gitlab/config:/etc/gitlab:Z \
-v /home/gitlab/logs:/var/log/gitlab:Z \
-v /home/gitlab/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce
配置域名和ip ,修改gitlab.rb,搜索external_url, 设置为本机的ip
cd /home/gitlab/config
vim gitlab.rb
/external_url
external_url "http://192.168.1.175"
访问http://192.168.1.175 ,如下图所示,已成功安装
6、私有仓库registry 安装
docker pull registry
docker run --name=registry -p 5000:5000 -di registry
设置私有仓库的地址
vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.175:5000"]
}
重启docker,使其生效
sudo systemctl daemon-reload
sudo systemctl restart docker
访问http://192.168.1.175:5000/v2/_catalog ,如下图所示,已成功安装
7、安装git
yum install -y git
git version
8、 mysql, redis等的安装视项目情况而定,具体安装详见之前的博客:
https://blog.csdn.net/DZP_dream/article/details/104670943
本次采用Docker安装Jenkins容器的方式
1、拉取jenkins镜像
docker pull jenkins/jenkins:lts
2、查看已经安装的jenkins镜像
docker images
3、查看是否是最新版
docker inspect ba607c18aeb7
4、创建一个jenkins目录
mkdir /home/jenkins_home
5、启动一个jenkins容器
docker run --name jenkins\
-u root\
-d\
-p 8061:8080\
-p 50000:50000\
-v /usr/bin/docker:/usr/bin/docker:Z \
-v /var/run/docker.sock:/var/run/docker.sock:Z \
-v /etc/sysconfig/docker:/etc/sysconfig/docker:Z \
-v /opt/software/jdk1.8.0_201:/opt/software/jdk1.8.0_201:Z \
-v /opt/software/apache-maven-3.6.3:/opt/software/apache-maven-3.6.3:Z \
-v /opt/software/maven-repo:/opt/software/maven-repo:Z \
-v /home/jenkins_home:/var/jenkins_home:Z \
--restart=always \
--privileged=true \
jenkins/jenkins:lts
6、查看jenkins服务
docker ps | grep jenkins
7、进入容器内部
docker exec -it jenkins bash
8、创建并启动成功,在可视化界面出现端口号为8060的jenkins容器
1、访问 http://IP地址:8060,跳转至解锁页面
2、执行以下命令,得到密码并粘贴过去,进行解锁, 并继续
[root@local ~]# docker exec -it jenkins_01 bash
jenkins@daa92a050df6:/$ cat /var/jenkins_home/secrets/initialAdminPassword
008fc9166eca49d0a8da7f6fe06c7cb7
jenkins@daa92a050df6:/$
3、自定义Jenkins, 插件安装,选择安装推荐的插件,进行安装
4、安装完成后,进入创建用户界面, 可以使用admin账户继续, 也可以创建用户.
5、开始使用Jenkins
1、全局安全配置(Configure Global Security)
为防止忘记用户名密码, 所以勾选 允许用户注册. 勾选 任何用户可以做任何事,点击保存,如图所示:
2、全局工具配置(Global Tool Configuration)
Maven 配置, 修改默认 settings 提供和默认全局 settings 提供, 选择文件系统中的settings文件,并输入文件路径:
/opt/software/apache-maven-3.6.3/conf/settings.xml
JDK 安装, 进行新增JDK, 取消勾选自动安装, 进行命名, 并输入JAVA_HOME的路径:
/opt/software/jdk1.8.0_201
Maven 安装, 进行新增Maven, 取消勾选自动安装, 进行命名, 并输入MAVEN_HOME的路径:
/opt/software/apache-maven-3.6.3
修改完成并保存, 如下图所示:
3、插件管理(Manager Plugins)
安装插件:GitLab hook plugin , GitLab plugin等
1、在IDEA中创建springboot项目,并提交至GitLab
(1)创建springboot项目 --> New Project
(2)创建以供测试的类和方法
@RestController
@RequestMapping("/apple")
public class AppleController {
/**
* 测试方法
* @param id
* @return
* 访问路径:http://localhost:8080/apple/queryById?id=1
*/
@GetMapping(value = "/queryById")
public String queryById(@RequestParam(name = "id", required = true) String id) {
if("1".equals(id)){
return "这是id为1的数据";
}
return "没有数据";
}
}
(3)编写Dockerfile文件
FROM java:8
VOLUME /tmp
ADD apple-0.0.1-SNAPSHOT.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
(4) 在pom.xml文件中添加maven插件和docker-maven-plugin插件,并配置打包和推送仓库地址
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-surefire-plugin
true
com.spotify
docker-maven-plugin
1.0.0
${project.basedir}/src/main/resources
${project.version}
192.168.1.175:5000
true
192.168.1.175:5000/${project.artifactId}
/
${project.build.directory}
${project.artifactId}-${project.version}.jar
(5)本地测试代码
启动项目,不报错,并访问 http://localhost:8080/apple/queryById?id=1
(6)测试Dockerfile
将Dockerfile文件和maven打包的jar放到同一文件夹下,
docker build -t appledemo:v1 .
并运行,测试
docker run -d --name appledemo -p 8080:8080 appledemo:v1
访问:http://192.168.1.175:8080/apple/queryById?id=1
(7)测试 maven插件和docker-maven-plugin插件使用Dockerfile
创建文件夹mycode,并克隆项目
git clone http://192.168.1.175/dangzp/appledemo.git
进入项目文件夹,执行
cd appledemo
mvn -f pom.xml clean package -DskipTests docker:build
运行容器
docker run -d --name appledemo -p 8080:8080 apple:0.0.1-SNAPSHOT
访问:http://192.168.1.175:8080/apple/queryById?id=1, 说明测试成功
2、在Jenkins中新建任务并进行配置
(1) 名称与项目同名, 选择自由风格项目, 并创建
(2) 源码管理
选择git, 输入Repository URL ( 注意:路径到项目名 )
http://192.168.1.175/dangzp/appledemo.git
添加 用户名和密码, 在前边进行选中用户名.操作顺序入下图所示:
(3) 构建
选择执行shell,进行停止容器、删除容器、删除镜像
#!/bin/bash
result=$(docker ps | grep "apple")
if [[ "$result" != "" ]]
then
echo "stop apple"
docker stop apple
fi
result=$(docker ps -a | grep "apple")
if [[ "$result" != "" ]]
then
echo "rm apple"
docker rm apple
fi
result2=$(docker images | grep "192.168.1.175:5000/apple")
if [[ "$result2" != "" ]]
then
echo "192.168.1.175:5000/apple:0.0.1-SNAPSHOT"
docker rmi $(docker images | grep "192.168.1.175:5000/apple" | awk '{print $3}')
fi
选择:调用顶层maven目标
maven版本选择 : myMaven,并执行打包
clean package -f pom.xml -DskipTests docker:build
选择执行shell,进行 启动镜像
docker run --name apple -p 8080:8080 -idt 192.168.1.175:5000/apple:0.0.1-SNAPSHOT
3、配置钩子程序
复制Jenkins中构建触发器下的钩子url,并在GitLab中添加WebHooks,并测试,在Jenkins中项目自动构建说明配置成功。
4、自动部署测试
修改程序代码,查看Jenkins是否自动构建,并测试程序是否正常访问
* 具体配置结合项目进行差异化设置。
(一)、GitLab容器启动报错502
解决方法:1、查看容器是否完全启动, 等待容器 完全启动后访问;
2、由于虚拟机内存较小导致,需扩大虚拟机内存。
(二)、报错:/usr/bin/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint compassionate_bassi (7a208177d5e4d8e2afa3f10a391101a6361844689f8b911b5a8451bd63f659d4):
(iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 8080 -j DNAT --to-destination 172.17.0.6:8080 ! -i docker0: iptables: No chain/target/match by that name.
(exit status 1)).
解决方法:重启docker
(三)、报错:[ERROR] [ERROR] Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.dream:apple:0.0.1-SNAPSHOT: Could not transfer artifact
org.springframework.boot:spring-boot-starter-parent:pom:2.3.1.RELEASE from/to aliyun
(http://maven.aliyun.com/nexus/content/groups/public): Transfer failed for
http://maven.aliyun.com/nexus/content/groups/public/org/springframework/boot/spring-boot-starter
parent/2.3.1.RELEASE/spring-boot-starter-parent-2.3.1.RELEASE.pom and 'parent.relativePath' points at no local POM @ line 5, column 13
解决方法:查看虚拟机是否可以连接外网,重启docker, 调整网卡, 使其可以连接外网
(四)、Jenkins添加Git地址时报错:
无法连接仓库:Command "git ls-remote -h -- http://192.168.1.175/dangzp/appledemo.git HEAD" returned status code 128:
stdout:
stderr: fatal: unable to access 'http://192.168.1.175/dangzp/appledemo.git/': Failed to connect to 192.168.1.175 port 80: No route to host
无法连接仓库:Error performing git command: ls-remote -h http://192.168.1.175/dangzp/appledemo.git HEAD
解决方法:
测试环境下,关闭防火墙
systemctl status firewalld
systemctl stop firewalld
(五)、Jenkins自动部署时报错
[apple] $ /bin/sh -xe /tmp/jenkins7555650707965496885.sh
+ docker ps
/tmp/jenkins7555650707965496885.sh: 2: /tmp/jenkins7555650707965496885.sh: docker: Permission denied
+ grep 192.168.1.175:5000/apple
+ result=
Build step 'Execute shell' marked build as failure
Finished: FAILURE
解决方法:检查shell的格式是否正确
(六)、vim找不到
解决方法:安装vim
apt-get update
apt-get install -y vim
(七)、Jenkins中构建触发器下没有GitLab选项
解决方法:安装插件gitlab插件
(八)、jenkins安装插件时报错
java.net.UnknownHostException: updates.jenkins-ci.org
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
可能原因:Docker中容器或宿主机无法连网导致
解决方法:重启docker
(九)、Gitlab添加wenhooks时保错:
Url is blocked: Requests to the local network are not allowed
解决方法:进入 Admin area => Settings => Network ,然后点击 Outbound requests 右边 的“expand”按钮,如下:
(十)、打包docker镜像时保错
You don't have either docker-client or docker-client-latest installed. Please install either one and retry.
解决方法:安装docker客户端
敬请批评指正.