jenkins 自动构建部署Springboot/vue/mysql/maven/npm/nginx项目

jenkins 自动构建部署Springboot/vue/mysql/maven/npm/nginx项目

1 服务器

  • 阿里云实例4G内存,公网ip:http://8.136.85.132
  • 安全规则
    • 8080:jenkins
    • 3344:nginx(前端)
    • 8081:后端
    • 3306:mysql
    • 22:xshell

2 xshell连接服务器

  • 如果出现服务器无法用密码连接,则用阿里云上自带的不用密码就能登陆的功能,然后执行以下操作https://blog.csdn.net/weixin_42488417/article/details/102933582
  • 之后参考https://developer.aliyun.com/article/755999

3 安装git、docker、java8、maven、mysql、npm、nginx

  • 安装git并配置环境变量

    参考https://www.cnblogs.com/fuzongle/p/12830572.html

  • 安装java8并配置环境变量

    yum install java-1.8.0-openjdk* -y

  • 安装maven并配置环境变量

    参考https://blog.csdn.net/qq_38738510/article/details/105567513

  • 安装docker

    https://www.jianshu.com/p/d9dbf7e23722

    启动docker

    systemctl start docker
    
  • mysql https://www.jianshu.com/p/ebe498e4a416

    报错查看https://blog.csdn.net/sinat_38079265/article/details/110926606

    ⭐️开放用户访问权限,否则后端连不上服务器

    启动mysql

    mysql -uroot -pWoshifzj890
    
  • npm https://www.jianshu.com/p/bd38b0a0bc07

  • nginx https://blog.csdn.net/t8116189520/article/details/81909574

    开权限,否则jenkinsfile无法打开操作nginx,因为jenkins用户是jenkins不是root,参照https://blog.csdn.net/weixin_40797576/article/details/89682172

    启动nginx
    /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    重启
    /usr/local/nginx/sbin/nginx -s reload

  • tomcat https://www.cnblogs.com/517cn/p/14698025.html

    端口 8081

4 安装和启动jenkins(用docker)【不采用】

安装

S1:设置8080端口的阿里云安全组
在这里插入图片描述
S2:

# docker images
# docker run -p 8080:8080 jenkinsci/blueocean

S3:打开http://47.99.34.198:8080 服务器公网ip

启动

注意这里不能用上面的docker run步骤,因为docker run是根据镜像创建容器,创建的是新容器

# docker ps -a                 查看容器
# docker start 容器id          启动容器

4 安装和启动jenkins(本机【采用】)

  • 直接安装在本机上

    https://www.jianshu.com/p/8a77010dafc6

  • jenkins安装目录 /var/lib/jenkins/

    jenkins工作目录 /var/lib/jenkins/workspace

    jenkins配置文件地址 /etc/sysconfig/jenkins:可以配置端口\用户等

  • 那jenkins用户改成root,否则jenkins权限有问题,启动nginx和杀死进程都有问题

    https://blog.csdn.net/weixin_43557605/article/details/103783017

    [root@localhost ~]# vim /etc/sysconfig/jenkins 
     29 JENKINS_USER="root"
    [root@localhost ~]# systemctl restart jenkins
    
  • 首次登陆密码

    在 /var/lib/jenkins/secrets/initial······中

  • 启动jenkins(在第一步里已经配置了开机启动)

    sudo service jenkins start
    

5 自动构建

5.1 内网gitlab(http://172.29.4.49/)同步项目至外网gitlab(https://git.nju.edu.cn/)

  • 执行这步的原因:因为我们项目的gitlab是学校内网搭建的,所以无法直接连接jenkins环境(在外网的阿里云服务器),所以将我们在内网gitlab上的项目同步到可被jenkins连接的https://git.nju.edu.cn/hellose3_copy/backend-hellose3中
  • 参考https://www.jianshu.com/p/9e92cef48cf0

5.2 gitlab连接jenkins——gitlab设置webhook

在这里插入图片描述

在这里插入图片描述

5.3 jenkins结果返回gitlab

  • jenkins构建成功后,gitlab端可以看到构建结果;否则,只能在jenkins端看见结果。成功后gitlab提交记录后有√×标记:
    在这里插入图片描述

  • 参考https://blog.csdn.net/fan_ping/article/details/89234481
    在这里插入图片描述

5.4 git拉取代码到jenkins工作台 /var/lib/jenkins/workspace
  • 配置ssh:在jenkins服务器生成公钥私钥,将公钥放到gitlab上,将私钥放到jenkins上,参考https://blog.csdn.net/qq_31519989/article/details/108120947
  • 生成流水线语言

6 自动测试

  • 实现基础功能:在流水线语法中添加 sh:mvn test

  • 实现覆盖率报告:使用jacoco插件

    • 在pom.xml文件中添加jacoco插件

    • 在jenkinsfile中添加

      jacoco (
                                   execPattern: '**/target/jacoco.exec',
                                   classPattern: '**/classes',
                                   sourcePattern: '**/src/main/java',
                                   exclusionPattern: '**/src/test*',
                                   inclusionPattern: '**/com/hel/auto/service/*.class,**/com/hel/auto/controller/*.class',
                               )
      

7 自动部署

首先了解手动部署,并配置项目

7.1 手动部署

本地数据库迁移到服务器上 -> 打包后端项目 -> 将jar包拷贝到服务器上,并编写dockerfile -> 通过dockerfile部署运行jar包 -> 打包前端项目并用nginx运行

https://www.cnblogs.com/youcoding/p/14698240.html

7.1.0 环境ysql、npm、nginx、jdk、docker
7.1.1 创建数据库
  1. 配好配置文件
    在这里插入图片描述

  2. 创建数据库、根据sql文件创建数据表

    • cd到sql文件目录下
    • 启动mysql:mysql -uroot -pWoshifzj890
    • 创建数据库:根据url知道数据库的名称为hellose3,所以create database hellose3
    • 根据sql文件创建数据表: source hellose3.sql
    • 验证表是否创建成功: show tables
7.1.2 部署后端项目
  1. 配置pom

    <properties>
            <java.version>1.8</java.version>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
            <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
    
        </properties>
    
    
    
    <dependency>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
       
            </dependency>
    
  2. mvn package -DskipTests # 跳过测试打包

  3. 在前台运行jar包:java -jar target/hellose3-0.0.1-SNAPSHOT.jar

    在后台运行jar包:nohup java -jar target/hellose3-0.0.1-SNAPSHOT.jar > /root/jarlog &

    ​ 查看日志:tail -f jarlog

  4. 关闭jar包:运行项目中的kill8081.sh文件 , sh kill8081.sh

7.1.3 部署前端项目
  • https://blog.csdn.net/weixin_40331613/article/details/81329277?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_aa&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_aa&utm_relevant_index=2

  • https://www.bilibili.com/video/BV1uK411p7Bp?from=search&seid=552594314681899428&spm_id_from=333.337.0.0

  • 修改了vue.config.js https://blog.csdn.net/WXZCYQ/article/details/106353406

    • 项目在 /root/workspace/frontend-hellose3
    • 安装依赖 npm install
    • 打包项目 npm run build:prod
    • 设置nginx.conf

7.2 自动部署

将手动部署的过程写入jenkinsfile中,每次git push项目的时候,gitlab的webhook触发jenkins,jenkins执行jenkinsfile完成项目部署等一系列工作。

后端的jenkinsfile:

pipeline {
    agent any
    tools {
    		maven 'maven'
    		jdk 'jdk'
    }
    options {
        gitLabConnection('gitlab_test_connection')
    }
    stages {
        stage('pull code') {
            steps {
                script{
                    catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                        echo 'This is a pull step'
                        updateGitlabCommitStatus name: 'jenkins', state: 'running'       // jenkins同步gitlab
                        git credentialsId: '75daab9e-0af4-43e0-ab29-50f0a00d47c8', url: 'git@git.nju.edu.cn:hellose3_copy/backend-hellose3.git'    // 拉取代码到jenkins的workspace中
                        sh 'mysql -uroot -pWoshifzj890 -e "source sql/hellose3.sql"'   // 初始化数据库
                    }
                }
            }
        }
        stage('build') {
             steps {
                script{
                    catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                        echo 'This is a build step'
                        sh 'mvn package -DskipTests'    // 打包
                    }
                }
             }
        }
        stage('test') {
            steps {
                script{
                    catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                        echo 'This is a test step'
                        sh 'mvn test'      // maven自动测试
                        jacoco (            // jacococ配置
                            execPattern: '**/target/jacoco.exec',
                            classPattern: '**/classes',
                            sourcePattern: '**/src/main/java',
                            exclusionPattern: '**/src/test*',
                            inclusionPattern: '**/com/hel/auto/service/*.class,**/com/hel/auto/controller/*.class',
                        )
                    }
                }
            }
        }

        stage('deploy') {
            steps {
                script{
                    catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                        echo 'This is a deploy step'
                        sh 'sh kill8081.sh'           // 检测后端端口是否被占用,如果被占用则杀死占用后端端口的进程
                        // 参考https://blog.csdn.net/jack170601/article/details/82700341
                        withEnv(['JENKINS_NODE_COOKIE=dontkillme']) {undefined
                            sh 'nohup java -jar target/hellose3-0.0.1-SNAPSHOT.jar &'
                        }                                   // jenkinsfile运行结束后默认会自动杀死子进程,这里保证“后台一直运行jar包”子进程不被删除
                        sh 'sh testjar.sh'
                    }
                }
            }
        }

    }

    post {
        success {
            updateGitlabCommitStatus name: 'jenkins', state: 'success'
            
        }
        failure {
            updateGitlabCommitStatus name: 'jenkins', state: 'failed'
        }
    }
}

前端的jenkinsfile:

pipeline{
    agent any
    stages {
        stage('Build') {
            steps{
                script{
                    catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                        echo 'This is a build step'

                        updateGitlabCommitStatus name: 'jenkins', state: 'running'       // jenkins同步gitlab
                    
                        git credentialsId: '75daab9e-0af4-43e0-ab29-50f0a00d47c8', url: 'git@git.nju.edu.cn:hellose3_copy/frontend-hellose3.git'
                   }
                }
            }
        }
        stage('Deploy') {
            steps{
                script{
                    catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
                        echo 'This is a deploy step'

                        sh 'npm install --registry=https://registry.npm.taobao.org'                       // 下载依赖
                        sh 'npm run build:prod'                // 打包项目,生成dist文件

                        sh '/usr/local/nginx/sbin/nginx -s reload'     //重启nginx
                    }
                }
            }
        }
    }

    post{
        success {
            updateGitlabCommitStatus name: 'jenkins', state: 'success'
        }
        failure {
            updateGitlabCommitStatus name: 'jenkins', state: 'failed'
        }
    }
}

8 拓展功能:jenkins+jmeter

  • 缺点:占内存

  • https://www.jianshu.com/p/0bd824bf5d3b

  • https://www.jianshu.com/p/d9e110cd48f2

  • https://zhuanlan.zhihu.com/p/109075439

9 启动jenkins

  1. 打开服务器

  2. xshell连接服务器
    在这里插入图片描述

  3. 启动jenkins

    服务器输入 sudo service jenkins start

    浏览器打开 http://服务器公网ip:8080 即 http://8.136.85.132:8080/

    输入用户名和密码

10 bugs

  • yum无法运行,因为阿里云修改了镜像地址

    https://blog.csdn.net/weixin_45675097/article/details/122880050

  • https://stackoverflow.com/questions/46684972/jenkins-throws-java-lang-illegalargumentexception-invalid-refspec-refs-heads

  • 要配置git

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Iv9sAvMr-1646761213489)(C:\Users\junlines\AppData\Roaming\Typora\typora-user-images\image-20220224172659701.png)]

  • 用镜像创建容器并启动用 docker run -p 8080:8080 (jenkinsid)

    如果下一次想启动这个容器,需要用docker ps -a 查看容器状态,如果这个容器是exit,则用docker start打开这个容器,然后就能顺利的用http://ip:8080打开jenkins主页了。

    注意!如果多次执行docker run -p 8080:8080 (jenkinsid) 那么会启动多个容器,新启动的容器会占用旧容器的8080端口号,所以旧容器会被stop,如果此时docker start旧容器,则无法成功,因为端口号已经被占用了,所以可以使用不同的端口号,或者一个镜像最好就创建一个容器、之后每次用docker start 容器id就好,我们选择后者

  • 网络问题[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTiJW8iy-1646761213489)(C:\Users\junlines\AppData\Roaming\Typora\typora-user-images\image-20220225020432183.png)]

  • nginx连接注意端口问题https://www.jianshu.com/p/8f6a42fb0654

  • https://blog.csdn.net/qq_43437874/article/details/107087363

  • https://www.cnblogs.com/jiaqian/p/14144985.html

  • https://blog.csdn.net/qq_24084605/article/details/104777440

  • 502服务器问题:看java -jar后端运行结果知道是数据库连接问题,最终确定是mysql 3306端口没开+mysql用户权限没开

  • jenkins修改权限后无法启动

    https://blog.csdn.net/xiaoxiangzi520/article/details/90053475

11 其他参考文章

  • jenkins简书详细教程,帮助理解:https://www.jianshu.com/p/5f671aca2b5a
  • jenkins技巧:https://blog.csdn.net/qq_34556414/category_10494189.html
  • jenkins通过gitlab上权限认证的三种方式(最简易的是用户名和密码):https://blog.51cto.com/wzlinux/2160109

12 当前gitlab的access token

glpat-pUhuD76JGmtm76v_wa7Z

13 服务器迁移

阿里云服务器数据迁移(同一个账号内)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值