【Jenkins 高级篇】之 Jenkins 持续交付实战

Jenkins持续交付实战

实现项目:JeeSite4

这里使用的是开源项目:JeeSite4(JAVA项目模板)

源码位置:https://gitee.com/yj-l/JeeSite4

原始工程源码:https://gitee.com/thinkgem/jeesite4

项目目录结构

# 多模块组合项目
-	基础公共引擎模块 common
-	核心系统模块 core
-	模块示例模板 template
-	模块父节点 parent
-	入口模块 root
-	web模块 web
-	Deploy 部署代码

环境准备

mysql(JeeSite4版本需要mysql 8) + java + maven

mysql

  • 安装

    docker pull mysql:8
    
  • 创建目录用来存放相关的配置、日志、数据

    
    mkdir -p /root/mysql/log/
    mkdir -p /root/mysql/conf/
    mkdir -p /root/mysql/data/
    touch /root/mysql/my.cnf
    
    

    my.cnf文件内容如下

    [mysqld]
    user=mysql
    character-set-server=utf8
    default_authentication_plugin=mysql_native_password
    secure_file_priv=/var/lib/mysql
    expire_logs_days=7
    sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
    max_connections=1000
    
    [client]
    default-character-set=utf8
    
    [mysql]
    default-character-set=utf8
    
    
  • 运行

    docker run -di -p 3306:3306 --privileged=true -v /root/soft/docker-mysql/log:/var/log/mysql -v /root/soft/docker-mysql/data:/var/lib/mysql -v /root/soft/docker-mysql/conf/:/etc/mysql -v /root/soft/docker-mysql/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:8
    
    #-e MYSQL_ROOT_PASSWORD=root:mysql数据库密码设置为root
    #--privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
    
  • 使用mysql连接工具navicat测试安装是否成功

java开发环境安装

  • 下载

    https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

  • 安装

    centOS:yum install java-1.8-openjdk* -y
    ubuntu:apt-get install oracle-java8-installer
    mac:brew cask install java
    
  • 解压安装,并配置环境变量

    将JDK运行程序直接解压到本地路径,然后配置环境变量 vim /etc/profile

    JAVA_HOME=<jdk root path>
    export PATH=$PATH:$JAVA_HOME/bin
        
    
  • java环境安装正确的验证

    java -version
    
  • IntelliJ IDEA配置JDK

    • File --> Project Structure --> SDK,添加选中jdk安装目录

      【Jenkins 高级篇】之 Jenkins 持续交付实战

    • File --> Project Structure --> Project

      【Jenkins 高级篇】之 Jenkins 持续交付实战

Maven环境安装

  • 下载

    https://maven.apache.org/download.cgi

    或者

    wget http://mirrors.cnnic.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
    
    
  • 下载文件:zip或者tar格式压缩包,带bin字样的表明是可以直接运行的二进制文件

  • 将安装包解压到本地路径,然后配置环境变量vim /etc/profile

    # tar -zxvf apache-maven-3.6.3-bin.tar.gz
    
    export M2_HOME=<maven root path>
    export PATH=$PATH:$M2_HOME/bin
        
    
    

    source /etc/profile

  • 验证Maven安装成功

    mvn -version
    
  • 在IntelliJ IDEA中配置maven

    • File | Settings | Build, Execution, Deployment | Build Tools | Maven 配置
    • Maven home directory:D:\environment\apache-maven-3.8.1
    • 重启IntelliJ IDEA

加速依赖包下载方法,在settings.xml中添加阿里云镜像

maven下载java的很多依赖包,如果服务器是在国外,需要保证网络互通(避免通讯故障),这时就需要配置镜像库,apache-maven-3.6.3/conf/settings.xml

  <mirror>  
		<id>alimaven</id>  
		<name>aliyun maven</name>  
		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
		<mirrorOf>central</mirrorOf>          
 </mirror>

【Jenkins 高级篇】之 Jenkins 持续交付实战

项目配置、调式、运行

数据库准备

  • 创建jeesite数据库

    create database `jeesite`;
    
  • 检查数据创建结果

    刷新查看是否创建成果

  • 初始化数据导入

    • 打开 JeeSite4\web\src\main\resources\config\application.yml,填写数据库配置(IP、端口、用户名、密码)

    • 进入项目路径 jeesite4/web/bin

    • 运行数据初始化脚本程序init-data.sh(windows batch command : init-data.bat)

      D:JeeSite4\web\bin>init-data.bat
      

      初始化成功,如下图:

      【Jenkins 高级篇】之 Jenkins 持续交付实战

    • 然后到查看数据库是否添加46张表

IDE里配置项目

  • 项目 JeeSite4\root\pom.xml Maven 根节点到IDE的maven view中

    • 使用IntelliJ IDEA,打开root/pom.xml

    • pom.xml,在文件内容中右键点击add the maven 或者 按下图的步骤,导入后需要等一会

      【Jenkins 高级篇】之 Jenkins 持续交付实战

      【Jenkins 高级篇】之 Jenkins 持续交付实战

  • 其余依赖module会根据配置一起导入

在IDE在Maven编译、打包项目
  • 编译打包

    • maven view中选中JeeSite RootLifecycle中的Clean + Install(ctrl+单击选中),然后单击运行按钮

    【Jenkins 高级篇】之 Jenkins 持续交付实战

    • 打包成功,如下图:

      【Jenkins 高级篇】之 Jenkins 持续交付实战

  • IDE里直接运行项目

    • 在Run/Debug Configurations中添加Spring Boot

    • 配置Main class:com.jeesite.modules.Application

      【Jenkins 高级篇】之 Jenkins 持续交付实战

    • 运行项目 ,浏览器访问:http://localhost:8980/a/login

      【Jenkins 高级篇】之 Jenkins 持续交付实战

命令行里编译、打包项目
  • 进入项目的root模块所在的目录,然后运行mvn clean install 命令执行项目编译

    D:\java-project\JeeSite4\root>mvn clean install
    
    
    • 打包成功,如下图:

      【Jenkins 高级篇】之 Jenkins 持续交付实战

  • IDE 里面运行项目

    • 展开JeeSite Web -> Plugins -> Spring Boot:run,直接双击运行

      【Jenkins 高级篇】之 Jenkins 持续交付实战

命令行里运行项目
  • 进入jeesite4/web目录下,运行

    mvn clean spring-boot:run -Dmaven.test.skip=true
    
浏览器里访问验证web应用启动的正确性
http://localhost:8980/
管理员用户名/密码:system/admin

脚本部署,并部署到jenkins进行持续交付部署

  • 准备脚本deploy/start_spring-boot.sh

    #!/usr/bin/env bash
    
    ## 检查系统类型
    export os_type=`uname`
    
    ## 停止spring-boot函数
    killSpringBoot()
    {
        pid=`ps -ef|grep spring-boot|grep java|awk '{print $2}'`
        echo "spring-boot list :$pid"
        if [ "$pid" = "" ]
        then
          echo "no spring-boot pid alive"
        else
          kill -9 $pid
        fi
    }
    
    ## Kill 当前正在运行的spring-boot
    killSpringBoot
    
    ## Maven 编译
    cd ${WORKSPACE}/root
    mvn clean install
    
    ## Maven 运行
    cd ${WORKSPACE}/web
    nohup mvn clean spring-boot:run -Dmaven.test.skip=true &
    
  • jenkins容器配置java、maven环境

    • 启动jenkins容器,挂载宿主机目录

      • 创建宿主机配置目录

        mkdir -p /root/soft/jenkins/conf
        vim en_config.conf
        # 内容如下 以下的环境变量与挂载宿主机的目录一致
        # maven环境变量
        export M2_HOME=/usr/local/maven
        export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
        
        # jdk
        JAVA_HOME=/usr/local/jdk/jdk1.8.0_271
        #JAVA_HOME=/root/soft/jdk/jdk1.8.0_271
        CLASSPATH=$JAVA_HOME/lib/
        PATH=$PATH:$JAVA_HOME/bin
        export PATH JAVA_HOME CLASSPATH
        
      • 在jenkins的工作目录jenkins_home目录下创建

        vim .bashrc
        
        # 避免执行没有权限,所以在启动容器时要加上-u root或者-u 0
        chmod 777 /etc/profile
        cat /conf/en_config.conf >> /etc/profile
        source /etc/profile
        
      • 启动jenkins容器需要加上以下内容

        -v /root/soft/jdk/jdk1.8.0_271:/usr/local/jdk/jdk1.8.0_271
        -v /root/soft/maven/apache-maven-3.6.3:/usr/local/maven
        -v /root/soft/jenkins/conf:/conf/
        -u root
        
        # 完整命令
        docker run -d --name jenkins -p 8080:8080 -p 50000:50000 -v /root/soft/jdk/jdk1.8.0_271:/usr/local/jdk/jdk1.8.0_271 -v /root/soft/maven/apache-maven-3.6.3:/usr/local/maven -v /root/soft/jenkins/conf:/conf/ -v /root/soft/jenkins/jenkins_home:/var/jenkins_home jenkins/jenkins:lts
        
  • slave节点安装git,并配置密钥

    • 安装git
    • 生成密钥
    • 公钥添加到仓库
    • 私钥配置到jenkins凭据
  • 将java、maven、Git环境配置到全局系统配置

    • 系统管理 >> 全局工具配置

      • Maven 配置

        • 默认 settings 提供

          • 文件系统中的settings文件

            • 文件路径:宿主机maven安装目录/conf/settings.xml,如下:

              /root/soft/maven/apache-maven-3.6.3/conf/settings.xml

        • 默认全局 settings 提供

          • 文件系统中的全局settings文件

            • 文件路径:宿主机maven安装目录/conf/settings.xml,如下:

              /root/soft/maven/apache-maven-3.6.3/conf/settings.xml

      • JDK(没有报错,可以先不管)

      • Git

        • name:Git
        • Path to Git executable:/usr/bin/git(通过whereis git
      • Maven

        • name:Maven
        • MAVEN_HOME:/usr/local/maven
  • 创建jenkins任务,设定部署任务

    • 限制项目的运行节点:master/node

    • 源码管理

    • 构建:

      • 执行shell

        jenkins如果在shell里使用nohup发现还是不能后台运行,直接挂掉。

        那么可以在jenkins命令里加上BUILD_ID=dontKillMe解决

        # 别杀我。避免进程随构建结束被杀掉
          #BUILD_ID=DONTKILLME
        . /etc/profile
        sh deploy/start_spring-boot.sh
        
  • 任务执行,构建完成,如下图:

    【Jenkins 高级篇】之 Jenkins 持续交付实战

https://ceshiren.com/t/topic/6238

踩坑问题

1、Maven打包报错Could not transfer artifact com.jeesite:jeesite-parent:pom:4.1.9-SNAPSHOT找不到依赖的问题

解决方案

  • 打开maven安装包下的conf/settings.xml

  • 添加国内私有镜像库,我这里添加的是阿里云的,位置要添加正确,我之前就是直接添加到最后一行了,最后才发现内容是有一块的

    <mirrors> 
    	<mirror>  
    		<id>alimaven</id>  
    		<name>aliyun maven</name>  
    		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
    		<mirrorOf>central</mirrorOf>          
     	</mirror>
    </mirrors> 
    
上一篇:java.lang.OutOfMemoryError: unable to create new native thread


下一篇:Centos7安装FFmpeg