jenkins介绍
1、Jenkins 是一款流行的开源持续集成(Continuous Integration)工具,广泛用于项目开发,具有自动
化构建、测试和部署等功能。官网: http://jenkins-ci.org/
Jenkins的特征:
开源的 Java语言开发持续集成工具,支持持续集成,持续部署。
易于安装部署配置:可通过 yum安装,或下载war包以及通过docker容器等快速实现安装部署,
分布式构建:支持 Jenkins能够让多台计算机一起构建/测试。
文件识别: Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如 git,svn,maven,docker等。
2、Jenkins安装和持续集成环境配置
持续集成流程说明
1 )首先,开发人员每天进行代码提交,提交到Git仓库
2)然后,Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,
Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新
再执行一次整个流程。
3)最后,Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。
jenkins安装与配置
1)安装JDK
Jenkins需要依赖JDK,所以先安装JDK1.8
yum install java-1.8.0-openjdk* -y
安装目录为:/usr/lib/jvm
2)获取jenkins安装包
下载页面:https://jenkins.io/zh/download/
安装文件:jenkins-2.190.3-1.1.noarch.rpm
3)把安装包上传到47.93.130.192服务器,进行安装
rpm -ivh jenkins-2.190.3-1.1.noarch.rpm
4)修改Jenkins配置
vi /etc/syscofig/jenkins
修改内容如下:
JENKINS_USER=“root”
JENKINS_PORT=“8888”
5)启动Jenkins
systemctl start jenkins
6)打开浏览器访问
http://47.93.130.192:8888
注意:本服务器把防火墙关闭了,如果开启防火墙,需要在防火墙添加端口
7)获取并输入admin账户密码
cat /var/lib/jenkins/secrets/initialAdminPassword
登陆之后的页面
由于与docker集成需要很多插件,介绍一个中文插件安装步骤如下,其他插件安装步骤差不多
需要的插件有
Chinese 中文汉化
Credentials Binding 管理凭据
Maven Integration Maven项目构建
Pipeline 流水线项目构建 (本文基于jenkins的流水线语法进行构建)
然后需要配置git和maven的工作目录。需要在你的服务器上安装
全局配置
凭据,百度吧,不难,我创建了2个,一个是gitee登录凭据,一个是ssh通道,下载代码用的
jenkins基础配置到此为止
环境准备
代码整个目录结构如下
EurekaserverApplication .java
package com.wangtao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@SpringBootApplication
@RestController
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
//用来测试 是否镜像容器是否成功
@RequestMapping("/user")
public Object findUser(){
Map<String, String > map = new HashMap<>();
map.put("name", "xuxiaoxiao");
map.put("age","3");
return map;
}
}
application.yml
server:
port: 7001
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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wangtao</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>1.3.6</version>
<executions>
<!--package生命周期进行镜像打包推送-->
<!--<execution>
<id>default</id>
<goals>
<goal>build</goal>
<goal>push</goal>
</goals>
</execution>-->
</executions>
<configuration>
<repository>192.168.1.5:5000/test/${project.artifactId}</repository>
<tag>${project.version}</tag>
<buildArgs>
<!--提供参数向Dockerfile传递-->
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<!--使用maven配置推送镜像-->
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
</configuration>
</plugin>
</plugins>
</build>
</project>
Dockerfile (名称不能改)
#FROM jdk1.8
FROM openjdk:8-jdk-alpine
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
EXPOSE 7001
ENTRYPOINT ["java","-jar","app.jar"]
Jenkinsfile (名称不能改)
//gitee的凭证
def git_auth="891a5a03-2bcd-4d58-aab5-e8370db19d54"
//gitee项目地址
def git_url="git@gitee.com:wangtao19950814/demo.git"
//构建版本的名称
def tag="latest"
node {
stage('拉取代码') {
echo "准备从代码库下载代码"
checkout([$class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_url}"]]])
}
stage('编译,安装公共子工程') {
//编译并安装公共工程
//这块子工程指的是分布式项目中的公共模块,我这没有,注释掉 (xxx:模块名称)
//sh "mvn -pl xx clean install"
}
stage('编译,打包微服务工程,上传镜像') {
//执行构建本地镜像检查
sh "sh /wangtao/shell/build1.sh $project_name $tag $port"
//编译,构建本地镜像
sh "mvn clean package dockerfile:build"
echo "镜像构建成功"
}
stage('启动容器') {
echo "启动容器"
sh "docker run -d -p $port:$port --name=$project_name $project_name:$tag"
echo "容器${project_name}启动成功:监听端口号:${port}"
}
}
java环境到此结束
脚本文件 build1.sh
#! /bin/sh
#接收外部参数
project_name=$1
tag=$2
port=$3
echo "project_name:${project_name},tag:${tag},port:${port}"
#查询容器是否存在,存在则删除
containerId=`docker ps -a | grep -w ${project_name}:${tag} | awk '{print $1}'`
echo "containerId为${containerId}"
if [ "$containerId" != "" ] ; then
#停掉容器
docker stop $containerId
#删除容器
docker rm $containerId
echo "成功删除容器"
fi
#查询镜像是否存在,存在则删除
imageId=`docker images | grep -w $project_name | awk '{print $3}'`
if [ "$imageId" != "" ] ; then
#删除镜像
docker rmi -f $imageId
echo "成功删除镜像"
fi
echo "准备开始构建镜像"
ok,环境准备到此结束,代码全部推送gitee上
运行测试
jenkins新建一个demo_pipeline流水线项目 配置如下
参数化构建过程
branch 参数是用来选择不同分支代码构建的,我这2个分支master和v1
project_name 是项目名称,一般聚合项目有很多工程,我这只有一个demo
port 是项目端口号
这是git的配置,下面有一个流水线语法链接,有兴趣的可以去看看,我这脚本基本上是根据这个链接去生成的
回到项目界面
这些是流水线项目特有的,很清楚可以看到每个生命周期都做了些什么
点击这个,进去
可以看到项目的构建日志,构建成功,
我们打开 http://47.93.130.192:7001/user
可以看到可以访问成功,我们修改一下age字段值为2,再次推送到gitee上,点击jenkins的构建,再次打开 http://47.93.130.192:7001/user
可以看到age字段已被修改
服务器上的镜像和容器如下
至此,jenkins集成docker完毕,溜了…