在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试;或者前后端分离后,经常会修改接口,然后重新部署;这些情况都会涉及到频繁的打包部署;
手动打包常规步骤:
1.提交代码
2.问一下同组小伙伴有没有要提交的代码
3.拉取代码并打包(war包,或者jar包)
4.上传到Linux服务器
5.查看当前程序是否在运行
6.关闭当前程序
7.启动新的jar包
8.观察日志看是否启动成功
9.如果有同事说,自己还有代码没有提交…再次重复1到8的步骤!
那么,有一种工具能够实现,将代码提交到git后就自动打包部署勒,答案是肯定的:Jenkins
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。
在这里我们使用3台服务器分别搭建私服库GitLab、Jenkins+Maven、测试服务器(运行jar包)
由于GitLab所需的内存比较大,所以建议虚拟机内存要在4G以上。
GItLab安装手册:GitLab最新版下载安装_GitLab中文免费版-极狐GitLab中文官方网站
sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash
sudo EXTERNAL_URL="http://虚拟机ip" yum install -y gitlab-jh
安装成功
gitlab-ctl start # 启动所有 gitlab 组件;
gitlab-ctl stop # 停止所有 gitlab 组件;
gitlab-ctl restart # 重启所有 gitlab 组件;
gitlab-ctl status # 查看服务状态;
gitlab-ctl reconfigure # 启动服务;
vi /etc/gitlab/gitlab.rb # 修改默认的配置文件;
gitlab-ctl tail # 查看日志;
gitlab-ctl start
/etc/gitlab/initial_root_password
开放80端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
重新载入
firewall-cmd --reload
查看
firewall-cmd --zone=public --query-port=80/tcp
删除
firewall-cmd --zone=public --remove-port=80/tcp --permanent
$GITLAB_HOME
,指向配置、日志和数据文件所在的目录。export GITLAB_HOME=/srv/gitlab
sudo docker run --detach \
--hostname 192.168.26.138 \
--publish 80:80\
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab \
--volume $GITLAB_HOME/logs:/var/log/gitlab \
--volume $GITLAB_HOME/data:/var/opt/gitlab \
--shm-size 256m \
registry.gitlab.cn/omnibus/gitlab-jh:latest
这一步出错就重启docker服务
systemctl restart docker
查看gitlab镜像和创建一个容器实例
启动gitlab
docker start 容器ID
docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
Jenkins中文网Jenkins
rpm -qa | grep java
rpm -e --nodeps java...
下载jdk11安装包,并传输到指定目录
解压至自定义目录(一般是 /usr/local),再删除安装包
tar -xzvf jdk-8u291-linux-x64.tar.gz -C /usr/local/
rm -rf jdk-11.0.17_linux-x64_bin.tar.gz
配置环境变量。在 profile 文件中添加四个变量。
export JAVA_HOME=/usr/local/jdk-11.0.17
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=/bin:/usr/bin:$PATH:$JAVA_HOME/bin:$PATH
source /etc/profile
java -version
Maven – Welcome to Apache Maven
解压安装包
将解压后的文件放到指定目录下/usr/local/maven
mv apache-maven-3.8.6 /usr/local/maven
找到settings.xml文件
vim /usr/local/maven/conf/settings.xml
alimaven
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
central
/usr/local/maven/bin/mvn -v
yum -y install libcurl-devel expat-devel curl-devel gettext-devel openssl-devel zlib-devel
yum -y install gcc perl-ExtUtils-MakeMaker
cd /usr/local #进入到/usr/lcoal的目录下
mkdir git #新建git目录
wget --no-check-certificate https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.35.3.tar.gz
tar -xzvf git-2.35.3.tar.gz
进入安装包
编译安装
make prefix=/usr/local/git all
make prefix=/usr/local/git install
vim /etc/profile
添加命令行
export PATH=$PATH:/usr/local/git/bin
source /etc/profile
git --version
which git
nohup java -jar jenkins.war >/dev/null 2>&1 &
vim /root/.jenkins/secrets/initialAdminPassword
开始安装插件
创建管理员用户
登录成功
凭据可以用来存储需要密文保护的数据库密码、Gitlab密码信息、Docker私有仓库密码等,以便Jenkins可以和这些第三方的应用进行交互。
这个插件推荐的安装插件中有
要在Jenkins使用凭证管理功能,需要安装Credentials Binding插件
输入GitHub用户名和密码
SSH免密登录示意图:公钥私钥
ssh-keygen -t rsa
公钥生成成功:
后面使用SSH方式连接远程仓库的时候会用到
which git
点击系统配置,找到Publish Over SSH进行配置
在这里指定过目标远程目录后,在配置项目的Post Steps的设置中就不需要再设置
测试连接远程主机成功
在浏览器输入ip+jenkins端口+/job/first-project/build?token=身份验证令牌
项目自动构建
http://192.168.26.135:8080/buildByToken/build?job=first-project&token=root
即在进行推送和合并请求时就自动构建
但是提交Web hooks提示不能够向本地发送网络请求
解决方案:
以管理员身份进行登录
首先创建合并请求
再批准构建
但这样会产生两次自动构建,因为创建合并请求和同意合并请求的时候都会触发自动构建
若已经生成过Token这一步可以省略,直接到7.2.3
当Jenkins收到GitHub推送钩子时,GitHub插件会检查该钩子是否来自与该作业的SCM/Git部分中定义的Git存储库匹配的GitHub存储库。如果它们匹配并且启用了此选项,GitHub插件将在GITScm上触发一次性轮询。当GITScm轮询GitHub时,它发现有变化,并启动构建。
设置过源码管理(连接到仓库)和构建触发器(设置WebHook触发器)后,在项目的Setting中会自动生成WebHook
点击编辑查看WebHook:默认为推送事件触发WebHook
新建maven项目
由于之前已经设置过了WebHook,所以这一步直接选择,若未设置GitHub Server,请移步7.2章节配置GitHub的WebHooks
为了解决每次在Jenkins中多次启动同一项目面对端口被占用的情况,在自动部署前应该清理先前已经传过去的jar包并杀死已经运行的jar包服务
chomd 777 文件名
#!bin/bash
# 删除项目jar
rm -rf /root/jarpackage/vector-admin.jar
if [ -z $1 ];
then
echo "The args cannot be empty"
else
appname=$1
fi
# 执行脚本传入的参数是项目名称 ./resetJar.sh xxxx项目名
echo "arg:$1"
# 过滤出正在执行的jar程序的pid
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`
echo $pid
# 如果pid为空,不执行杀进程
if [ -z $pid ];
then
echo "$appname not started!"
else
kill -9 $pid
echo "$appname stop success!"
fi
执行脚本命令前需要刷新配置
#刷新配置
source /etc/profile
#防止Jenkins杀死脚本进程
BUILD_ID=dontKillMe
#执行脚本,删除jar包,杀死进程
sh /root/jarpackage/vector-start.sh vector-admin
指定pom文件
进行以下操作:
后续配置时出现的问题:
执行命令前刷新配置
# 刷新配置
source /etc/profile
#防止Jenkins杀死脚本进程
BUILD_ID=dontKillMe
# 运行jar包
nohup java -jar /root/jarpackage/vector-admin.jar > vector-admin.log 2>&1 &
tar -xvf node-v16.18.0-linux-x64.tar.gz
ln -s /root/node/node-v16.18.0-linux-x64/bin/node /usr/local/bin/
ln -s /root/node/node-v16.18.0-linux-x64/bin/npm /usr/local/bin/
node -v
# 打开配置文件
$ vim /etc/profile
# 添加配置
export NODE_HOME=/usr/local/node
export PATH=$NODE_HOME/bin:$PATH
# 重新加载profile文件
$ source /etc/profile
首先查看node的安装目录:
which node
如果这一步已经做过请忽略
根据提示,在Gitee对应仓库的管理界面找到WebHooks选项,添加WebHooks,可以不设置密码
在系统配置中找到Public Over SSH,新增SSH Server,这个SSH Server是当前端项目打包好后,发送到的目标服务器。这里的目标主机目录就是发送到文件的位置。
目标目录说明:由于是Vue项目,所以之后将打包好的Vue项目直接放在nginx下的html目录中。/usr/local/nginx就是nginx的默认安装目录。
测试连接成功:
命令依次是:
npm cache clean -f
cd /root/.jenkins/workspace/vector-front/
npm install
npm run build
Nginx百度云网盘地址:
链接:https://pan.baidu.com/s/1hPSRTHlOb5i5RLUhQjDY6w?pwd=xha8
提取码:xha8
tar -xzvf nginx-1.18.0.tar.gz
配置
./configure
编译安装
make && make install
安装完成
可以将压缩包和解压后的文件都删除
进入到以下目录并执行./nginx命令启动Nginx服务
cd /usr/local/nginx/sbin/
./nginx
在本地输入云服务器公网ip,出现以下界面就表示Nginx安装成功。
构建后的任务就是将刚刚压缩好的dist.tar.gz发送到远程目录,并执行脚本文件。
在目标主机上创建".sh脚本文件",用于将刚刚发送到远程目录的压缩包进行解压
命令依次是:
cd /usr/local/nginx/html
tar -xzvf dist.tar.gz
rm -rf /usr/local/nginx/html/dist.tar.gz
cd /usr/local/nginx/conf
vim nginx.conf
如果有多个Vue项目,就复制server内容,再写另一个server
输入服务器ip+监听端口
测试成功
cron表达式模拟器:Crontab.guru - The cron schedule expression editor
样例
#基础镜像使用java
FROM openjdk:8u342-jdk
# 作者
MAINTAINER xha
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名
ADD docker_test-0.0.1-SNAPSHOT.jar dockertest.jar
# 运行jar包
RUN bash -c 'touch /dockertest.jar'
ENTRYPOINT ["java","-jar","/dockertest.jar"]
#暴露8090端口作为微服务
EXPOSE 8090
docker build -t 镜像名:镜像版本 .
docker run d -p 8090:8090 --name project1 jenkins_jar:1.0
推送到远程库
拉取jar包
编写shell脚本,删除文件、镜像和容器
#!/bin/bash
# 删除历史数据
rm -rf project
#删除镜像
docker rmi -f jenkins_jar:1.0
#删除容器
docker rm -f jenkins_container
集群化构建可以有效提升构建效率,尤其是团队项目比较多或是子项目比较多的时候,可以并发在多台机器上执行构建。
再创建两台虚拟机
点击系统管理,再点击节点管理
创建新节点
配置视图,选择在必要时候并发构建
流水线既能作为任务的本身,也能作为Jenkinsfile(类似于Dockerfile)
使用流水线可以让我们的任务从ui手动操作,转换为代码化,像docker的dockerfile一样,从shell命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发Jenkinswebui不能完成的更复杂的构建逻辑,作为开发者可读性也更好。