Jenkins部署

  • 前言
  • Jenkins
    • 安装
    • nginx配置
    • jenkins配置
  • Docker安装
  • 项目部署
    • 项目添加Dockerfile文件
    • Jenkins新建任务
  • 使用Pipeline部署
    • 结果

前言

推荐使用 Pipeline ,使用场景更为广泛 功能也更强大

Jenkins很多人跑不起来,其实主要还是脚本的编写上有问题,所以我记录这篇博客的初衷也是记录脚本,因为安装不难 网上的教程一抓一大把,所以本文没有过多赘述。但是真的可用的的部署脚本却是少之又少,至少我研究jenkins的这两三天是没找到。

我也是这两天刚玩的jenkins,如果有什么地方写的不对,欢迎指出问题,共同进步

个人博客原文地址:https://blog.yixun.store/article/jenkins

Jenkins

我这使用的Ubuntu系统,jenkins安装网上的资料也很全,我这个行不通的话安装可以试试别的,脚本是自己跑通之后记录的,其实脚本本身也就只是服务器命令的结合体,大体上也没什么难度

安装

wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install openjdk-8-jdk
sudo apt-get install jenkins

安装成功就可以启动了,Jenkins的默认端口是8080,配置文件地址sudo vim /etc/default/jenkins,可以视实际情况按需修改。
启动成功直接http://IP:端口就可以直接访问了。

nginx配置

server {listen 80;server_name 你的域名; #需要将yourdomain.com替换成证书绑定的域名。rewrite ^(.*)$ https://$host$1; #将所有HTTP请求通过rewrite指令重定向到HTTPS。location / {index index.html index.htm;}
}server{listen 80;listen 443 ssl;server_name 你的域名;#rewrite ^(.*) https://$server_name$1 permanent;#index index.html;#root  /data/abl/system/page;# 开启gzipgzip  on;# 低于1kb的资源不压缩gzip_min_length 1k;# 设置压缩所需要的缓冲区大小gzip_buffers 4 16k;# 压缩级别【1-9】,越大压缩率越高,同时消耗cpu资源也越多,建议设置在4左右。gzip_comp_level 4;# 需要压缩哪些响应类型的资源,缺少的类型自己补。gzip_types text/css text/javascript application/javascript;# 配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)gzip_disable "MSIE [1-6]\.";# 是否添加“Vary: Accept-Encoding”响应头,gzip_vary on;# 设置gzip压缩针对的HTTP协议版本,没做负载的可以不用# gzip_http_version 1.0;index index.html index.htm;ssl_certificate /data/ssl/证书.pem;  #需要将cert-file-name.pem替换成已上传的证书文件的名称。ssl_certificate_key /data/ssl/证书.key; #需要将cert-file-name.key替换成已上传的证书密钥文件的名称。ssl_session_timeout 5m;ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;#表示使用的加密套件的类型。ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #表示使用的TLS协议的类型。ssl_prefer_server_ciphers on;if ($ssl_protocol = "") { return 301 https://$host$request_uri; } # 接口location / {proxy_pass http://localhost:8080;}}

jenkins配置

  1. 第一次访问Jenkins,会让你输入密码,按照给出的地址 去服务器上复制填入即可

  2. 进去之后,会出现两个选项,第一个选项:安装建议的插件 第二个选项:自选插件去安装 。在此为了方便,我们选择第一个选项,安装建议的插件。然后等他安装完就可以了

  3. 安装完所有插件后,设置好账号密码 就可以使用了

项目基础环境配置

我部署jenkins的时候,看网上的文章都在说需要配置JDKGit,但是实际使用的其部署JAVA项目的时候,什么都没有配置的情况下,也是可以正常部署运行的

只需要使用其默认的Maven配置就可以了

Docker安装

命令若是执行不了,可以自行百度,docker的一些安装配置,网上资料还是很全的

1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
二、Dcoekr配置阿里仓库
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://co73sqx0.mirror.aliyuncs.com"] }
EOF
sudo systemctl daemon-reload sudo systemctl restart docker sudo systemctl enable docker

项目部署

项目添加Dockerfile文件

Dockerfile指令详解:https://www.runoob.com/docker/docker-dockerfile.html

FROM java:8
ENV TZ Asia/Shanghai
# 这里需要注意 需要将jar包 复制到Dockerfile同一目录下,将Dockerfile移动或者复制到jar同一目录也行,反正这俩要在一起
ADD abl_system.jar abl_system.jar
# 另外使用了证书,比如微信退款证书的,如果一开始是将微信证书置于服务器上的,那么将项目用docker启动,是读不到证书的,需要将证书也放到Docker里
# ADD apiclient_cert.p12  /data/paySSL/
MAINTAINER Create App Docker By "XiaoYiXun"
EXPOSE 8002
ENTRYPOINT ["java","-jar","/abl_system.jar"]
CMD ["--spring.profiles.active=test"]

Jenkins新建任务

配置服务器信息

进入系统配置后,找到SSH Servers,填入一些基本项即可Name,Hostname,Username,Proxy password

新增 Git 凭据

凭据的类型不要选错,可以使用账号密码(账号一般是指邮箱,比如gitee,我平时都是用手机号登录,但是在这个地方账号填手机号是连不上去的,需要填邮箱),也可以使用令牌

新建一个maven任务

这里只介绍项目部署的一些基本项,其他的不做介绍(因为我也没用明白,滑稽.jpg)

  1. 这里不要选第一个,我看网上很多文章都选的第一个,但是对于我们Java程序猿来说,部署项目选第二个其实简单很多

  2. 添加git仓库地址,并选择对应的凭证,如果是Gitee仓库地址的话,需要在 系统管理-插件管理-安装Gitee Plugin 插件,安装完之后重启即可

  3. 点击跳转到最下面,构建后操作

  4. 选择对应的服务器,在Exec command处填入相关脚本即可

#!/bin/bash WORKSPACE 是自带的环境变量,变量查询列表: https://jenkins.oplai.com/env-vars.html/
# 这里是将项目中的Dockerfile文件,复制到jar包所在文件目录
cp ${WORKSPACE}/abl-system/docker/Dockerfile  ${WORKSPACE}/abl-system/targetecho "开始运行"
echo "停止system_test"
docker stop system_test
echo "删除容器system_test"
docker rm system_test
echo "删除镜像aobaole_system_test:latest"
docker rmi -f aobaole_system_test:latest#要把jar包制作成镜像就必须使用docker build命令 同时必须有对应的Dockerfile(指定jar包位置是在Dockerfile指定)
# . 表示当前目录 -f 参数指定Dockerfile文件  -t 表示 制作的镜像tag
cd ${WORKSPACE}/abl-system/target
docker build -f Dockerfile  -t  aobaole_system_test:latest  .echo "新容器id:"
docker run -d -p 8002:8002 --name system_test aobaole_system_test:latestecho "执行完毕"

都弄完之后点击保存 然后执行就可以了

使用Pipeline部署

Piepeline方式部署网上其实不少,但是网上并未找到一个能拿来即用的脚本代码,我的初衷也是想拿来即用,尽可能的少编码,所以抽取了很多的字段,但是这种方式问题很多,并不推荐,下文有说明
使用这种方式的话 本机上需要装maven

将代码粘贴到脚本处,填写好相关参数即可

node {//镜像名def dockerImageName=''//镜像版本def version=''//容器名def dockerName=''//第三方docker容器镜像服务账号def dockerLoginName = ''//第三方docker容器镜像服务密码def dockerLoginPassword = ''//第三方docker容器镜像服务地址def dockerLoginUrl = ''//第三方docker容器镜像服务命名空间def nameSpace=''//项目端口def port=//docker映射端口def dockerPort=//Git URLdef gitUrl=''//Git 凭据,在jenkins后台创建的凭据IDdef gitToken=''stage('拉取代码'){git credentialsId: "${gitToken}", url: "${gitUrl}"}stage('Jar包构建') {              sh "mvn clean install -Dmaven.test.skip=true -Pprod"}//这里需要修改,改成自己的路径,没有抽出来(懒得抽.jpg)stage('docker镜像构建') {//这里是将jar包复制到Dockerfile同一目录,跟上面的方式相反sh "cp ${WORKSPACE}/abl-system/target/abl_system.jar ${WORKSPACE}/abl-system/docker"sh "mvn clean"//这里他默认是指向当前工作区的路径,Dockerfile的内容跟上面maven部署的内容保持不变,//docker build 上面那种方式 最后是 用的 . 表示当前目录,所以这个地方要改一下 指向Dockerfile所在目录//关于目录所在问题 如果目录填的不正确,可能Dockerfile文件里COPY 或 ADD命令的目标文件找不到,那么就会报 fiel does not exist,下面有截图//如果出现这种问题 首先检查目标文件是否跟dockerfile在同一目录,如果在,那么就是你最后的路径设置的有问题//可以在执行build命令之前,先执行一下pwd命令,输出当前所在目录,再来确定docker build最后的文件目录该怎么填//sh "pwd"sh "sudo docker build -f ${WORKSPACE}/abl-system/docker/Dockerfile  -t ${dockerImageName}:${version} ./abl-system/docker/"  echo 'docker镜像构建'}stage('docker镜像上传') {sh "sudo docker login --username=${dockerLoginName}  --password=${dockerLoginPassword} ${dockerLoginUrl}"sh "sudo docker tag ${dockerImageName}:${version} ${dockerLoginUrl}/${nameSpace}/${dockerImageName}:${version}"sh "sudo docker push ${dockerLoginUrl}/${nameSpace}/${dockerImageName}:${version}"sh "sudo docker logout ${dockerLoginUrl}"sh "sudo docker rmi -f ${dockerImageName}"  echo "docker镜像上传"}//这种方式不能使用${},但是reallsh生效stage('项目部署') {      sh '''sshpass -p '指定服务器密码' ssh -p 22 -o StrictHostKeyChecking=no 指定服务器账号@指定服务器IP << reallshsudo docker rm -f 容器名 sudo docker rmi 第三方docker容器镜像服务账号地址/第三方docker容器镜像服务命名空间/镜像名:镜像版本sudo docker login --username=第三方docker容器镜像服务账号  --password=第三方docker容器镜像服务密码 第三方docker容器镜像服务账号地址sudo docker pull 第三方docker容器镜像服务账号地址/第三方docker容器镜像服务命名空间/镜像名:镜像版本sudo docker run -d -p port:dockerPort --name 容器名 第三方docker容器镜像服务账号地址/第三方docker容器镜像服务命名空间/镜像名:镜像版本sudo docker logout 第三方docker容器镜像服务账号地址exit'''echo '项目部署'       }//这种写法的好处就是可以抽取公共字段,可以使用${},但是`reallsh`不生效
//  stage ('项目部署') {//      //因为ssh指定密码连接不是交互式的,所以不能像ssh桌面工具那样,一个一个输命令,
//      //他只能执行一次命令,所以通过这种方式`reallsh`把执行的命令一次性丢给连接的服务器执行,但是使用这种方式`reallsh`是不会生效的
//      //所以后面的代码不会在目标服务器执行,而是在Jenkins部署的服务器上执行
//      sh "sshpass -p '指定服务器密码' ssh -p 22 -o StrictHostKeyChecking=no 指定服务器账号@指定服务器IP << reallsh"
//      sh "sudo docker rm -f ${dockerName} "
//      sh "sudo docker rmi -f ${dockerLoginUrl}/${nameSpace}/${dockerImageName} "
//      sh "sudo docker login --username=${dockerLoginName}  --password=${dockerLoginPassword} ${dockerLoginUrl} "
//      sh "sudo docker pull ${dockerLoginUrl}/${nameSpace}/${dockerImageName}:${version}"
//      sh "sudo docker logout ${dockerLoginUrl}"
//      sh "sudo docker run -d -p ${port}:${dockerPort} --name ${dockerName} ${dockerLoginUrl}/${nameSpace}/${dockerImageName}:${version} "
//      sh "exit"
//      echo '项目部署'
//   }
}

这个错误就是因为我没有把目标文件复制到Dockerfile所在目录导致,并且可以看到 pwd命令输出的当前目录并不在Dockerfile文件所在目录,所以docker build命令结尾不能使用 . ,而需要指定到Dockerfile指定目录

注意点:

  1. 脚本代码里有一段被注释的代码,之所以被注释是因为这种方式,不能实现在远程服务器部署,到头来会变成在你Jenkins的安装服务器上去执行脚本代码,但是如果你就只是想在本机部署,那么可以使用第二种

  2. 第三方Docker容器服务可以使用阿里云或者是腾讯云的容器服务,阿里云一搜就可以找到,腾讯云稍微藏了一下所以放个截图

  3. 对于脚本里的参数,一开始我也不清楚 reallsh 会不生效,抽这么多公共参数也是想着复用方便,全部抽出来的话,只需要集中改一遍就好了,不用担心后续哪个地方配置的不对或者写漏

  4. Jenkins是支持配置构建触发器的,项目一提交代码,jenkins就自动部署,但是因为jenkins对于这块自己就有备注,所以这里就不做赘述了,实现基本功能就行

  5. 推荐使用sh ''' '''这种格式,因为如果是一个个sh,比如docker rm,如果没有目标镜像,jenkins会直接报异常,导致构建失败,但是如果用
    sh ''' '''就不会,只是这种方式不可以使用${},公共参数没有办法提取

结果

这个docker镜像上传,还是有点看服务器性能(快的那台访问外网是百兆独享),两张截图是不同服务器,部署了两套jenkins做的测试对比

所以如果只是在本机部署的话,其实是没有这个顾虑的,本机部署就不需要push到公共仓库了,直接本机构建完,然后直接run就可以了。
另外本机跑如果不想用docker的话 只需要把docker构建那一块的代码直接改成 java -jar 或者 直接运行一段启动脚本就可以了。用docker只是方便远程部署,单机部署的话 其实Idea阿里云的部署插件学习成本更低,几乎为零,并且使用方便

最后,希望这文章有帮助到你,也希望帮助到更多jenkins的初学者可以更快的上手jenkins,先成功跑起来,然后再去慢慢研究

Jenkins+Pipeline+Docker部署SpringBoot项目到远程服务器相关推荐

  1. jenkins+pipeline+docker部署vue项目

    这里只是一个简单的例子,只要掌握了思路,部署别的项目都是一样的 项目步骤 第一步:拉取代码 第二步:编译部署获取构建产物 第三步:将产物传输到业务服务器,并根据具体业务场景看是否需要重启服务 node ...

  2. Jenkins Pipeline 一键部署SpringBoot项目

    介绍 通过jenkins的pipeline 可以很清晰了解发布项目经历了哪些步骤,每一步成功失败一目了然,某一个步骤阶段失败了修复好了问题之后可以不用重头再来构建,可以继续上次失败的步骤执行,还可以清 ...

  3. Jenkins部署SpringBoot应用到远程服务器

    Jenkins部署SpringBoot应用到远程服务器 使用SpringBoot.SpringCloud写后台服务,也引入了当下比较流行的微服务的理念,模块也比较多.为了方便前期测试和后期线上部署更新 ...

  4. 使用Docker部署SpringBoot项目(避坑+超级详细版本)

    使用Docker部署SpringBoot项目(避坑+超级详细版本) 首先呢,非常感谢我们一起相遇在这个地方,想必此刻的你也是在一个学习求知的过程,我们一样,我们都是在求知的路上匍匐前进!看到这篇文章, ...

  5. Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo

    Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo 最终效果如下 大概就几个步骤 1.安装 Docker CE 2.运行 Redis 镜像 3.Java 环境准备 4. ...

  6. Docker 部署SpringBoot项目不香吗?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:流星007 链接:toutiao.com/i68433912 ...

  7. 又到了上云时刻啦!!!阿里云 Docker部署SpringBoot项目 方便测试的部署方式

    又到了上云时刻啦!!!阿里云 Docker部署SpringBoot项目 方便测试的部署方式 部署思路: 具体步骤: 1.打成jar 2.上传到服务器 3.启动JDK容器 4.进入JDK 容器 启动 项 ...

  8. 从零开始带你部署springboot项目到ubuntu服务器05

    从零开始带你部署springboot项目到ubuntu服务器 1 重装系统 2 更换源 3 部署 1 安装jdk 2 安装tomcat 3 安装mysql 1) 查看本地mysql版本 2)在服务器上 ...

  9. (三)jenkins+bonobo git server+windows系统自动化部署springboot项目(远程windows自动化部署)

    前提 jenkins安装,参考:(一)jenkins+bonobo git server+windows系统自动化部署springboot项目(jenkins安装) 自动化部署,参考:(二)jenki ...

最新文章

  1. 爬虫之requests模块发送带参数的请求
  2. 为什么建议少用 if 语句
  3. 线程使用二——线程池
  4. python字符编码转换_Python字符和字符值(ASCII或Unicode码值)转换方法
  5. 操作系统(八)进程状态的转换以及进程组织方式
  6. P3805 【模版】manacher算法(manacher)
  7. 想成长为一名实战型架构师?7大实战技能经验分享
  8. 1.搭建JavaEE开发环境
  9. crm高速开发之EntityCollection
  10. [Java] 蓝桥杯ADV-83 算法提高 寻找三位数
  11. hdu 1209 clocks wrong answer 我的错误代码(没审好题唉,角度一样后,还要按小时排序。...
  12. 【防爬虫01】通过headers中的user-agent字段来反爬
  13. php地名转换成拼音,php汉字转拼音_php中怎么将中文转换拼音
  14. 2019美赛参赛获奖经验
  15. 设置某一个行列的颜色和写保护属性
  16. 软件测试分析流程及输出项包括哪些内容?
  17. 基于ARM处理器的U-BOOT详细移植总结
  18. 数据解读 | 薪资没那么高,延毕率超60%,现代人读博都图什么?
  19. 洪泰智造工场腾讯云创业加速营全球招募
  20. 一文读懂自动驾驶传感器之激光雷达、毫米波雷达、超声波雷达及摄像头

热门文章

  1. 云栖科技评论 | 传统产业的数字化转型 破除“肌肉记忆” 拥抱变化与未知
  2. Objective-C:保留计数器思想的详解(对象的保留和所有权的释放)
  3. 利用PHPExcel转Excel柱形图
  4. JavaScript:Object.prototype.toString进行数据类型判定
  5. Ubuntu下安装ruby的三种方式
  6. 记忆碎片 - 2015.09.11
  7. javascrit2.0完全参考手册(第二版) 第1章第1节 在XHTML文档中增加javascript
  8. linux下新文件权限设置之umask的理解
  9. PIE SDK波段合成
  10. 单例模式的3种实现方式, 及其性能对比