jenkins发布项目

在构建项目之前我们需要做一些配置,安装一些插件

  • 点击系统管理

docker ps 清楚 docker ps详解_docker

  • 点击插件管理

docker ps 清楚 docker ps详解_docker ps 清楚_02

  • 需要安装一下这个maven插件

docker ps 清楚 docker ps详解_docker ps 清楚_03

  • 插件安装完成之后我们需要配置一下全局工具 "系统管理>全局工具配置"

docker ps 清楚 docker ps详解_git_04


注意:安装了jdk 就不要在点自动安装了

这里需要配置一下jdk , 别名随便输入,JAVA_HOME填写安装jenkins的服务器上面的JAVA_HOME就行
如果是linux机器输入 下面的命令可以看到

[root@jk ~]# echo $JAVA_HOME
/home/vsftpd/root/jdk1.8.0_201
  • jdk配置完成之后还需要配置一下maven(前提是服务器装了maven)

docker ps 清楚 docker ps详解_java_05


和jdk配置差不多,这里要注意,如果HOME路径不存在就会报上图的错误,填写正确就不会报错,同样输入下面的命令可以看到MAVEN_HOME

[root@jk ~]# echo $MAVEN_HOME
/opt/maven/apache-maven-3.6.3
  • 暂时我们就配置这两个,点击保存、应用就可以了

docker ps 清楚 docker ps详解_java_06


到这里我们的前期准备工作已经做好了,下面可以开始正式构建项目了

  • 首先我们这里构建一个maven项目,输入自己的项目名称,点击完成。

docker ps 清楚 docker ps详解_docker ps 清楚_07

  • 然后我们进入构建配置页面,配置一下构建参数

docker ps 清楚 docker ps详解_docker ps 清楚_08

  • 这里我们使用参数化构建,选择字符参数(其他类型参数可以自己尝试一下)

选择字符参数后会出现以下界面

docker ps 清楚 docker ps详解_java_09


这里配置下项目名称(这个是可有可无的,这里主要是测试下参数化配置,后期有其他参数需要传递在详细配置)

  • 接下来是源码管理配置

docker ps 清楚 docker ps详解_docker ps 清楚_10

url输入自己的Git项目路径

Credentials 是需要验证git的登录信息

点击图中的 “添加” 按钮

输入自己登录git的用户名密码就可以

分支默认就行,如果有自己分支,输入分支名称就行

docker ps 清楚 docker ps详解_git_11

注意:这里必须在安装jenkins的服务器上安装有git才行,否则待会构建项目会报错。
  • 触发器这里选择默认就行

docker ps 清楚 docker ps详解_docker_12

  • 接下来就行构建前后执行的命令配置

docker ps 清楚 docker ps详解_docker_13

  • pre steps 为构建前执行,这里我们选择执行 shell

输入下面的执行shell 脚本的命令 (脚本文件是项目中编写好的,文章后面会给出来)

/bin/bash runPre.sh ${PRODUCT_NAME}

docker ps 清楚 docker ps详解_java_14

  • build中需要填写构建的pom.xml文件

(这里是单个项目直接填写pom.xml就行,如果是maven父子工程,填写父工程的pom.xml文件地址)

Goals and options:是构建项目执行的maven命令
(这里是通过docker-maven-plugin 插件将项目构建为一个docker镜像,shell脚本主要也是控制docker镜像的启动,停止,删除)

clean package docker:build
#需要push要私有仓库的添加下面的命令
clean package docker:build -DpushImage

Post Steps : 为构建后参数(运行脚本文件,主要是通过镜像启动容器)

/bin/bash runPost.sh ${PRODUCT_NAME}

到这里配置就OK了,点击保存退出就行

可以看到我们项目现在大概是这样的

docker ps 清楚 docker ps详解_java_15


下面我们再来看一下项目结构

docker ps 清楚 docker ps详解_docker ps 清楚_16

这里我就写了一个测试controller
Dockerfile文件可以不要(主要的之前测试了用dockerfile文件和用配置两种情况)

  • 配置文件内容如下
<build>
        <finalName>jenkins</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>
                    <!-- 基础镜像,编译为镜像时会下载jdk-->
                    <baseImage>java</baseImage> 
                    <workdir>/</workdir>
                    <cmd>["java", "-version"]</cmd>
                    <!-- 相当于 java -jar  jenkins.jar-->
                    <entryPoint>["java", "-jar", "${project.build.finalName}.jar"]</entryPoint>

                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <!-- 远程docker地址 没有配置docker远程访问的需要配置一下 -->
                    <dockerHost>http://1.1.1.1:2375</dockerHost>
                </configuration>
            </plugin>
        </plugins>
    </build>

这里对于初步接触dockerfile配置的来说可以理解为
编译docker镜像,当我们通过镜像启动容器时会执行下面的命令

  • 为docker镜像起名为${project.artifactId}:${project.version}
  • 在容器中下载并按照jdk
  • 执行 java -version 命令
  • 执行java -jar ${project.build.finalName}.jar 命令

这样容器就启动起来了。

开启docker远程访问

  • 最后在看一下shell文件(runPre.sh)
#! /bin/sh

dockerPs=`sudo docker ps | grep -w $1 | head -n 1 | awk '{print $1}'`
if [ "$dockerPs" != "" ];then
   sudo docker stop $dockerPs
   if [ $? -eq 0 ];then
      echo "$dockerPs 容器已停止"
   fi
fi

dockerPsAll=`sudo docker ps -a | grep -w $1 | head -n 1 | awk '{print $1}'`
if [ "$dockerPsAll" != "" ];then
   sudo docker rm $dockerPsAll
   if [ $? -eq 0 ];then
      echo "$dockerPsAll 容器已删除"
   fi
fi

image=`sudo docker images | grep -w $1 | head -n 1 | awk '{print $3}'`
if [ "$image" != "" ] ;then
   sudo docker rmi $image
   if [ $? -eq 0 ];then
      echo "$image 镜像已删除"
   fi
fi
  • runPost.sh
#! /bin/sh

image=`sudo docker images | grep -w $1 | head -n 1 | awk '{print $3}'`

#启动容器
sudo docker run -itd --name $1 -p 31002:31002 $image

if [ $? -eq 0 ];then
      echo "$1 容器已启动"
fi

这里注意项目文件放的位置不要随意改动。

  • 下面我们就可以开始构建项目了,点击 Build with Parameters,在点击开始构建

docker ps 清楚 docker ps详解_docker_17

  • 可以看到项目就开始构建

docker ps 清楚 docker ps详解_git_18

  • 点击 #24 这次构建进去看下日志

docker ps 清楚 docker ps详解_docker_19


这里可以看到,它是先去我们给定的git地址下载项目,然后执行我们配置好的runPre.sh 脚本

这里因为我之前构建过,所以会出现删除容器,第一次构建不会出现

然后就开始执行docker-maven的构建操作

构建完成之后就会执行我们设置的脚本 runPost.sh (启动容器)

docker ps 清楚 docker ps详解_java_20


这里可以看到容器启动成功了。

网页输入地址就可以访问到我们的程序

后面我们改了代码,直接提交git,然后点击构建项目就行

(jenkins是可以自动构建了,这里主要的初步构建,就没有在说自动构建的情况)

docker ps 清楚 docker ps详解_docker_21


服务器上输出 docker ps 可以看到我们构建的容器正在运行中

[root@jk ~]# docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                                                                        NAMES
5a9f773f94ff        759df2d31d10          "java -jar jenkins.j…"   6 minutes ago       Up 6 minutes        0.0.0.0:31002->31002/tcp                                                                     jenkin
s
079205d605c3        rabbitmq:management   "docker-entrypoint.s…"   3 days ago          Up 3 days           4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   rabbit
mq
c6f4d59b04c5        bcef5fd2979d          "docker-entrypoint.s…"   3 weeks ago         Up 8 days           0.0.0.0:27017->27017/tcp                                                                     mongo
1093a905e2cc        6678c7c2e56c          "nginx -g 'daemon of…"   4 weeks ago         Up 2 days           0.0.0.0:8081->80/tcp                                                                         nginx
4b02188b00fe        registry              "/entrypoint.sh /etc…"   4 weeks ago         Up 5 days           0.0.0.0:5000->5000/tcp                                                                       vigoro
us_williamson

注 : 第一次启动可能会报以下错误sudo: no tty present and no askpass program specified

附上解决方法