Jenkins的安装和搭建自动化部署平台
环境
操作系统:Ubuntu 18.04.6 LTS
内核版本:5.4.0-149-generic
Docker版本:24.0.2
Docker Compose 版本:v2.18.0
Jenkins 版本:2.393-alpine
JDK 版本:java 11.0.19 2023-04-18 LTS
Git 版本:2.28.0
Maven 版本:3.6.3
Node JS 版本:16.16.0
Jenkins主节点:192.168.6.92
Jenkins agent节点:192.168.6.91
一、Jenkins官网
- 英文官网
- 英文官方文档
- 中文官网
- 中文官方文档
- Docker Hub网址 (存放Jenkins官方镜像)
二、Jenkins概述
持续集成(CI)是一种开发实践,其中开发人员经常(最好每天几次)将代码集成到共享存储库中。然后可以通过自动构建和自动测试来验证每个集成。尽管自动化测试不是严格意义上的CI的一部分,但通常隐含了它。
定期集成的主要好处之一是,您可以快速检测到错误并更轻松地定位它们。由于引入的每个更改通常很小,因此可以快速查明引入缺陷的特定更改。
近年来,CI已成为软件开发的最佳实践,并遵循一系列关键原则。其中包括版本控制,构建自动化和自动化测试。
此外,持续部署和持续交付已成为最佳实践,可让您随时随地部署应用程序,甚至在每次引入新更改时甚至将主代码库自动推入生产环境。这使您的团队可以快速行动,同时保持可以自动检查的高质量标准。
CI/CD应用场景:
- 开发人员将本地代码上传gitlab版本服务器
- jenkins通过webhook插件自动到gitlab服务器拉取最新代码
- 通过docker-maven-plugin插件自动编译代码
- 将自定义镜像上传docker私服仓库
- k8s集群自动拉取最新版本镜像
- 自动化部署整个项目
- 用户通过nginx负载均衡访问整个项目
三、Jenkins的部署
使用Docker部署Jenkins
拉取镜像
docker pull jenkins/jenkins:2.393-alpine
创建映射目录,并给目录授权
mkdir -p /data/jenkins && chown -R 1000:1000 /data/jenkins
运行容器
docker run -itd \
--name jenkins \
-p 8080:8080 \
-p 50000:50000 \
-u root \
-e JAVA_OPTS=-Duser.timezone=Asia/Shanghai \
--restart always \
-v /data/jenkins/:/var/jenkins_home/ \
jenkins/jenkins:2.393-alpine
查看容器启动日志并找到jenkins初始化密码
docker logs -f jenkins
浏览器访问Jenkins
安装Jenkins插件
插件安装完成
创建管理员账户
配置实例
安装完成
四、Jenkins设置中文支持
1. 点击 Manage Jenkins
2. 点击Manage Plugins
3. 搜索并安装 locale 插件
4. 安装完成后重启 Jenkins
重启Jenkins
docker restart jenkins
5. 验证
此时再次重新登录Jenkins,发现已变成中文了,这是由于Locale插件自动根据浏览器语言设置,切换对应的语言支持。
五、Jenkins初体验
1. 自由风格项目
- 点击
新建任务
- 填写
任务名称
- 选择
构建一个自由风格的软件项目
- 点击
确定
- 添加构建步骤,选择 执行shell
- 填写shell命令
- 点击 保存
- 点击 立即构建 ,查看执行结果
- 查看控制台输出
这里需要了解一点:
之所以可以执行 java --version
和 git --version
指令,是因为Jenkins容器内部已安装了该工具,没有安装了工具,执行就会报错,比如:mvn --version
, Jenkins容器内部默认是没有安装Maven的。
2. 流水线项目
2.1 安装插件
流水线任务需要**Pipeline插件
**的支持,在创建流水线任务之前,先确保Jenkins已安装 Pipeline插件
。
具体在:Dashboard –> 系统管理 –> 插件管理 中安装
2.2 配置流水线任务
- 填写
任务名称
- 选择
构建一个Pipeline项目
- 点击
确定
- 编辑脚本,点击
保存
- 运行任务,查看运行结果
六、Jenkins部署运维后端代码
操作步骤
- 指定部署节点
- 部署节点为Jenkins服务所在节点的从节点,也叫:代理节点
- 主节点与代理节点之间通过SSH方式连接
- 代理节点拉取代码
- 代理节点需要安装Git
- 代理节点将打包打成jar包
- 代理节点需要安装Maven、JDK
- 代理节点将Jar包制作成Docker镜像
- 代理节点需要安装Docker
- 代理节点运行docker镜像
- 通过shell命令行
1. 代理节点配置软连接
master节点ssh连接agent节点时需要/usr/bin/有java命令。配置java的软连接、同理配置maven、git的软连接。如果软件是yum安装的,则需要检查/usr/bin中是否有相关命令。如果没有,也需要做软连接。
ln -s /opt/module/jdk-11.0.19/bin/java /usr/bin/
ln -s /opt/module/apache-maven-3.6.3/bin/mvn /usr/bin/
ln -s /opt/module/git/bin/git /usr/bin/
2. 添加代理节点
2.1 进入节点列表页面
- 点击 系统管理
- 点击 节点列表
2.2 添加节点
- 点击 新建节点
2.3 编辑节点名称和属性
- 填写 节点名称
- 选择 固定节点
- 点击 创建
2.4 配置节点
名称:填写节点名称,用于展示
描述:填写节点描述,可不填
执行器数量:最小是1,建议跟服务器内核数一致。
远程工作目录:Jenkins运行的目录,提前在代理服务器上创建好
在代理节点上创建工作目录 mkdir -p /data/workspaces
标签:代理节点的标签,也是代理节点的唯一标识
用法:选择 仅在此节点上运行
启动方式:选择
Launch agents via SSH
- 主机:代理节点IP
- 凭据:选择给代理节点配置的凭据,没有则点击下方的
添加
按钮创建凭据 - 主机验证方式:选择
Non verifying Verification Strategy
可用性:选择
尽可能在此节点上运行
点击
保存
2.5 添加凭据
在节点配置页面点击
添加
按钮点击
Jenkins
进入凭据配置页面作用域:选择
全局凭据
类型:选择
SSH Username with private key
范围:全局
ID:不用填,配置完成保存后会自动生成
描述:凭据的描述,可不填
Username:代理节点的root用户密码
Private Key:对应的就是Jenkins主节点生成的私钥信息
勾选
Enter directly
输入Jenkins主节点完整的私钥信息
这里首先要配置主节点与代理节点的免密登录,具体方式如下:
在master节点生成密钥 ssh-keygen -t rsa 复制公钥到agent节点 ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.6.91 免密登录测试 ssh 192.168.6.91 查看私钥信息(主节点执行) cat /root/.ssh/id_rsa
密码:填写代理服务器root用户登录密码
点击
添加
,保存凭据此时在 代理节点配置页面,就可以勾选刚才配置的凭据信息了
3. 配置Gitlab凭据
Jenkins工作台 –> 系统管理 –> credentials –> 在Stores scoped to Jenkins下的’全局’ –> 添加凭据
- 类型:Username with password
- 范围:全局
- 用户名:登录Gitlab的用户名
- 密码:登录Gitlab的密码
- ID:不用填,自动生成
- 描述:可不填
4. 配置Pipeline流水线任务
4.1 新建任务
4.2 配置任务
定义:选择
Pipeline script from SCM
- SCM: 选择 Git
- Repository URL:填写项目Git地址
- 凭据:选择gitlab登录凭据,没有则添加
- 构建分支:默认Master分支
- 源码库浏览器:自动
脚本路径:Jenkinsfile (名称不要改,使用默认的)
添加Gitlab凭据
任务配置页面,
凭据
下点击添加
凭据页面配置如下:
- Domain:全局
- 类型:Username with password
- 范围:全局
- 用户名:root
- 密码:root用户密码
- ID:不用填,会自动生成
- 描述:可不填
5. 编辑 Jenkinsfile 文件
- 该文件名称必须为 Jenkinsfile ,大小写要完全一致
- 该文件要在项目的根路径下
- 文件内容使用按照流水线格式,采用Groovy语法编写,可使用
流水线语法
生成器生成片段
5.1 流水线语法生成器
在流水线任务配置页面,下拉到页面最下方,点击 流水线语法
,打开流水线语法生成页面。
5.1.1 实例:生成git 拉取代码指令
5.2 Jenkinsfile 内容如下
pipeline {
agent {
label 'agent-6-91'
}
stages {
stage('检测环境') {
steps {
echo '开始检测环境'
sh '''java -version
mvn -v
docker -v
git version'''
}
}
stage('拉取代码') {
steps {
echo '开始拉取代码'
checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: '5c2185ef-6204-4c3b-b6dc-92b0ea5e55a1', url: 'http://192.168.6.211:3060/GeorgeChan/ioms-test.git']])
}
}
stage('编译构建') {
steps {
echo '开始执行代码编译'
sh 'mvn clean package -pl ioms-eureka -am -Dmaven.test.skip=true -Ddockerfile.skip=true'
}
}
stage('登录Harbor') {
steps {
echo '开始执行登录Harbor'
sh 'docker login -u admin -p Harbor12345 192.168.6.201:5000'
}
}
stage('运行ioms-eureka') {
steps {
echo '开始执行ioms-eureka模块的镜像构建、容器运行'
script {
// 定义当前工作空间变量
def currentWorkspace = env.WORKSPACE
echo "当前工作空间:${currentWorkspace}"
def currentModule = "ioms-eureka"
// 删除容器
sh """
echo "检查容器 ${currentModule} 是否存在"
containerid=\$(docker ps -a | grep -w ${currentModule} | awk '{print \$1}')
if [ "\$containerid" != "" ]; then
echo '容器存在,停止容器'
docker stop \$containerid
echo '删除容器'
docker rm \$containerid
fi
"""
// 删除镜像
sh """
echo "检查镜像 ${currentModule} 是否存在"
imageid=\$(docker images | grep ${currentModule} | awk '{print \$3}')
if [ "\$imageid" != "" ]; then
echo '删除镜像'
docker rmi -f \$imageid
fi
"""
// 执行 mvn dockerfile:build 命令
// 构建镜像,并获取日志输出
def buildOutput = sh(returnStdout: true, script: "mvn dockerfile:build -pl ioms-eureka -DdockerfileDirectory=${currentWorkspace}/${currentModule}")
def imageName = ""
def tag = ""
// 将日志用换行符切分
def lines = buildOutput.split('\n')
// 遍历日志,获取构建的镜像的名称
lines.each { line ->
def lineStr = line.toString() // 将列表元素转换为字符串
// echo lineStr
if (lineStr.startsWith("[INFO] Successfully tagged")) {
imageName = lineStr.substring(lineStr.indexOf("[INFO] Successfully tagged") + "[INFO] Successfully tagged".length()).trim()
// 192.168.6.201:5000/ioms-hf/ioms-eureka:1.0-SNAPSHOT
tag = imageName.split(":")[2];
}
}
echo "生成的镜像名称:${imageName}"
echo "生成的镜像Tag:${tag}"
echo "开始执行运行${currentModule}容器"
sh "docker-compose up -d ${currentModule}"
}
}
}
stage('构建结束') {
steps {
echo '已成功构建所有模块'
}
}
}
}
6. 运行Pipeline任务
6.1 立即构建
6.2 查看构建过程
6.3 验证结果
浏览器打开eureka访问页面
7. 其它
- 上述所有操作的前提是,要在代理节点安装JDK、Git、Maven,并正确配置环境变量。这些都比较基础,自行补充,这里不再重复。
- Jenkins的中文支持,有时候重启会失效,这个不影响操作。
七、Jenkins部署运维系统前端代码
1. 安装插件
Jenkins要部署前端代码,需要安装两个必要的插件
- Publish Over SSH 用于登录远程服务器,和向远程服务器发送文件
- NodeJs 用于代码的打包
2. 配置远程服务器的连接
1、打开“系统管理”–“系统设置” 找到 “Publish over SSH” 项 , 配置SSH Server
- Name:给要配置的服务器起个名字
- Hostname:服务器IP
- Username:登录用户名
- Remote Directory:登陆成功后默认进入的目录
- Password:登录用户密码
2、点击 Test Configuration 按钮测试连接是否成功
3. 配置NodeJS
打开“系统管理” –> “全局工具配置”, 找到NodeJS, 新增NodeJS
- 别名:NodeJS名称
- 版本:选择适用的NodeJS版本
4. 新建流水线任务
3.1 新建一个自由风格项目
3.2 配置任务
限制项目的运行节点:选择要部署的服务器
源码管理:选择Git
- Repository URL:前端代码Git地址
- Credentials:Gitlab登录凭证
- Branches to build:Git拉取的代码分支,默认Master
构建环境
- Provide Node & npm bin/ folder to PATH:选择适配的NodeJS版本
Build Steps
选择
执行Shell
内容如下:
进入Jenkins工作空间下hxkj项目目录 cd /data/workspaces/workspace/ioms-html ## npm切换为淘宝源 npm config set registry http://registry.npm.taobao.org/ 删除已有的构建包 rm -rf ./dist/ rm -rf dist.tar.gz 安装依赖,跳过安全审计 npm --no-audit i --force 构建项目 npm run test 压缩方便移动到项目部署目录 tar -zcvf dist.tar.gz dist
构建后操作
配置SSH Server
Name:选择部署的服务器
Transfer Set Source files:前端打包后的文件名
Remove prefix:要去除的文件前缀
Remote directory:要进入的远程服务器的文件夹路径
Exec command:进入文件夹后,执行的shell命令
cd /usr/local/docker/data/nginx/html/dist-white/ echo "工作路径:" $(pwd) mv ./dist ./dist$(date +'%Y%m%d%H%M') tar -zxvf dist.tar.gz -C ./ docker restart ioms-nginx rm -rf dist.tar.gz
5. 执行构建任务
5.1 立即构建
5.2 查看构建过程
5.3 验证结果
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com