jenkins集成docker自动化部署

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集成需要很多插件,介绍一个中文插件安装步骤如下,其他插件安装步骤差不多
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200503165828451.png
需要的插件有
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完毕,溜了…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值