环境准备
主机名 | IP | 部署项目 | 作用 |
---|---|---|---|
gitlab | 10.0.0.81 | Gitlab | 内网的远端仓库 |
Jenkins | 10.0.0.83 | Jenkins | 项目发布平台 |
dev01 | 10.0.0.82 | git、nginx | 开发测试用 web 服务器 |
注意:如果遇到出错不要着急,仔细分析是否漏了步骤,
秘钥没有给对
用户权限是否够
IP 如果不一样就要按自己的来,不一定非要是81、82、83
部署 Jenkins
# 建议内存设置 >2G
官方中文地址:https://www.jenkins.io/zh/
官方下载地址:https://jenkins.io/download/
镜像下载地址:http://mirrors.jenkins-ci.org/
#上传3个文件【2个安装包,一个插件】
jdk-8u181-linux-x64.rpm # Java
jenkins-2.99-1.1.noarch.rpm # Jenkins
plugins.tar.gz # Jenkins插件
#安装Jenkins安装包
rpm -ivh jdk-8u181-linux-x64.rpm jenkins-2.99-1.1.noarch.rpm
#配置Jenkins用户为root
vim +29 /etc/sysconfig/jenkins
JENKINS_USER="root"
#启动Jenkins
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# netstat -lntp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 18924/java
Jenkins 配置文件
#Jenkins配置文件
[root@jenkins ~]# ll /etc/sysconfig/jenkins
-rw------- 1 root root 3113 2020-03-12 16:10 /etc/sysconfig/jenkins
#Jenkins的家目录
[root@jenkins ~]# ll /var/lib/jenkins/ -d
drwxr-xr-x 11 jenkins jenkins 4096 2020-03-12 16:43 /var/lib/jenkins/
#Jenkins日志
[root@jenkins ~]# ll /var/log/jenkins/jenkins.log
-rw-r--r-- 1 root root 25040 2020-03-12 16:43 /var/log/jenkins/jenkins.log
#Jenkins的安装程序目录,WAR包会放在这里
[root@jenkins ~]# ll /usr/lib/jenkins/ -d
drwxr-xr-x 2 root root 25 2020-03-12 16:08 /usr/lib/jenkins/
Jenkins 页面初始配置
#浏览器打开Jenkins
http://10.0.0.83:8080/
#依据提示查看密码,填写进web页面
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
出现上图后根据提示在Jenkins服务器上去查找密码,填入下方空白框进行登陆
cat /var/lib/jenkins/secrets/initialAdminPassword
install suggested plugins #安装Jenkins提供的插件
select plugins to install #自定义安装需要的插件
直接关闭就可以了
点击篮框 Start using Jenkins【开始使用 Jenkins 】
接下来设置登陆密码
安装插件
手动下载
#解压之前上传的插件
[root@jenkins ~]# tar xf plugins.tar.gz
[root@jenkins ~]# mv /root/plugins/* /var/lib/jenkins/plugins/
#重启Jenkins服务,插件才能生效
systemctl restart jenkins.service
自动下载
登陆 Jenkins 后点左上角 Jenkins 右侧的小三角》系统管理》管理插件》可更新|可选插件
Jenkins 内部变量
构建时的第一个命令,查看构建项目目录
Jenkins的内部变量可以在这里输入export或export -p 来查看
$WORKSPACE #是当前项目代码文件的存放路径
$JOB_NAME #是Jenkins配置中项目名称
$BUILD_NUMBER #是当前项目此次构建的序号
#所有 Jenkins 环境变量
export BUILD_CAUSE="MANUALTRIGGER"
export BUILD_CAUSE_MANUALTRIGGER="true"
export BUILD_DISPLAY_NAME="#2"
export BUILD_ID="2"
export BUILD_NUMBER="2"
export BUILD_TAG="jenkins-dzp-2"
export EXECUTOR_NUMBER="1"
export HOME="/root"
export HUDSON_COOKIE="53c4e97e-ab50-4d27-8d3d-cc0780c5c928"
export HUDSON_HOME="/var/lib/jenkins"
export HUDSON_SERVER_COOKIE="0c056f557fc12efc"
export JENKINS_HOME="/var/lib/jenkins"
export JENKINS_SERVER_COOKIE="0c056f557fc12efc"
export JOB_BASE_NAME="dzp"
export JOB_DISPLAY_URL="http://unconfigured-jenkins-location/job/dzp/display/redirect"
export JOB_NAME="dzp"
export LANG="en_US.UTF-8"
export NODE_LABELS="master"
export NODE_NAME="master"
export OLDPWD
export PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PWD="/var/lib/jenkins/workspace/dzp"
export ROOT_BUILD_CAUSE="MANUALTRIGGER"
export ROOT_BUILD_CAUSE_MANUALTRIGGER="true"
export RUN_CHANGES_DISPLAY_URL="http://unconfigured-jenkins-location/job/dzp/2/display/redirect?page=changes"
export RUN_DISPLAY_URL="http://unconfigured-jenkins-location/job/dzp/2/display/redirect"
export SHELL="/bin/bash"
export SHLVL="3"
export WORKSPACE="/var/lib/jenkins/workspace/dzp"
export _="/etc/alternatives/java"
Jenkins 自由风格项目
1.创建项目【自由风格】
登陆后点击创建一个新任务
下图中3个是常用的项目选项
构建一个自由风格的软件项目
构建一个maven项目
Pipeline
# 这里我选了第一个自由风格,输入项目名称后点击下方确定按钮创建项目
项目创建好了以后可以点下图进入项目
2.配置项目
点击配置,开始配置项目
项目名称和项目记录保留时间
源码管理【设置从哪里获取源码,先选默认有需要再来改】
构建
构建时可以选择很多,这里也可以执行脚本 /bin/bash /scripts/depoly.sh
这里我选择常用的 shell 命令
为了知道构建的时候我们是在哪个目录下执行的 shell 命令
第一个命令,查看构建项目目录
pwd
保存配置
3.构建项目
点击立即构建
查看构建状态【蓝色圆点表示成功】
点击上图三角形,选择下图选项
配置的构建命令显示出了项目的目录地址
Jenkins 构建部署新代码
1.码云网站获取代码
去码云网站搜索一个项目【幸运大转盘】
在Gitlab网站新建一个项目,导入码云的代码地址
https://gitee.com/lovexzq/XingYunDaZhuanPan.git
进入my项目
复制项目地址
2.在 dev01 上部署 web
# 将大转盘项目克隆到 dev01 主机
[root@dev01 ~]# git clone git@10.0.0.72:OPS/dzp.git
Cloning into 'dzp'...
remote: Counting objects: 19, done.
remote: Compressing objects: 100% (15/15), done.
remote: Total 19 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (19/19), 104.36 KiB | 0 bytes/s, done.
Resolving deltas: 100% (2/2), done.
[root@dev01 ~]# ls dzp
css img js lottery.html README.md
# 创建站点目录
[root@dev01 ~]# mkdir -p /data/code
# 拷贝站点文件
[root@dev01 ~]# cp dzp /data/code
# 安装 nginx
[root@dev01 ~]# yum -y install nginx
# 创建站点配置文件
[root@dev01 ~]# vim /etc/nginx/conf.d/dzp.com.conf
server {
listen 80;
server_name dzp.com;
location / {
root /data/code/dzp;
index lottery.html;
}
}
# 启动 nginx
[root@dev01 dzp]# systemctl restart nginx
# 在 windows 电脑上配置解析
打开 C:\Windows\System32\drivers\etc 文件,在最后一行添加
10.0.0.82 dzp.com
# 访问 dzp.com
3.通过 构建 部署新代码
打开 Jenkins 中 dazhuanpan-job 项目的配置
输入 gitlab 的 dzp 项目的地址,可能会报错
错误1
错误2
如出现上图错误
解决办法:在 jenkins 主机的命令行执行一次报错提示的命令,然后输入 yes
[root@jenkins ~]# yum -y install git
[root@jenkins ~]# git ls-remote -h git@10.0.0.81:OPS/my.git
The authenticity of host '10.0.0.72 (10.0.0.72)' can't be established.
ECDSA key fingerprint is SHA256:7IhnCxlNU3w32uWBSRhgqvkeqp/ZRFRkKNdsZxp3zPA.
ECDSA key fingerprint is MD5:bb:63:f4:3a:f0:2f:dc:39:d5:b5:5c:99:9a:43:70:5a.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.72' (ECDSA) to the list of known hosts.
git@10.0.0.72's password:
如果提示输密码,这是因为没有将 Jenkins 的 key 交给 gitlab
#创建ssh公钥
[root@jenkins ~]# ssh-keygen -t rsa
#显示公钥内容
[root@jenkins ~]# cat ~/.ssh/id_rsa.pub
打开 gitlab 的 dzp 项目粘贴 Jenkins 的 key 点击 Add key 确定添加
# 之前添加过 KEY 的效果如下
[root@jenkins ~]# git ls-remote -h git@10.0.0.81:OPS/my.git
The authenticity of host '10.0.0.81 (10.0.0.81)' can't be established.
ECDSA key fingerprint is SHA256:t/wRHxVb4zTEg6b4AblQmCGpMe4GD3tvRh4cPncimpw.
ECDSA key fingerprint is MD5:cc:13:73:1f:00:53:2e:20:d9:81:4e:11:6f:31:b6:6f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.0.81' (ECDSA) to the list of known hosts.
3935eb759d27d62b2afbc0526b778c499a8d8c1b refs/heads/master
在 Jenkins 的 dazhuanpan-job 项目配置中先删除刚刚输入 gitlab 的 dzp 项目的地址,在空白处点一下,然后重新输入 gitlab 的 dzp 项目的地址
成功
保存配置
点击 立即构建
出现蓝色小球就表示构建成功,查看构建内容
到 Jenkins 主机查看文件
[root@jenkins ~]# ll /var/lib/jenkins/workspace/dazhuanpan-job
total 8
drwxr-xr-x 2 root root 25 2021-11-30 17:25 css
drwxr-xr-x 2 root root 84 2021-11-30 17:25 img
drwxr-xr-x 2 root root 41 2021-11-30 17:25 js
-rw-r--r-- 1 root root 2170 2021-11-30 17:25 lottery.html
-rw-r--r-- 1 root root 113 2021-11-30 17:25 README.md
之前 dzp.com 的站点文件是手动在 gitlab 项目上克隆的
现在我想点一下 Jenkins 项目的【立即构建】就可以发布新的代码,打算通过脚本实现
实现步骤如下:
1、需要 Jenkins 的公钥交给 dev01 主机,实现Jenkins与dev01的沟通
[root@jenkins ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.84
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '10.0.0.84 (10.0.0.84)' can't be established.
ECDSA key fingerprint is SHA256:7IhnCxlNU3w32uWBSRhgqvkeqp/ZRFRkKNdsZxp3zPA.
ECDSA key fingerprint is MD5:bb:63:f4:3a:f0:2f:dc:39:d5:b5:5c:99:9a:43:70:5a.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@10.0.0.84's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@10.0.0.84'"
and check to make sure that only the key(s) you wanted were added.
2、在Jenkins主机建一个脚本目录存放脚本
[root@jenkins ~]# mkdir -p /data/scripts
3、创建脚本实现发布代码至 dev01
[root@jenkins ~]# vim /data/scripts/depoly.sh
#!/bin/bash
# 设置dev01主机的IP
Web_Ip=10.0.0.84
# Jenkins项目构建时的前一次序号
BUILD_NUMBER=$(( $BUILD_NUMBER - 1 ))
# 旧站点代码存放目录
Old_Code_Dir=${WORKSPACE##*/}_$BUILD_NUMBER
# -d 判断dev01站点代码目录是否存在,不存在就 mkdir 创建
ssh root@$Web_Ip "[ -d /opt/$Old_Code_Dir ] || mkdir -p /opt/$Old_Code_Dir"
# 将 dev01 主机旧的代码进行移动到别的目录
ssh root@$Web_Ip "mv /data/code/dzp/* /opt/$Old_Code_Dir/"
# 将代码拷贝到站点目录
scp -rp $WORKSPACE/* root@${Web_Ip}:/data/code/dzp
上面脚本中用到了一些变量
Jenkins 的内部变量可以在脚本项目的构建中输入 export 或 export –p 来查看
$WORKSPACE #是Jenkins配置中源码管理中的项目代码保存的地址+文件名
$JOB_NAME #是Jenkins配置中源码管理中的项目代码的文件名
$BUILD_NUMBER #当前构建的序号
4、将代码放入 Jenkins 项目 dazhuanpan-job 配置 的 构建 中
添加如下命令
/bin/bash /data/scripts/depoly.sh
点击 Jenkins 项目 dazhuanpan-job 的 立即构建
构建成功后,点击画面中的蓝色小球查看构建步骤
再去 dev01 主机上确认
[root@dev01 ~]# ll /opt/
total 0
drwxr-xr-x 3 root root 17 2021-12-07 10:00 dazhuanpan-job_10
为了更直观的看出代码变更,我们手动修改一下代码
# 先删除原来的仓库目录,再克隆gitlab上的代码
[root@dev01 ~]# ls
dzp
[root@dev01 ~]# rm -rf dzp
[root@dev01 ~]# git clone git@10.0.0.81:OPS/dzp.git
# 在一等奖后面添加几个字
[root@dev01 ~]# vim /root/dzp/lottery.html
<p>一等奖 运气爆棚</p>
# 推送给gitlab
[root@dev01 dzp]# git add .
[root@dev01 dzp]# git commit -m '一等奖 运气爆棚'
[root@dev01 dzp]# git push -u origin master
在 Jenkins 的 dazhuanpan-job 项目中点击【立即构建】
在去网页刷新 dzp.com
部署自动代码上线
Jenkins 构建实现代码更新已经完成了
再进一步,实现推送新代码到gitlab仓库就自动让新代码上线
1.部署 自动触发代码上线
自动代码上线:
是指程序员在自己的主机上推送代码到Gitlab服务器的远程仓库后
就可以自动触发Jenkins服务器的构建
然后就可以通过执行脚本将新代码发送到web服务器上
Jenkins 网页上依次点击和复制
1、项目名称
2、配置
3、构建触发器
4、勾选 Build when a change is pushed to GitLab. ......
5、复制 http://10.0.0.83:8080/project/dazhuanpan-job
6、注意有一个按钮 【高级】点开
7、点选 Filter branches by name
8、点击按钮 Generate
9、复制 生成的一串字符
10、点击按钮 保存
注意这里需要点击按钮【高级】,才会有完整的下图,复制好地址和字符后,记得保存。
# 2种报错
1、没保存就去下面粘贴,肯定不行。
2、Gitlab 上创建了新项目,但是项目并没有提交内容
# 构建执行失败,确保项目至少有一次提交
Hook execution failed: Ensure the project has at least one commit.
有时候失败要注意登陆 Gitlab 的用户在 dzp 项目中的权限,建议测试的时候给管理员权限
Gitlab上配置,将Jenkins配置中刚刚复制的2个内容填入下图位置
第一行填 http://10.0.0.83:8080/project/dazhuanpan-job
第二行填 生成的好多字符
点击上图的绿色按钮确认添加自动触发设置
再点击下图红框
弹出200就表示触发设置正确
这时候自动代码上线就成功了
需要再添加一个功能,让程序猿知道自己的新代码上线成功了
2.自动触发代码上线反馈
Gitlab上设置,点击绿色按钮生成最下方字符串
来到Jenkins首页,点击系统管理
向下找到系统设置
按下图数字顺序进行设置
点击上图4要粘贴上方刚刚生成的字符串,然后点上图5
测试设置
保存配置
再来到Jenkins项目中进行配置
再到Jenkins项目中点击立即构架测试自动反馈
再到Gitlab上查看反馈效果,有绿色勾就表示反馈正常
点击绿色勾查看详细信息
Gitlab网页上的小图标也能看出来
3、在 dev01 上传新代码测试
# 修改 三等奖为 1000 元
[root@dev01 dzp]# vim lottery.html
<p>1000元充值卡</p>
# 推送到 gitlab
[root@dev01 dzp]# git add .
[root@dev01 dzp]# git commit -m '三等奖 1000 元'
[root@dev01 dzp]# git push -u origin master
# 打开 dzp.com 查看网站新内容
Jenkins Maven 项目
1.介绍 Maven
Maven是一个编译器,可以编译Java项目,Java开发员用的很多
是一个项目管理的综合工具,可以把项目打成一个war或JAR包
是Apache【httpd】下的一个开发工具
2.安装 Maven【Jenkins主机】
#Jenkins主机上操作
Maven安装包来源
官网: http://maven.apache.org/download.cgi
清华镜像: https://mirrors.tuna.tsinghua.edu.cn/apache/maven/
apache-maven-3.3.9-bin.tar.gz #安装包文件
tar xf apache-maven-3.3.9-bin.tar.gz #解压安装包
mv apache-maven-3.3.9 /usr/local/maven-3.3.9 #移动文件位置
ln -s /usr/local/maven-3.3.9 /usr/local/maven #创建一个软链接
#添加环境变量,才可以使用mvn命令
echo "export PATH=/usr/local/maven/bin/:$PATH" >>/etc/profile
source /etc/profile #立即生效环境变量
mvn –v #查看Maven版本信息
Maven命令
mvn test #测试
mvn package #打包编译
mvn clean #清除上一次编译缓存
mvn install #打包和部署项目到本地资源库
更多Maven资料https://www.yiibai.com/maven/
3.安装 Tomcat【Tomcat主机】
#Tomcat主机上操作
-------------------------------------------------------------------
Tomcat介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。【详细介绍百度一下Tomcat】
-------------------------------------------------------------------
#安装Tomcat
Tomcat需要Java环境所以安装Tomcat需要
jdk-8u181-linux-x64.rpm #Java安装包
apache-tomcat-8.0.27.tar.gz #Tomcat安装包
[root@tomcat ~]# ll
total 174960
-rw-r--r-- 1 root root 9128610 Mar 27 2019 apache-tomcat-8.0.27.tar.gz
-rw-r--r-- 1 root root 1456 Mar 15 17:33 hostname_ip.sh
-rw-r--r-- 1 root root 170023183 Aug 14 2018 jdk-8u181-linux-x64.rpm
[root@tomcat ~]# rpm -ivh jdk-8u181-linux-x64.rpm
[root@tomcat ~]# mkdir /application #实际生产中习惯放在这个应用目录中
[root@tomcat ~]# tar xf apache-tomcat-8.0.27.tar.gz -C /application/
[root@tomcat ~]# ln -s /application/apache-tomcat-8.0.27/ /application/tomcat
#配置Tomcat启动加速,117行最后的“random”改为“urandom”
[root@tomcat ~]# vim /usr/java/jdk1.8.0_181-amd64/jre/lib/security/java.security
securerandom.source=file:/dev/urandom
#启动Tomcat
[root@tomcat ~]# /application/tomcat/bin/startup.sh
[root@tomcat ~]# netstat -lntp | grep 8080
tcp6 0 0 :::8080 :::* LISTEN 9691/java
#浏览器访问10.0.0.85:8080
4.开发用户安装 Maven【dev01主机】
#dev01主机上操作
-------------------------------------------------------------------
开发用户主机需要安装Git、Java、Maven
yum install -y git #安装Git
rpm -ivh jdk-8u181-linux-x64.rpm #安装Java
apache-maven-3.3.9-bin.tar.gz #Maven安装包文件
tar xf apache-maven-3.3.9-bin.tar.gz #解压Maven安装包
mv apache-maven-3.3.9 /usr/local/maven-3.3.9 #移动Maven文件位置
ln -s /usr/local/maven-3.3.9 /usr/local/maven #创建一个Maven软链接
#添加环境变量,才可以使用mvn命令
echo "export PATH=/usr/local/maven/bin/:$PATH" >>/etc/profile
source /etc/profile #立即生效环境变量
mvn –v #查看Maven版本信息
环境准备好了,开始上传代码包jeesns.tar.gz【小说阅读网站代码包】
[root@dev01 ~]# tar xf jeesns.tar.gz #解压代码包
[root@dev01 ~]# cd jeesns/ #进入代码目录
[root@dev01 ~/jeesns]# git remote #查看远程仓库
origin
[root@dev01 ~/jeesns]# git remote remove origin #删除远程仓库【如果原来有远程仓库】
[root@dev01 jeesns]# ll jeesns-web/ #jeesns的数据
total 4
drwxr-xr-x 2 root root 113 Nov 19 2018 database
drwxr-xr-x 2 root root 49 Nov 19 2018 doc
-rwxr-xr-x 1 root root 1443 Nov 19 2018 pom.xml #只要是Java代码几乎都有这个文件
drwxr-xr-x 3 root root 18 Nov 19 2018 src
[root@dev01 jeesns]# ll jeesns-web/database/
total 40
-rwxr-xr-x 1 root root 28667 Nov 19 2018 jeesns.sql #数据库文件
-rw-r--r-- 1 root root 3491 Nov 19 2018 update_1.2.0to1.2.1.sql
-rw-r--r-- 1 root root 1026 Nov 19 2018 update_1.2.1to1.3.sql
-rw-r--r-- 1 root root 1344 Nov 19 2018 update_1.3to1.3.1.sql
#将jeesns.sql数据库文件传送到Tomcat主机
[root@dev01 jeesns]# scp -rp jeesns-web/database/jeesns.sql root@10.0.0.85:
#去官方的中央数据仓库下载最新的数据,然后进行编译war包
[root@dev01 ~/jeesns]# mvn package
[root@dev01 ~/jeesns]# ll jeesns-web/target/jeesns-web.war
-rw-r--r-- 1 root root 26106017 2020-03-13 16:35 jeesns-web.war
#推送war包到Tomcat主机
scp -rp jeesns-web.war root@10.0.0.85:/application/tomcat/webapps/ROOT.war
-------------------------------------------------------------------
5.安装数据库【Tomcat主机】
#Tomcat主机上操作
-------------------------------------------------------------------
#安装数据库、启动数据库、设置数据库密码
[root@tomcat ~]# yum install -y mariadb-server
[root@tomcat ~]# systemctl start mariadb.service
[root@tomcat ~]# mysqladmin password "root"
#登陆数据库
[root@tomcat ~]# mysql -uroot -proot
MariaDB [(none)]> create database jeesns; #创建jeesns库
exit #退出数据库
#导入jeesns数据库
[root@tomcat ~]# mysql -uroot -proot jeesns < jeesns.sql
#查看导入情况
[root@tomcat ~]# mysql -uroot -proot
MariaDB [(none)]> use jeesns; #进入jeesns库
MariaDB [jeesns]> show tables; #查看jeesns库中的表
exit
#查看小说阅读网站的war包是否传输过来
[root@tomcat ~]# ll /application/tomcat/webapps/ROOT.war
-rw-r--r-- 1 root root 26106017 Mar 13 16:41 /application/tomcat/webapps/ROOT.war
#重新打开网页
http://10.0.0.85:8080/
默认用户名:admin 密码:jeesns
如果打不开,就查看Tomcat是否启动、数据库是否启动,数据库文件是否导入
/application/tomcat/bin/startup.sh #启动Tomcat
以上 2-5 是Tomcat服务器搭建阅读网站的过程
6.创建 Jeesns 项目
首先在Gitlab网站上创建一个jeesns项目
dev01主机上操作
在开发人员dev01主机上设置jeesns项目的远程仓库
[root@dev01 ~]# rz jeesns.tar.gz #先上传代码包到dev01主机
[root@dev01 ~]# tar xf jeesns.tar.gz #解压代码包
[root@dev01 ~]# cd jeesns/
[root@dev01 ~/jeesns]# git remote #查看远程仓库
origin
[root@dev01 ~/jeesns]# git remote remove origin #删除远程仓库【如果原来有远程仓库】
[root@dev01 jeesns]# mvn clean #每次使用都需要先清空之前的编译
#添加远程仓库
[root@dev01 ~/jeesns]# git remote add origin git@10.0.0.81:OPS/jeesns.git
#先上传代码到本地仓库
[root@dev01 ~/jeesns]# git add .
[root@dev01 ~/jeesns]# git commit -m "上传jeesns代码"
#上传代码到远程仓库
[root@dev01 jeesns]# git push -u origin master
#如果出现下列提示
remote: GitLab: You are not allowed to push code to protected branches on this project.
不允许将代码推送到此项目上受保护的分支【百度翻译】
#去gitlab网页解决错误
gitlab网页上操作
#dev01主机推送错误的解决办法
1、可能是dev01用户权限不够,设置成master或者owner
2、查看jeesns项目的分支保护是否开启
如果有保护就点击上图的Unprotect按钮进行删除
Jenkins网页和主机上操作
创建一个Maven项目
上图的错误是因为jeesns主机没有权限访问gitlab网站的jeesns项目
解决办法如下图
jeesns主机上设置秘钥对
[root@jenkins ~]# ssh-
[root@jenkins ~]# cat .ssh/id_rsa.pub
1、在gitlab的jeesns项目设置中填写名称【随意】和Jenkins主机的公钥
#如果原来没有设置过Jenkins主机的公钥那还需要执行下图中蓝色部分的命令
解决办法:在命令行执行一次报错提示的命令
[root@jenkins ~]# git ls-remote -h git@10.0.0.81:OPS/jeesns.git
The authenticity of host ‘10.0.0.81 (10.0.0.81)’ can’t be established.
ECDSA key fingerprint is SHA256:t/wRHxVb4zTEg6b4AblQmCGpMe4GD3tvRh4cPncimpw.
ECDSA key fingerprint is MD5:cc:13:73:1f:00:53:2e:20:d9:81:4e:11:6f:31:b6:6f.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added ‘10.0.0.81’ (ECDSA) to the list of known hosts.
3935eb759d27d62b2afbc0526b778c499a8d8c1b refs/heads/master
2、如果原来设置过Jenkins主机的公钥只需要点击下图的Enable按钮
jeesns项目添加Jenkins主机公钥成功后如下图
错误解决之后将原来的gitlab项目地址删除后重新粘贴一下
设置Build会发现报错找不到maven,先填写clean package后保存配置
clean和package就是先清除上一次编译缓存再进行打包编译
mvn clean #清除上一次编译缓存
mvn package #打包编译
去【主页>系统管理>全局安全配置】解决上图的报错问题
返回Jenkins的项目maven-jeesns-job配置中查看报错已经没了
接下来就可以点击maven-jeesns-job项目的【立即构建】来创建war包
如果构建成功就可以在Jenkins主机上看到jeesns-web.war文件
ll /var/lib/jenkins/workspace/maven-jeesns-job/jeesns-web/target/
-rw-r–r-- 1 root root 26106035 2020-03-13 17:21 jeesns-web.war
#如果构建时出现下图错误,就需要再次进行构建,因为这是网络连接造成的错误
接下来编写一个脚本用来实现新代码上线
脚本涉及到推送文件,就需要将Jenkins主机的公钥先推送到Tomcat主机上
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.0.0.85
[root@jenkins ~]# mkdir -p /scripts/
[root@jenkins ~]# vim /scripts/jeesns_depoly.sh
-------------------------------------------------------------------
#!/bin/bash
Web_Ip=10.0.0.85
Code_Dir=/application/tomcat/webapps
Old_Code_Dir=${JOB_NAME}_$(($BUILD_NUMBER - 1 ))
#1.判断目录是否存在
ssh root@$Web_Ip "[ -d /opt/$Old_Code_Dir ] || mkdir -p /opt/$Old_Code_Dir"
#2.将旧的war包进行移动保存
ssh root@$Web_Ip "mv $Code_Dir/ROOT.war /opt/$Old_Code_Dir"
#3.将新编译的war包进行传送到站点目录
scp -rp $WORKSPACE/jeesns-web/target/jeesns-web.war root@$Web_Ip:$Code_Dir/ROOT.war
-------------------------------------------------------------------
设置构建后命令
通过上面的脚本可以知道
#旧war包存放位置
[root@tomcat ~]# ll /opt/
drwxr-xr-x 2 root root 22 Mar 17 13:23 jeesns_4
#新war包存放位置
[root@tomcat ~]# ll /application/tomcat/webapps
-rw-r--r-- 1 root root 26105966 Mar 17 13:22 ROOT.war
#查看Tomcat和数据库 启动没有,没有就启动一下,然后就可以查看新代码的网页效果了
[root@tomcat ~]# netstat -lntp | grep 8080
[root@tomcat ~]# /application/tomcat/bin/startup.sh
[root@tomcat ~]# systemctl start mariadb
#新代码网页效果
http://10.0.0.85:8080/manage/index
Jenkins 创建 Pipeline 项目
1. 基础概念
CI/CD持续集成/持续部署
持续集成(Continuous integration)是一种软件开发实践,即团队开发成员经常集成它们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
比如:装修厨房铺地砖,边角地砖要切割大小。如果一次全切割完再铺上去,发现尺寸有误的话浪费和返工时间就大了,不如切一块铺一块。这就是持续集成。
持续部署(continuous deployment)是通过自动化的构建、测试和部署循环来快速交付高质量的产品。某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器,投资机器优化开发流程化相对也提高了人的效率。
比如:装修厨房有很多部分,每个部分都有检测手段,如地砖铺完了要测试漏水与否,线路铺完了要通电测试电路通顺,水管装好了也要测试冷水热水。如果全部装完了再测,出现问题可能会互相影响,比如电路不行可能要把地砖给挖开……。那么每完成一部分就测试,这是持续部署。
持续交付 Continuous Delivery:频繁地将软件的新版本,交付给质量团队或者用户,以供评审尽早发现生产环境中存在的问题;如果评审通过,代码就进入生产阶段.
比如:全部装修完了,你去验收,发现地砖颜色不合意,水池太小,灶台位置不对,返工吗?所以不如每完成一部分,你就去用户那试用验收,这就是持续交付。
#敏捷思想中提出的这三个观点,还强调一件事:通过技术手段自动化这三个工作。加快交付速度。
Jenkins 2.0的精髓是Pipeline as Code,是帮助Jenkins实现CI到CD转变的重要角色。什么是Pipeline,简单来说,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程都可以表述为一段Groovy脚本,并且Jenkins支持从代码库直接读取脚本,从而实现了Pipeline as Code的理念。
Pipeline 是一个用户定义的 CD 流水线模式。Pipeline 代码定义了通常包含构建、测试和发布步骤的完整的构建过程。
Node 是一个机器,它是 Jenkins 环境的一部分,并且能够执行 Pipeline。同时,node 代码块也是脚本式Pipeline 语法的关键特性。
Stage 块定义了在整个 Pipeline 中执行的概念上不同的任务子集(例如"构建","测试"和"部署"阶段),许多插件使用它来可视化或呈现 Jenkins 管道状态/进度。
Step 一项任务。从根本上讲,一个步骤告诉 Jenkins 在特定时间点(或过程中的"步骤")要做什么。例如,使用sh step:sh 'make' 可以执行 make 这个 shell 命令。
2. 创建 Pipeline 项目
Jenkins file 分为:声明式、脚本式
- 创建项目
将下方代码复制进pipeline
脚本式语法格式如下:
----------------------------------------------
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code from scm"
}
}
stage("package"){
steps{
echo "packge code"
}
}
stage("deploy"){
steps{
echo "deploy packge to node1"
}
}
}
}
----------------------------------------------
通过下图的各个环节可以看出每个环节的具体信息,如果有错可以很直观的看出是哪里出的错。
用大转盘项目做一个测试,如果是第一次还需要将报错中的命令在xshell中执行一次
将上图中的 Jenkinsfile 复制下来后去Jenkins页面打开下图
将刚刚复制的名称和之前的代码填入下图对应位置
按这里提交新添加的新文件
再次来到Jenkins页面进入Pipeline项目点击 立即构建
- 自动代码上线
在Jenkins页面点击刚刚创建的文件编辑自动代码上线的内容
代码1
-------------------------------------------------
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code"
}
}
stage("unit test"){
steps{
echo "unit test"
}
}
stage("package"){
steps{
sh 'tar zcf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./.git --exclude=Jenkinsfile'
}
}
stage("deploy"){
steps{
sh 'ssh 10.0.0.80 "mkdir /opt/web-${BUILD_ID}"'
sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.80:/opt'
sh 'ssh 10.0.0.80 "tar xf /opt/web-${BUILD_ID}.tar.gz -C /code"'
}
}
}
}
-------------------------------------------------
代码2(将代码1的打包命令和推送代码命令放入了脚本中)
-------------------------------------------------
pipeline{
agent any
stages{
stage("get code"){
steps{
echo "get code"
}
}
stage("unit test"){
steps{
echo "unit test"
}
}
stage("package"){
steps{
echo "packge code"
}
}
stage("deploy"){
steps{
sh '/bin/bash /scripts/dzp.sh'
}
}
}
}
-------------------------------------------------
脚本内容如下:
[root@jenkins ~]# vim /scripts/dzp.sh
-------------------------------------------------------------
#!/bin/bash
web_ip=10.0.0.84
build=$(($BUILD_NUMBER - 1))
old_code_dir=${JOB_NAME}_$build
echo $old_code_dir
ssh root@$web_ip "[ -d $old_code_dir ] || mkdir -p /opt/$old_code_dir"
#1、将旧的代码移动到别的目录
ssh root@$web_ip "mv /code/dzp/* /opt/$old_code_dir"
#2、移动新的代码到站点目录
scp -rp $WORKSPACE/* root@${web_ip}:/code/dzp
-------------------------------------------------------------
准备完成立即构建,报错了,可以很清楚的找到在哪一步出错
根据错误提示去解决主机秘钥验证失败的问题
脚本中有推送文件的命令,那就是Jenkins推送文件到web服务器验证失败
手动推送一次Jenkins公钥到web服务器就OK 了