jenkins是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
Jenkins可以构建一个自动化的持续集成环境可以使用它来“自动化”编译、打包、分发部署应用,它兼容ant、maven、gradle等多种第三方构建工具,同时与svn、git能无缝集成,也支持直接与知名源代码托管网站,如github、bitbucket直接集成。
开发push代码到gitlab,触发jenkins自动pull代码,通过maven编译、打包,然后通过执行shell脚本使docker构建镜像并push到私服(或者阿里云)仓库,此操作完成后jenkins服务器上再执行SSH命令登录到部署服务器,docker从仓库(私服)拉取镜像,启动容器。整个操作流程完成。
我是虚拟机装的Centos7,linux 3.10 内核,docker官方说至少3.8以上,建议3.10以上(ubuntu下要linux内核3.8以上, RHEL/Centos 的内核修补过, centos6.5的版本就可以——这个可以试试)
1、root账户登录,查看内核版本如下
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018
x86_64 x86_64 x86_64 GNU/Linux
2、把yum包更新到最新
[root@localhost ~]# yum update
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.cn99.com
base | 3.6 kB 00:00:00
extras | 3.4 kB 00:00:00
updates | 3.4 kB 00:00:00
正在解决依赖关系
--> 正在检查事务
---> 软件包 NetworkManager.x86_64.1.1.12.0-6.el7 将被 升级
---> 软件包 NetworkManager.x86_64.1.1.12.0-10.el7_6 将被 更新
(期间要选择确认,输入 y 即可)
3、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.cn99.com
软件包 device-mapper-persistent-data-0.7.3-3.el7.x86_64 已安装并且是最新版本
软件包 7:lvm2-2.02.180-10.el7_6.8.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 yum-utils.noarch.0.1.1.31-50.el7 将被 安装
--> 正在处理依赖关系 python-kitchen,它被软件包 yum-utils-1.1.31-50.el7.noarch 需要
...
...
4、设置yum源(选择其中一个)
yum-config-manager --add-repo http://download.docker.com/linux/centos/docker-ce.repo(中央仓库)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(阿里仓库)
[root@localhost ~]# yum-config-manager --add-repo
https://download.docker.com/linux/centos/docker-ce.repo
已加载插件:fastestmirror
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to
/etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
5、可以查看所有仓库中所有docker版本,并选择特定版本安装
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
已加载插件:fastestmirror
可安装的软件包
* updates: mirrors.cn99.com
Loading mirror speeds from cached hostfile
* extras: mirrors.aliyun.com
docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable
docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable
6、安装Docker,命令:yum install docker-ce-版本号,我选的是docker-ce-18.03.1.ce,如下
[root@localhost ~]# yum install docker-ce-18.03.1.ce
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* extras: mirrors.aliyun.com
* updates: mirrors.cn99.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker-ce.x86_64.0.18.03.1.ce-1.el7.centos 将被 安装
7、 启动Docker,命令:systemctl start docker,然后加入开机启动,如下
[root@localhost ~]# systemctl start docker
[root@localhost ~]# systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
[root@localhost ~]# docker version
Client:
Version: 18.03.1-ce
API version: 1.37
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:20:16 2018
OS/Arch: linux/amd64
Experimental: false
Orchestrator: swarm
Server:
Engine:
Version: 18.03.1-ce
API version: 1.37 (minimum version 1.12)
Go version: go1.9.5
Git commit: 9ee9f40
Built: Thu Apr 26 07:23:58 2018
OS/Arch: linux/amd64
Experimental: false
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Docker添加阿里云镜像加速器,以便于docker在pul拉取l镜像文件的时候速度快些。
1、创建docker文件夹
[root@nginx-1 ~]# vi /etc/docker/daemon.json
2、编辑 daemon.json 文件
[root@nginx-1 ~]# vi /etc/docker/daemon.json
3、设置加速器地址
{
"registry-mirrors": ["https://k9e55i4n.mirror.aliyuncs.com"]
}
4、重新加载和重启docker
[root@nginx-1 ~]# systemctl daemon-reload
[root@nginx-1 ~]# systemctl restart docker
5、部署jenkins
#拉取Jenkins官方提供的集成blueocean插件的镜像
docker pull jenkinsci/blueocean
#运行容器
docker run -d --name jenkins -u root -p 14639:8080 -p 50000:50000 --privileged=true -v /var/jenkins_home:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock jenkinsci/blueocean
参数说明:
-d:守护进程的方式启动容器,不打印正在运行的此容器的Docker日志。(或 -it:交互的方式启动容器,打印容器的启动日志信息,相当执行了一遍 docker logs -f jenkins )。
-p:将容器的8080端口映射到宿主机的8888端口。
-v:挂载目录(宿主机目录:容器目录);挂载后,修改宿主机的挂载目录将直接影响到容器的目录。
--name:容器的名称。
--privileged:使用该参数,container内的root拥有真正的root权限。
jenkinsci/blueocean:指定镜像名。
6、访问jenkins
在浏览器上填入 http://<你的ip>:14639
失败:如果无法访问请检查系统防火墙或开端口。
#CentOS7关防火墙
systemctl stop firewalld
#开放端口
firewall-cmd --zone=public --add-port=14639/tcp --permanent
firewall-cmd --reload
7、手动配置Jenkins
Jenkins初始化
出现如下页面,需要我们手动获取Admin初始密码。
#进入容器
docker exec -it jenkins /bin/bash
#查看初始密码
cat /var/jenkins_home/secrets/initialAdminPassword
复制输出的内容,粘贴到Administrator password。此时进行下一步你会看到此界面,点击 Install suggested plugins
等待安装完毕:
漫长的等待之后到了下一步,创建admin用户:
到这里,整个初始化Jenkins结束了,接下来是配置环境了……
我们需要下载一个maven,然后配置自己公司setting.xml,比如私服地址。前面我们没有退出容器(也就是执行exit命令),如果退出了容器的朋友,可以执行如下命令进入容器,最后的时候我将对docker命令进行总结。
#进入容器
docker exec -it jenkins /bin/bash
#进入安装位置
cd /usr/local
#下载maven安装包
wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz
#解压压缩包
tar -zxvf apache-maven-3.3.9-bin.tar.gz
#删除压缩包
rm apache-maven-3.3.9-bin.tar.gz
#配置maven环境变量
vi /etc/profile
在文件的最下面添加:
#set Maven environment
export MAVEN_HOME=/usr/local/maven
export PATH=$MAVEN_HOME/bin:$PATH
#生效profile文件
source /etc/profile
#检查maven是否配置成功(显示maven home、java home等信息则配置成功)
mvn -v
从本机配置好setting文件,再将该文件传输到宿主机(也就是虚拟机)中
到管理页面……
点击Manage Plugins,安装maven插件……
安装成功后,点击Global Tool Configuration,进行全局配置……
1、maven的setting提供:
2、JDK配置(jenkins默认自动带dk1.8)
3、Maven配置(之前手动安装的maven)
最后,点击 应用 并 保存!
1.gitlab镜像拉取
# gitlab-ce为稳定版本,后面不填写版本则默认pull最新latest版本
$ docker pull gitlab/gitlab-ce
2.运行gitlab镜像
$ docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v /home/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
# -d:后台运行
# -p:将容器内部端口向外映射
# --name:命名容器名称
# -v:将容器内数据文件夹或者日志、配置等文件夹挂载到宿主机指定目录
3.配置
按上面的方式,gitlab容器运行没问题,但在gitlab上创建项目的时候,生成项目的URL访问地址是按容器的hostname来生成的,也就是容器的id。作为gitlab服务器,我们需要一个固定的URL访问地址,于是需要配置gitlab.rb(宿主机路径:/home/gitlab/config/gitlab.rb)。
# gitlab.rb文件内容默认全是注释
$ vim /home/gitlab/config/gitlab.rb
# 配置http协议所使用的访问地址,不加端口号默认为80
external_url 'http://192.168.199.231'
# 配置ssh协议所使用的访问地址和端口
gitlab_rails['gitlab_ssh_host'] = '192.168.199.231'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # 此端口是run时22端口映射的222端口
:wq #保存配置文件并退出
# 重启gitlab容器
$ docker restart gitlab
此时项目的仓库地址就变了。如果ssh端口地址不是默认的22,就会加上ssh:// 协议头
打开浏览器输入ip地址(因为我的gitlab端口为80,所以浏览器url不用输入端口号,如果端口号不是80,则打开为:ip:端口号)
idea 创建springboot 的helloworld项目
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1</version>
<name>helloworld</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<finalName>app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<!--镜像名,这里用工程名-->
<imageName>${project.artifactId}:${project.version}</imageName>
<!--DockerFile文件所在目录-->
<dockerDirectory>src/main/docker</dockerDirectory>
<!--构建镜像的配置信息-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!-- docker配置,允许远程访问 -->
<dockerHost>http://10.2.130.179:2375</dockerHost>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<!-- Docker maven plugin -->
</plugins>
</build>
</project>
Dockerfile
FROM java:8
MAINTAINER luzc
COPY app.jar /
ENTRYPOINT ["java","-jar","app.jar"]
点击 新建Item ,出现如下页面……
1、进入Item,配置你的任务……
git配置
添加一个git的凭据提供者,填写git的账号和密码,然后Credentials选择刚刚添加的凭据者。
配置Pre Steps(使用shell脚本对已存在的容器进行停止容器,删除容器,删除镜像)
#!/bin/bash
result=$(docker ps| grep "hello-world")
if [[ "$result" != "" ]]
then
echo "================docker stop hello-world================"
docker stop dec-netty
fi
result1=$(docker ps -a | grep "hello-world")
if [[ "$result1" != "" ]]
then
echo "================docker rm hello-world================"
docker rm hello-world
fi
result2=$(docker images | grep "hello-world:0.0.1")
if [[ "$result2" != "" ]]
then
echo "================docker rmi hello-world:0.0.1================"
docker rmi hello-world:0.0.1
fi
#maven命令(通过DockerFile将项目构建成docker镜像)
clean package docker:build
#运行容器
docker run -d --name helloworld -p 12025:8080 helloworld :0.0.1
echo '================ 运行容器日志信息 ================'
最后,点击 应用 并 保存!
点击第2步的构建列队中的任务,查看任务的日志信息……
显示Finished: SUCCESS,则说明Jenkins自动构建成功!!!
测试结果