Jenkins实现自动化构建与部署(超详细)

前言

本文如果对你有所帮助,求收藏、点赞、评论,转载请注明出处。

前置介绍

本文中使用的软硬件信息、项目简介如下:

  1. 系统:CentOs
  2. OpenJDK 版本:11
  3. Jenkins 版本:2.375.2
  4. 项目架构:Egg + Vue2 + Typescript

给对 Linux 不熟悉的同学多说一句,命令行修改文件时,按“i”键进行编辑,修改完毕后,ESC 退出编辑,“:wq” 保存内容并退出,“:q” 不保存直接退出

安装

JDK 安装

之前如果安装过其它低版本需先卸载

卸载

查看是否已安装 OpenJDK

rpm -qa | grep Java
rpm -qa | grep jdk

批量卸载命令

rpm -qa | grep jdk | xargs rpm -e --nodeps
rpm -qa | grep java | xargs rpm -e --nodeps

安装

安装方式有两种

通过 yum 安装
yum install -y java-11-openjdk java-11-openjdk-devel

安装完成后执行下面的命令,查看安装目录

ls -l $(which java)
Jenkins实现自动化构建与部署(超详细)
安装路径

/usr/lib/jvm/java-11-openjdk-11.0.18.0.10-1.el7_9.x86_64/bin/java 就是我的 Java 的安装路径

自行下载后解压安装

这种方式需要我们先下载好 OpenJDK,这里使用的版本是 openjdk-11+28_linux-x64_bin.tar.gz

下载好后,登录云服务器,创建目录 /usr/java,将刚刚下载的压缩包上传到该目录

mkdir /usr/java

进入该目录,并解压文件

cd /usr/java/
tar -zxvf openjdk-11+28_linux-x64_bin.tar.gz

这时候的安装路径就变成了 /usr/java/jdk-11

环境变量配置

下面开始配置环境变量

vim /etc/profile
Jenkins实现自动化构建与部署(超详细)
环境变量配置

将 JAVA_HOME 配置成 Java 的安装路径(上一步的安装路径)

保存后,执行以下命令,使环境变量生效

source /etc/profile

Jenkins 安装

同样的,如果之前有安装并运行过 Jenkins 也需要先卸载

卸载

# 停止已启动的 Jenkins 服务
systemctl stop jenkins.service

#
 卸载 Jenkins 包
rpm -e jenkins

#
 查看是否还有jenkins依赖,有就删除
rpm -qa | grep jenkins

#
 以下目录/文件是我本机之前安装的Jenkins(不同版本、系统可能有差异)
rm -rf /etc/sysconfig/jenkins.rpmsave
rm -rf /var/cache/jenkins/
rm -rf /var/lib/jenkins/
rm -rf /var/log/jenkins
rm -rf /usr/lib/jenkins

安装

方式有多种,这里提供 rpm 的安装方式

  1. 先下载 Jenkins 的 rpm 包到本地,推荐从 清华的镜像站点 下载 Jenkins 包(这里我下的版本是 jenkins-2.375.2-1.1.noarch.rpmJenkins实现自动化构建与部署(超详细)

  2. 在你的云服务器上创建目录 mkdir /usr/local/jenkins 并上传刚刚下载的 rpm 包,上传好后切换到 /usr/local/jenkins 目录下,执行以下命令开始安装

    rpm -ivh jenkins-2.370-1.1.noarch.rpm
  3. 查看 Jenkins 安装路径

    rpm -ql jenkins

    路径释义

    /usr/lib/jenkins/ # jenkins安装目录,war包会放在这里。
    /etc/sysconfig/jenkins # jenkins配置文件,“端口”,“JENKINS_HOME” 等都可以在这里配置。
    /var/lib/jenkins # 默认的JENKINS_HOME。 /var/log/jenkins/jenkins.log:jenkins日志文件。
    /var/cache/jenkins # jenkins war解压路径。

Jenkins 启动前配置

安装完成后,Jenkins 默认账号名是 jenkins(不是登录账号),默认端口为:8080

修改端口、账号名(非必要)

如果需要修改,执行以下命令,修改配置文件

vim /etc/sysconfig/jenkins

如下图,JENKINS_USER 是账号名,JENKINS_PORT 就是端口号Jenkins实现自动化构建与部署(超详细)

修改完成后,执行 daemon-reload 命令重新加载使配置生效

systemctl daemon-reload

然后,修改一下目录权限,防止意外情况

chmod -R 777 /var/lib/jenkins
chmod -R 777 /var/cache/jenkins
chmod -R 777 /var/log/jenkins

记得放开云服务器防火墙对 Jenkins 端口的限制

如果,启动服务后发现修改的端口配置没有生效,需要再去 /usr/lib/systemd/system/jenkins.service 修改一下端口

vim /usr/lib/systemd/system/jenkins.service

找到 Environment="JENKINS_PORT=8080" 修改Jenkins实现自动化构建与部署(超详细)

修改完成后,同样执行 daemon-reload 命令重新加载使配置生效,再重启一下 Jenkins

service jenkins restart

修改 Jenkins 更新配置

  1. 联网配置 jenkins 安装更新时,默认会检查网络连接,默认的 checkulrhttp://www.google.com/ ,国内无法访问,我们把 url 改成国内可访问的地址即可,如 http://www.baidu.com

    修改 jenkins 配置文件:.jenkins/updates/default.json

    vim .jenkins/updates/default.json
  2. 更新配置

    默认是国外的源,国内下载可能失败,建议更换

    vim /var/jenkins_home/hudson.model.UpdateCenter.xml
    bash-4.4# cat /var/jenkins_home/hudson.model.UpdateCenter.xml
    <?xml version='1.1' encoding='UTF-8'?>
    <sites>
    <site>
        <id>default</id>
        <url>https://updates.jenkins.io/update-center.json</url>
    </site>

    将 url 更换为 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

Jenkins 初始化配置

访问 Jenkins 地址,就能看到如下画面

Jenkins实现自动化构建与部署(超详细)
jenkins welcome(网图)

根据提示,前往 /var/lib/jenkins/secrets 目录查看密码

cat /var/lib/jenkins/secrets/initialAdminPassword

注册你自己的管理员账号(忘记截图了)

这里我直接选择安装推荐插件(又忘截图了)

SSH Keys 配置

为方便 Jenkins 从 github 上拉取代码,避免使用密码,这里使用 ssh

生成凭证

  1. 输入以下命令,双引号内是你登录 github 的邮箱地址

    ssh-keygen -t rsa -C “123456@qq.com”
  2. 会出现让输入两次密码的操作,直接按回车跳过。

    SSH 凭证生成成功,生成的秘钥存储在 /root/.ssh 路径下

    • 公钥文件:id_rsa.pub
    • 私钥文件:id_rsa

公钥配置到 Github

复制 id_rsa.pub 中的内容,将公钥的内容配置到 GitHub

Settings > SSH and GPG keys

Jenkins实现自动化构建与部署(超详细)
github ssh

右上角点击 New SSH key,名称随意,Key 中黏贴 id_rsa.pub 中的内容

Jenkins实现自动化构建与部署(超详细)
github new ssh

私钥配置到 Jenkins

  1. 配置凭据(Manage Jenkins > Manage credentials)Jenkins实现自动化构建与部署(超详细)
  2. 点击全局,在全局域下新建一个凭据Jenkins实现自动化构建与部署(超详细)
  3. 新建凭据Jenkins实现自动化构建与部署(超详细)类型选择 SSH Username with private keyJenkins实现自动化构建与部署(超详细)在私钥那里点击 Enter directly,将私钥文件 id_rsa 中的内容粘贴上去Jenkins实现自动化构建与部署(超详细)

到这里我们就配置好凭据了

绕过新版 Jenkins 的安全校验

在配置构建任务时,Jenkins 会对 github 地址进行校验,这里是为了防止校验失败

地址与凭据都是正确的,新版加强了安全校验,索性不校验了

  1. 在配置页面,找到全局安全配置Jenkins实现自动化构建与部署(超详细)

  2. 直接拖到最底部,在 Git Host Key Verification Configuration 处选择 No verification,点击保存或应用Jenkins实现自动化构建与部署(超详细)

创建任务

配置基本完成,接下来就开始创建任务了

Pipeline

这里我使用的是 Pipeline,能直观地看到构建情况

Jenkins实现自动化构建与部署(超详细)
新建任务

创建后开始配置任务,这里讲一下 Pipeline 的配置,允许直接在配置中编写 pipeline 语句,也可以选择读取文件中语句,我这里选择的是读取 Git 项目中的文件

在 Repositories 中填入你 Git 项目的 SSH 路径,凭据选择我们上一步创建的全局凭据;如果没有绕过 Jenkins 的安全校验,这里选择完凭据后会报错

Jenkins实现自动化构建与部署(超详细)
Pipeline Setting

可以修改读取的分支(默认 master)与 pipeline 脚本文件所在的路径(默认就是放在根目录下的 Jenkinsfile)

Jenkins实现自动化构建与部署(超详细)
Pipeline Setting

WebHook

这一配置是实现 Github 到 Jenkins 自动化的关键,达到的效果就是 Git 项目完成一次 Push 操作后,Jenkins 中对应的任务就开始构建

插件安装

在配置中选择插件管理

Jenkins实现自动化构建与部署(超详细)
插件管理

在可用插件中直接搜索 Generic Webhook Trigger,安装插件

Jenkins实现自动化构建与部署(超详细)
webhook plugin

任务配置

回到任务配置中,在构建触发器这里选择 Generic Webhook Trigger

Jenkins实现自动化构建与部署(超详细)
webhook trigger

http://JENKINS_URL/generic-webhook-trigger/invoke 这个就是触发构建的地址,JENKINS_URL 需要替换为你 Jenkins 服务运行的地址

这个插件还有 token 等可选配置,感兴趣可以自行探索,这里就不深入了

Git 配置

进入 GitHub 项目中,在设置里找到 Webhooks

Jenkins实现自动化构建与部署(超详细)
github webhooks

在 Payload URL 中填入触发构建地址,http://JENKINS_URL/generic-webhook-trigger/invoke注意这里的 JENKINS_URL 需要替换为你 Jenkins 服务运行的地址

Jenkins实现自动化构建与部署(超详细)
github webhooks

(如果填写完后 Git 校验不通过,试着去任务配置里加上 token 配置,invoke url 上也加上 token 参数)

Node 环境

你没有看错,就是在 Jenkins 下创建一个 node 环境,因为我的 pipeline 脚本中会直接运行 npm,干脆直接放到 Jenkins 中,省的在云服务器上安装了

插件安装

借助插件完成

在可用插件中直接搜索 NodeJS Plugin,安装插件

我这里已经安装了,就不截图了

Node 配置

在系统管理中找到 全局工作配置

Jenkins实现自动化构建与部署(超详细)
全局工具配置

在 NodeJS 那一栏,点击新增,选择你需要的 node 版本并填写别名

Jenkins实现自动化构建与部署(超详细)
NodeJS

如果需要多个版本就继续点击新增,后续在 Pipeline 使用中,是直接使用的别名,所以最好起个一眼就能看出版本的名字

Pipeline 脚本文件

直接在项目根目录下创建 Jenkinsfile 文件

Jenkins实现自动化构建与部署(超详细)
项目目录

Jenkinsfile 语法(Declarative)

先来简单了解一下这个语法,不感兴趣也可以略过啦,不影响使用

Jenkinsfile 支持两种语法形式:

  • Declarative pipeline – 在 pipeline v2.5 之后引入,结构化方式,比较简单,容易上手。这种类似于我们在做自动化测试时所接触的关键字驱动模式,只要理解其定义好的关键词,按要求填充数据即可。入门容易,但是灵活性欠缺。
  • Scripted pipeline – 基于 grjoovy 的语法,相较于 Declarative,扩展性比较高,好封装,但是有些难度,需要一定的编程工具

我这里使用的是 Declarative,所以主要介绍 Declarative 语法

  • 必须包含在固定格式 Pipeline{} 块内,每个声明语句必须独立一行,行尾无需使用分号。
  • 块 blocks{} 只能包含章节(Sections),指令(Directves),步骤(Steps) 或 赋值语句

agent:节点

必须存在,agent 必须在 pipeline 块内的顶层定义

  • any :可以在任意 agent 上执行 pipeline
  • none :pipeline 将不分配全局 agent,每个 stage 分配自己的 agent
  • label :指定运行节点的 label
  • node:自定义运行节点配置,指定 label ,指定 customWorkspace(工作空间)
  • Docker:控制目标节点上的 docker 运行相关内容

stages:阶段集

必须存在,包含顺序执行的一个或者多个 stage 命令 在 pipeline 内仅能使用一次 需要定义 stage 的名字

steps:步骤

必须存在

steps 位于 stage 指令块内部,包含一个或者多个 step

stages {
stage("stage name"){
steps{
echo "this is a step"
}
}
}

post:构建后的操作

非必须

  • always:无论 pipeline 运行的完成的状态如何都会运行
  • success:仅当当前 pipeline 具有 成功 状态时才运行
  • failure: 仅当当前 pipeline 具有 失败 状态时才运行

当然还有其他选项,这里不再做扩展介绍;

parameters:参数

非必须

参数化构建的参数设置,参数类型有 booleanParam、choice(选择)、file、text、string 等

parameters{
string( name :'name',defaultValue:'beauty',description:'姓名是')
}

triggers:触发器

非必须

定义了 pipeline 自动化触发的方式

  • cron:接受一个 cron 风格的字符串来定义 pipeline 触发的常规间隔
  • pollSCM:接受一个 cron 风格的字符串来定义 jenkins 检查 SCM 源更改的常规间隔;如果存在新的更改,则 pipeline 将被重新触发
triggers{
cron('_/1 _ * * *')
}

每隔一分钟执行一次

triggers{
pollSCM('_/1 _ * * *')
}

每隔一分钟监控 SCM 源,更改即触发

编写

我将构建部署拆分为了 4 个阶段

拉取代码

这里直接使用 git 命令即可

git branch: 'master', credentialsId: 'xxx', url: 'git@github.com:LuciferHuang/xxx.git'

credentialsId 就是我们前面设置的全局凭据自动生成的 id,如下图Jenkins实现自动化构建与部署(超详细)

项目构建

主要干一件事,就是构建 egg 项目

安装依赖,执行 npm run build,构建完成后删除依赖

docker 构建

我的 egg 项目中直接使用了 docker 接管项目运行

因此,这一步就是执行 docker 命令生成镜像

docker 运行

这里分成两步

  1. 先停止原先运行的 docker 容器(防止占用端口)
  2. 使用 run 命令创建并运行 docker 容器

完整脚本

pipeline{
agent any
tools {
nodejs 'NodeJS_14.17.6'
}
stages{
stage("pull"){
steps {
sh 'sudo rm -rf public'
sh 'sudo rm -rf logs'
git branch: 'master', credentialsId: 'xxx', url: 'git@github.com:LuciferHuang/xxx.git'
}
}
stage("project build"){
steps {
sh 'npm install'
sh 'npm run build'
sh 'sudo rm -rf node_modules'
}
}
stage("docker build"){
steps {
sh 'docker build -t xxx:v${BUILD_NUMBER} . '
}
}
stage("docker run"){
steps {
sh 'docker stop $(docker ps -a -q)'
sh 'docker run -p 80:80 --name xxx_v${BUILD_NUMBER} -d xxx:v${BUILD_NUMBER}'
}
}
}
}

tools 中使用的 nodejs 就是前面的步骤配置的 NodeJS 别名

BUILD_NUMBER 是当前任务的构建版本号,脚本仅供参考,自行按需修改

结语

到这里就成功搭建好了,修改一下代码 push 上去,就能看到效果了

Jenkins实现自动化构建与部署(超详细)
完结撒花

偶尔会无法触发自动构建,可以进 Github 项目的 WebHooks 查看最近的触发情况

Jenkins实现自动化构建与部署(超详细)
webhook触发情况

附录

  1. 清华大学开源软件镜像站(Jenkins 包)(https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/)

参考链接

  1. https://melonfield.cn/column/detail/cv3I7PBRIgh
  2. https://blog.csdn.net/qq_15283475/article/details/127284810
  3. https://blog.csdn.net/qq_34777982/article/details/119941926
  4. https://blog.csdn.net/qq_36613617/article/details/128053526
  5. https://www.easck.com/cos/2021/0928/890051.shtml


原文始发于微信公众号(MelonField):Jenkins实现自动化构建与部署(超详细)

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

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/126169.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!