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.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/sinat_38079265/article/details/110926606
⭐️开放用户访问权限,否则后端连不上服务器
启动mysql
mysql -uroot -pWoshifzj890
-
npm https://www.jianshu.com/p/bd38b0a0bc07
-
nginx https://blog.youkuaiyun.com/t8116189520/article/details/81909574
开权限,否则jenkinsfile无法打开操作nginx,因为jenkins用户是jenkins不是root,参照https://blog.youkuaiyun.com/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.youkuaiyun.com/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
-
这步的作用是使,当git push时,gitlab触发jenkins自动构建;否则,只能在jenkins端手动构建
-
参考Jenkins+Pipeline+Gitee本地自动化部署(Windows平台)——看完不会用你打我,⭐️ 这篇包括了jenkinsfile部署
5.3 jenkins结果返回gitlab
-
jenkins构建成功后,gitlab端可以看到构建结果;否则,只能在jenkins端看见结果。成功后gitlab提交记录后有√×标记:
-
参考https://blog.youkuaiyun.com/fan_ping/article/details/89234481
5.4 git拉取代码到jenkins工作台 /var/lib/jenkins/workspace
- 配置ssh:在jenkins服务器生成公钥私钥,将公钥放到gitlab上,将私钥放到jenkins上,参考https://blog.youkuaiyun.com/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 创建数据库
-
配好配置文件
-
创建数据库、根据sql文件创建数据表
- cd到sql文件目录下
- 启动mysql:
mysql -uroot -pWoshifzj890
- 创建数据库:根据url知道数据库的名称为hellose3,所以
create database hellose3
- 根据sql文件创建数据表:
source hellose3.sql
- 验证表是否创建成功:
show tables
7.1.2 部署后端项目
-
配置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>
-
mvn package -DskipTests # 跳过测试打包
-
在前台运行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
-
关闭jar包:运行项目中的kill8081.sh文件 , sh kill8081.sh
7.1.3 部署前端项目
-
https://blog.youkuaiyun.com/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.youkuaiyun.com/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.youkuaiyun.com/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
-
打开服务器
-
xshell连接服务器
-
启动jenkins
服务器输入 sudo service jenkins start
浏览器打开 http://服务器公网ip:8080 即 http://8.136.85.132:8080/
输入用户名和密码
10 bugs
-
yum无法运行,因为阿里云修改了镜像地址
https://blog.youkuaiyun.com/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.youkuaiyun.com/qq_43437874/article/details/107087363
-
https://www.cnblogs.com/jiaqian/p/14144985.html
-
https://blog.youkuaiyun.com/qq_24084605/article/details/104777440
-
502服务器问题:看java -jar后端运行结果知道是数据库连接问题,最终确定是mysql 3306端口没开+mysql用户权限没开
-
jenkins修改权限后无法启动
https://blog.youkuaiyun.com/xiaoxiangzi520/article/details/90053475
11 其他参考文章
- jenkins简书详细教程,帮助理解:https://www.jianshu.com/p/5f671aca2b5a
- jenkins技巧:https://blog.youkuaiyun.com/qq_34556414/category_10494189.html
- jenkins通过gitlab上权限认证的三种方式(最简易的是用户名和密码):https://blog.51cto.com/wzlinux/2160109
12 当前gitlab的access token
glpat-pUhuD76JGmtm76v_wa7Z