Jenkins教程(自动化部署)

Jenkins教程(自动化部署)Jenkins实现自动化项目部署

大家好,又见面了,我是你们的朋友全栈君。

PS:本教程主要讲解Jenkins在Linux环境下实现自动化部署项目。

1. Jenkins是什么?

         Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,广泛用于项目开发,具有自动化构建、测试和部署等功能。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。

2. 什么是持续集成(CI)?

        因为开发部门同时维护多个版本,多个版本的发布,测试需要大量人力,所以要有一个专业的持续集成工具来管理持续重复的工作。

        个人理解,说白了就是把代码测试、打包、发布等工作交给一些工具来自动完成。这样可以提高效率,减少失误,开发人员只需要关心开发和提交代码到Git就可以了。

3. Jenkins的安装

(1)准备条件

安装JDK

下载JDK压缩包,并上传至Linux某个目录下解压。

jdk-Linux-x64【提取码:3a5n】

 . 配置jdk的环境变量

#进入/etc/profile配置文件
vi /etc/profile

 . 将以下代码填入到profile文件内底部Jenkins教程(自动化部署)

export JAVA_HOME=/usr/local/jdk1.8.0_161
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH

 . 使配置生效

source /etc/profile

. 检测java环境信息

javac

 输入javac后出现以下信息则安装jdk成功!

Jenkins教程(自动化部署)

(2)安装Jenkins

1. 下载jenkins

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war 

2. 启动jenkins

# 使用nohup命令启动 nohup 当虚拟机黑屏时 也会运行   日志—>输出到jenkins.log   & 后台运行

nohup java -jar /usr/local/soft/jenkins.war  --httpPort=8777 --httpsPort=8778 > /usr/local/soft/jenkins.log 2>&1 &

3. 使用tail命令查看启动日志,日志中会输出jenkins密码

Jenkins教程(自动化部署)

 4. 通过浏览器访问jenkins(端口号必须为8777)

http://你的ip:8777

Jenkins教程(自动化部署)

 

点击安装推荐的插件

Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 (3)Jenkins中配置JDK路径

jenkins-》全局工具配置-》JDK-》新增JDK

Jenkins教程(自动化部署)

Jenkins教程(自动化部署)

(4)Jenkins忘记密码的解决方案

Jenkins教程(自动化部署)

  • 进入到Jenkins的工作目录,找到config.xml,我这里是/root/.jenkins/config.xml

  • 修改该配置文件useSecurity的节点值为false

    <useSecurity>true</useSecurity>
  • 重启Jenkins项目后,再次访问Jenkins站点

  • 点击左边菜单栏的系统管理

  • 进入后找到全局安全配置

  • 进入到用户列表,找到admin用户Jenkins教程(自动化部署)

    Jenkins教程(自动化部署)

  • 使用新密码登录即可

4. 集成Git

为了Jenkins能够拉取代码,需要安装Git环境和jenkins对应的Git插件

(1) CentOS 7 上安装Git环境

# 安装
$ yum install git -y
# 查看版本
$ git --version

(2) Jenkins安装Git插件

Jenkins教程(自动化部署)

(3) Jenkins配置Git环境

此处无需在jenkins中配置Git环境,采用默认生成的即可

Jenkins教程(自动化部署)

 (4) Gitee上任意建一个仓库

Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 (5) 测试凭据是否能够使用

jenkins-》新建任务-》自由风格项目

Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

Jenkins教程(自动化部署)

Jenkins教程(自动化部署)

Jenkins教程(自动化部署)

进入jenkins的工作空间查看文件是否拉取下来,所有拉取的文件都会存放在jenkins工作空间中

 Jenkins教程(自动化部署)

 到这一步用户名和密码方式的凭证已经打通Git

5. 凭证配置

凭据就是用来存储需要密文保护的数据库密码、Gitee密码信息、Docker私有仓库密码等,以便 Jenkins可以和这些第三方的应用进行交互。

1. 凭证插件安装Credentials Binding

Jenkins教程(自动化部署)

 该插件默认在一开始就会被安装,安装后在jenkins-》系统管理-》安全栏目会出现Manage Credentials选项,若没有需要安装插件并重启。

Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

6. Maven集成

 在jenkins上发布Java项目时需要使用Maven来进行构建打包(Gradle项目则需要安装配置Gradle)

(1) 下载安装

# 找一个目录存放maven
cd /data/software/

# 从阿里云上下载maven安装包
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz

# 解压
tar -zxvf apache-maven-3.6.3-bin.tar.gz

# 当前maven的安装目录为:/usr/local/java/apache-maven-3.6.3

 (2) 环境配置

vi /etc/profile

在最后面JDK配置上作出一些更改
export MAVEN_HOME=/usr/local/java/apache-maven-3.6.3
export PATH=$JAVA_HOME/bin:$MAVEN_HOME/bin:$PATH

(3) 使配置生效并查看安装情况

source /etc/profile
mvn -version

Jenkins教程(自动化部署)

 (4) Jenkins配置Maven

Jenkins教程(自动化部署)

 (5) 安装Maven插件

Jenkins教程(自动化部署)

 (6) 在/data/software目录下新建一个repository文件夹,用来作为maven的仓库

$ cd /data/software
$ mkdir repository

(7) 使用root账户修改Maven的settings.xml文件(指定仓库目录和阿里云镜像)

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  
  <!--本地仓库-->          
  <localRepository>/data/software/repository</localRepository>
  
  <mirrors>
    <!--阿里云镜像-->
    <mirror>
      <id>aliyun-maven</id>
      <mirrorOf>central</mirrorOf>
      <name>aliyun maven mirror</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    </mirror>
  </mirrors>
    ...
    ...
</settings>

(8) Maven测试项目构建

接下来的步骤是将java项目传到Gitee上供jenkins拉取打包,如果运维同学不懂Java代码,可以直接将我的Git项目fork或采用gitlab 等其他方式进行拉取。

新建Maven项目

Jenkins教程(自动化部署)

 在码云上建一个同名的git项目

Jenkins教程(自动化部署)

 

使用Git上传到码云

使用git bash命令将项目初始化,无论是传到Gitee、GitHub、GitLab、Codeup步骤一样,如果对Git的安装部署不熟悉

# 进入到本地的项目文件夹
$ cd existing_folder
# 初始化仓库
$ git init

# 添加文件至工作区并提交
$ git add .
$ git commit -m "first commit"

# 关联Gitee远程仓库
$ git remote add origin https://gitee.com/nobug8/it235-jenkins-jar.git

# 将本地仓库推送到远程仓库的master分支,此处会弹出用户名密码交互
$ git push -u origin master

## 如果push报错可以先拉取一下,会有新的gitee生成的文件拉下来,然后重新添加提交并push
$ git pull origin master --allow-unrelated-histories
$ git add .
$ git commit -m "拉取下来合并后再次提交"
$ git push -u origin master

Jenkins教程(自动化部署)

 (9) Jenkins添加Maven项目任务

①. 新建任务Jenkins教程(自动化部署)

 ②. 编写Maven编译命令

Jenkins教程(自动化部署)

 

③. 构建并查看控制台日志

保存后,点击立即构建,然后进入日志控制台查看日志

Jenkins教程(自动化部署)

 

从日志可以看到代码已经在拉取了,而且走的事阿里云仓库,第一次拉取过程会比较长。

通过查看/data/software/repository可以看到有存放拉取的jar包,通过这2个证据可以证明settings.xml文件配置成功且有效

Jenkins教程(自动化部署)

 构建成功后查看jenkinsworkspace目录下的jar包

Jenkins教程(自动化部署)

Jenkins教程(自动化部署)

到此Maven集成完毕

 配置Post Steps,选中执行shell

Jenkins教程(自动化部署)

 Jenkins教程(自动化部署)

 7. 配置SSH免密登录

由于jenkins构建消耗内存极大,一般jenkins是一台单独的工具机器,Java项目一般在其他的机器上,这里我重新安装一台虚拟机

应用服务器信息

  • IP:192.168.223.129

  • JDK:1.8

  • user:root

  • 部署路径:/data/app/my-boot

  • 端口:9010

免密登录主要是方便jenkins服务器192.168.223.128的root用户—》应用服务器192.168.223.129的root用户上的jar包拷贝,部署本就是jar包拷贝的过程

在192.168.223.128机器上使用root用户生成秘钥注意此处是root用户

$ ssh-keygen -t rsa
# 3次回车

运行后会在当前用户的根目录生成一个.ssh文件夹

Jenkins教程(自动化部署)

 ssh文件夹中的文件描述

  • id_rsa : 生成的私钥文件

  • id_rsa.pub : 生成的公钥文件

接下来需要将公钥导入到认证文件中  

$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

如果希望ssh公钥生效需满足至少下面两个条件:

  • .ssh目录的权限必须是700

  • .ssh/authorized_keys文件权限必须是600

给对应文件授权

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

authorized_keys文件拷贝到另一台应用服务器的root用户.ssh目录下

# 在应用服务器(192.168.223.129)上用root用户创建/root/.ssh文件夹  mkdir -p /root/.ssh

# 在jenkins服务器(192.168.223.128)上将pub公钥文件拷贝到应用服务器的.ssh目录下

scp -p ~/.ssh/id_rsa.pub root@192.168.223.129:/root/.ssh/authorized_keys

在jenkins192.168.223.128服务器上进行免密连接测试

# 在jenkins服务器的/root/目录下创建filetest文件,并拷贝到应用服务器
$ cd ~/
$ touch filetest
$ scp -p filetest root@192.168.223.129:/root/filetest
# 进入到应用服务器(192.168.223.129),检查/root目录下是否出现filetest

# 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示
$ ssh root@192.168.223.129
Last login: Sun Sep 20 21:53:03 2020
$ exit

到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助

8. 编写Jenkins发布脚本

Jenkins教程(自动化部署)

 注意下面代码第6行代码server_ips=”需要部署到的机器ip”

#!/bin/bash

echo "部署的目录和项目名称"
DIR="/data/app"
projectName="my-boot"

echo "待部署的应用服务器,可多台"
server_ips="192.168.223.139"
for server_ip in ${server_ips[@]}
do

echo "ssh连接进行备份操作"
ssh -Tq -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mkdir -p $DIR/backup/${projectName}
mkdir -p $DIR/${projectName}
if [ -f "$DIR/${projectName}/${projectName}.jar" ];then
  mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar 
fi
EOF

echo "拷贝jar包到目标服务器的tmp目录"
scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar root@${server_ip}:/tmp/${projectName}.jar

echo "ssh远程连接进行发布操作"
ssh -q -oStrictHostKeyChecking=no root@${server_ip} <<EOF
mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar

EOF

done

echo "success"

9. 编写应用启动脚本

/data/app/my-boot目录下创建启动脚本start.sh

$ touch start.sh
$ vi start.sh
# 将下面代码粘贴到start.sh中
#!/bin/bash
set -e #任何命令出错就退出
set -o pipefail

APP_ID=my-boot
APP_DIR="/data/app"

nohup java -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log &
start_ok=false
if [[ $? = 0 ]];then
        sleep 3
        tail -n 10 release_out.log
        sleep 5
        tail -n 50 release_out.log
fi
aaa=`grep "Started" release_out.log | awk '{print $1}'`
if [[ -n "${aaa}" ]];then
    echo "Application started ok"
    exit 0
else
    echo "Application started error"
    exit 1
fi

/data/app/my-boot目录下创建停止脚本stop.sh

$ touch stop.sh
$ vi stop.sh
# 将下面代码粘贴到stop.sh中
#!/bin/bash

APP_ID=my-boot
ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh

并进行启动和停止测试,查看日志输出是否正常

将下述启动代码配置jenkins


sh $DIR/${projectName}/stop.sh
sh $DIR/${projectName}/start.sh

访问并测试代码是否生效  

如果是虚拟机则需要给防火墙添加9010端口

$ su root
# 开启防火墙9010端口
$ firewall-cmd --zone=public --add-port=9010/tcp --permanent
# 使配置生效
$ firewall-cmd --reload

 修改代码返回值,提交至Gitee,并再次进行构建发布,访问http://192.168.223.129:9010查看结果是否更新

Jenkins教程(自动化部署)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/146557.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • docker入门实战笔记[通俗易懂]

    docker入门实战笔记

    2022年2月9日
    35
  • 如何创建HTML表单?html表单代码怎么写[通俗易懂]

    如何创建HTML表单?html表单代码怎么写[通俗易懂]html表单代码是什么?如何创建HTML表单?这些对于新手会感到陌生,下面我们为你总结一下html表单代码怎么写?以及html表单的创建?一:构建表单标签在文本编辑器中打开HTML文档,必须在<form>和</form>标签中键入HTML表单的内容。这些标签充当表单的容器,就像<div></div>容器标签一样。您可以在<form></form>标签内使用CSS或js,使您的表单看起来比较美观。2.打开<form&gt

    2022年8月11日
    3
  • FPGA和CPLD的区别

    FPGA和CPLD的区别1、FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。2、CPLD(ComplexProgrammableLogicDevice)复杂可编程逻辑器件,

    2022年5月4日
    43
  • linux抓包命令到文件,Linux下抓包命令tcpdump详解「建议收藏」

    linux抓包命令到文件,Linux下抓包命令tcpdump详解「建议收藏」tcpdump是一个命令行实用程序,可用于捕获和检查进出系统的网络流量。它是网络管理员中用于排除网络问题和安全测试的最常用工具。尽管名称如此,使用tcpdump,您也可以捕获非TCP流量,例如UDP,ARP或ICMP。捕获的数据包可以写入文件或标准输出。tcpdump命令最强大的功能之一是它能够使用过滤器并仅捕获要分析的数据。在本文中,我们将介绍如何在Linux中使用tcpdump命令的基础…

    2022年8月20日
    10
  • trunk链路的配置命令_链路聚合配置

    trunk链路的配置命令_链路聚合配置实验环境使用之前用过的GNS3、WireShark和CRT进入GNS3页面,点击左侧图标菜单栏,拖入2台路由器到拓扑操作台,再点击PC图标,选择VPC,拖入拓扑操作台,配置两台路由器(更改名称、更改图标、添加二层业务单板、添加磁盘容量为128Mb)—————-配置环境————-1、接下来用网线把PC和路由器连接起来将PC1连到SW1的f1/0将PC2连…

    2022年10月29日
    0
  • 记一次固态硬盘数据恢复

    记一次固态硬盘数据恢复背景15年初的时候买过一个128G的固态硬盘,在自己的笔记本电脑上组了一个双硬盘(ssd+hdd),ssd作为系统盘。到今年也已经用了三年了。昨天上午的时候,电脑突然蓝屏报错,本来以为是一次简单的蓝屏故障,但是发现电脑重启之后,电脑报错找不到硬盘。当时心里一凉,难道硬盘寿终就寝了,但是硬盘坏了不重要,里面的数据还没有备份会比较可怕。赶快用一个winpe系统把电脑开起来,想看看数据是否还在。然…

    2022年9月20日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号