前言
在我们开发过程中,除了编写代码之外,还经常需要对项目进行构建和部署,构建和部署虽说没那么复杂,但是也是比较繁琐。那我们能不能只需要编写业务代码,然后推送后自动帮我们构建和部署呢。答案那就是CI/CD,先解释下概念
CI 是持续集成(Continuous Integration)的缩写,这是一种在开发阶段引入自动化方法,以便频繁地将代码集成到开发主线中,并将集成后的代码部署到更贴近真实运行环境的“类生产环境”中。CI 的目的是快速发现和解决代码集成时可能出现的问题,从而提高开发效率和代码质量。
CD 是持续部署(Continuous Deployment)的缩写,这是一种自动化的软件发布过程,可以将开发完成的代码自动部署到生产环境中。CD 的目的是快速、可靠地将软件发布到生产环境,减少人为错误和延迟,从而提高软件交付速度和质量。
那么我们只需要关注代码本身,后面的构建和部署交给CI/CD就可以。
Jenkins 简介
Jenkins 是一个开源的、提供友好操作界面的持续集成工具,主要用于持续、自动的构建、测试和部署软件项目。它易于安装和配置,并具有丰富的插件生态系统,可扩展性强。Jenkins旨在实现快速、可靠地交付软件,提高开发效率,减少人为错误和延迟。
前提准备
既然需要在服务器上跑,我们前提需要安装和配置好nginx,这个可以通过宝塔面板快速安装。
安装 Jenkins
首先需要安装java, 因为新版jenkins需要依赖java11,所以直接下载java11版本的就行:
yum install fontconfig java-11-openjdk
接着,安装下载工具 wget:
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
然后,导入下载密匙:
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
执行上述步骤后,就可以安装 Jenkins 了:
yum install jenkins
安装过程中,提示输入yes或y就行
启动 Jenkins
service jenkins start
初始化 Jenkins
在浏览器输入 http://<你的服务器 IP>:8080 就可以访问到 Jenkins 的解锁界面了。
可以看到页面提示启动中
初始化 Jenkins 需要输入一段命令来查看密码:
cat /var/lib/jenkins/secrets/initialAdminPassword
把控制台输出的密码复制到 Jenkins 解锁界面中,插件安装界面了。
安装插件
直接选择安装推荐插件
创建用户
都搞定之后就是创建一个管理员账号了,输入自己喜欢的用户名和密码,输入全名和电子邮箱就可以创建了。
安装 Node.js 插件
创建完用户之后就能够进入到欢迎页了,我们找到左边的 管理 Jenkins,然后找到 插件管理。
在 插件管理 页我们点击 可选插件 Tab,然后在搜索栏中输入 NodeJS,只会命中一个插件,我们安装它。
等待安装完成。
配置 Node.js 插件
紧接着我们就要去配置 Node.js 了,点击 管理 Jenkins,找到 全局工具配置,然后翻到最底下,有一个 NodeJS的配置区域。
我们点击 新增 NodeJS,给它取个名字,选个版本,建议选 LTS 的版本。
安装 Publish Over SSH 插件
配置好 Node.js 之后继续回到 插件管理,搜索 Publish Over SSH 并安装。
配置 Publish Over SSH 插件
安装好之后就要配置 SSH 了,还是点击 管理 Jenkins,找到 系统配置,配置好云服务器的 SSH 连接信息,点击右下角的 Test Configuration 测试一下连接是否正常,显示 Success 就说明配置正确了。
安装 Gitee 插件
跟前面安装插件的步骤一样,我们安装好 Gitee 插件。
配置 Gitee 插件
在配置之前,我们先要到 Gitee 生成新的令牌
我们在设置中找到私人令牌去生成
将新生成的令牌进行复制保存,之后会用到
继续来配置插件,还是到 系统配置 当中,找到 Gitee 配置的部分,点击 添加 Gitee 配置,点击 凭据 右侧的 添加 按钮,选择 Jenkins。
点击后会弹出一个添加凭据的窗口,类型 选择为 Secret text,将我们刚才生成的令牌复制到 Secret 一栏中,点击添加。
添加后我们在 凭据 一栏选中 Secret text,点击 连接测试,如果显示成功,就说明配置成功了。
新建任务
现在我们可以新建任务了,点击主界面左侧的 新建任务,选择 构建一个自由风格的软件项目,给任务取个名字。
我们将 源码管理 选中为 Git,将你要构建部署的项目的 clone 地址填到 Repository URL 一栏中(就是项目的浏览器地址加上 .git 后缀名)。
注意:如果是公开的仓库,Credentials 一栏可以选择无;如果是私有的仓库,需要先添加一个可以访问该仓库的 Gitee 账号,需要类型一栏选择 用户名密码,然后在下方输入 用户名 密码。
接着勾选 构建触发器 一栏中的 Gitee webhook 触发构建
注意这里提示需要在 Gitee webhook 中填写url,这个 url 先不急,我们接下来再会使用,移到下方,可以看到 Gitee Webhook 一栏,点击生成将生成的密码复制
紧接着我们需要在我们的Gitee项目的管理中,进入 WebHooks 一栏,添加WebHook,将上一步的url和密码分别填进去,然后点添加即可。
然后回来我们继续勾选 构建触发器 一栏中的 GitHub hook trigger for GITScm polling,勾选 构建环境 一栏中的 Use secret text(s) or file(s) ,在 凭据 一栏中选中我们之前添加的 Secret text,勾选 Provide Node & npm bin/ folder to PATH 为构建项目提供 Node.js 环境。
然后到 Build Steps 一栏中,增加构建步骤,选择 执行 shell,在命令中输入:
node -v
npm -v
rm -rf node_modules
npm install --registry=https://registry.npmmirror.com/
npm run build
最后一步,我们点击 增加构建后操作步骤,选择 Send build artifacts over SSH,使用 SSH 的方式将代码上传至服务器。
最后点击 保存
立即构建
新建任务 配置完成之后,我们点击左侧的 立即构建,就回发现左下方的 Build History 中多了一个名为 #x 的记录
因为之前我有先构建过所以是 #8,点击 #8,选择左侧的 控制台输出,就可以看到我们打包构建过程中的所有控制台输出了。
构建成功后后我们就可以在网站上看到页面最新效果了。
测试 Webhook
既然要实现自动化构建部署,那就得在每次代码 push 到远程仓库的时候自动执行,所以我们要测试一下 Webhook 是否生效,是否可以触发构建部署。我们推送一下代码,然后再回到 Jenkins,你会发现有个构建正在进行。
总结
在使用 jenkins 时也踩了不少坑,比如在一开时安装 java 使用的是8版本,而最新 jenkins 是依赖 java11 版本。又比如,在构建中老是卡住挂掉,可能是服务器性能不够导致的,目前配置内存只有2GB,所有的应用都在一个服务器上跑,跑起来还是比较吃力,所以还是需要使用高性能的服务器。或者也可以再准备一个干净的服务器只用于 jenkins 构建。