Jenkins 是什么?
Jenkins 是一款业界流行的开源持续集成工具, 广泛用于项目开发, 具有自动化构建, 测试和部署等功能.
准备工作
Linux CentOS 系统阿里云服务器一个
码云一个存放 vue 项目的仓库
开始安装与初始化
1, 安装 JDK
yum install -y java
2, 安装 jenkins
添加 Jenkins 库到 yum 库, Jenkins 将从这里下载安装.
- wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
- rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
- yum install -y jenkins
如果不能安装就到官网下载 jenkis 的 rmp 包, 官网地址(http://pkg.jenkins-ci.org/redhat-stable/)
- wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.3-1.1.noarch.rpm
- rpm -ivh jenkins-2.7.3-1.1.noarch.rpm
配置 jenkis 的端口(可用 xshell 可视化编辑保存)
vi /etc/sysconfig/jenkins
找到修改端口号:
JENKINS_PORT="8080" 此端口不冲突可以不修改
3, 启动 jenkins
service jenkins start/stop/restart
安装成功后 Jenkins 将作为一个守护进程随系统启动
系统会创建一个 "jenkins" 用户来允许这个服务, 如果改变服务所有者, 同时需要修改 / var/log/jenkins, /var/lib/jenkins, 和 / var/cache/jenkins 的所有者
启动的时候将从 / etc/sysconfig/jenkins 获取配置参数
默认情况下, Jenkins 运行在 8080 端口, 在浏览器中直接访问该端进行服务配置
Jenkins 的 RPM 仓库配置被加到 / etc/yum.repos.d/jenkins.repo
4, 打开 jenkins
在浏览器中访问首次进入会要求输入初始密码如下图, 初始密码在:/var/lib/jenkins/secrets/initialAdminPassword
选择 "Install suggested plugins" 安装默认的插件, 下面 Jenkins 就会自己去下载相关的插件进行安装.
创建超级管理员账号
参考: CentOS 下搭建 Jenkins 持续集成环境(安装 jenkins)
创建任务
点击创建一个新任务
选择自由风格的软件项目, 并起一个名字
至此, 基础准备工作已经完成, 我们在服务器上安装了 Jenkins 并启动, 然后进行了初始化配置, 建立了一个新任务. 接下来我们开始配置我们需要的功能.
实现 Git 钩子功能
首先我们要实现一个 Git 钩子功能, 就是我们向 GitHub / 码云等远程仓库 push 我们的代码时, jenkins 能知道我们提交了代码, 这是自动构建自动部署的前提, 钩子的实现原理是在远端仓库上配置一个 Jenkins 服务器的接口地址, 当本地向远端仓库发起 push 时, 远端仓库会向配置的 Jenkins 服务器的接口地址发起一个带参数的请求, jenkins 收到后开始工作.
打开刚创建的任务, 选择配置, 添加远程仓库地址, 配置登录名及密码及分支.
安装 Generic webhook Trigger Plugin 插件 (系统管理 - 插件管理 - 搜索 Generic Webhook Trigger Plugin) 如果可选插件列表为空, 点击高级标签页, 替换升级站点的 URL 为: http://mirror.xmission.com/jenkins/updates/update-center.json 并且点击提交和立即获取.
或者你直接去官网 https://plugins.jenkins.io/ 搜索下载. hpi 文件, 然后在高级那上传插件也行(参考链接)
添加触发器
第 2 步安装的触发器插件功能很强大, 可以根据不同的触发参数触发不同的构建操作, 比如我向远程仓库提交的是 master 分支的代码, 就执行代码部署工作, 我向远程仓库提交的是某个 feature 分支, 就执行单元测试, 单元测试通过后合并至 dev 分支. 灵活性很高, 可以自定义配置适合自己公司的方案, 这里方便演示我们不做任何条件判断, 只要有提交就触发. 在任务配置里勾选 Generic Webhook Trigger 即可
仓库配置钩子 此处以准备工作的码云仓库为例, 因为公司用的是码云, GitHub 的配置基本一致, 进入码云项目主页后, 点击管理 - webhooks - 添加, 会跳出一个这样的框来.
URL 格式为 http://
Jenkins IP 地址和端口是你部署 jenkins 服务器的 ip 地址, 端口号没改过的话就是 8080.
密码填你和上面 userid 对应的密码, 我这里是 root.
下面的几个选项是你在仓库执行什么操作的时候触发钩子, 这里默认用 push.
点击提交完成配置.
如:
http://admin:110ca60a40ffd1d3dac63adc4d01510f2e@120.79.40.118:8080/generic-webhook-trigger/invoke
测试钩子
点击测试, 如果配置是成功的, 你的 Jenkins 左侧栏构建执行状态里将会出现一个任务.
另外, 你也可以试下本地提交代码, 提交代码后, jenkins 也会开始一个任务, 目前我们没有配置任务开始后让它做什么, 所以默认它只会在你提交新代码后, 将新代码拉取到 jenkins 服务器上. 到此为止, Git 钩子我们配置完成.
实现自动化构建(演示而已, NPM 包安装可能有问题)
Git push 触发钩子后, jenkins 就要开始工作了, 自动化的构建任务可以有很多种, 比如说安装升级依赖包, 单元测试, e2e 测试, 压缩静态资源, 批量重命名等等, 无论是 NPM script 还是 webpack,gulp 之类的工作流, 你之前在本地能做的, 在这里同样可以做.
作为演示, 这里只演示三个基本常用的工作流程, 安装依赖包 ->单元测试 ->打包, 也就是下面这三个命令.
NPM install NPM run test
NPM run build
首先, 和本地运行 NPM script 一样, 我们要想在 jenkins 里面执行 NPM 命令, 先要在 jenkins 里面配置 node 的环境, 可以通过配置环境变量的方式引入 node, 也可以通过安装插件的方式, 这里使用了插件的方式, 安装一下 nvm wrapper 这个插件.
打开刚刚的 jenkins 任务, 点击配置里面的构建环境, 勾选这个, 并指定一个 node 版本.
点击构建, 把要执行的命令输进去, 多个命令使用 && 分开.
保存
此时本地修改一下代码 push 测试一下(也可以点击立即构建测试), 点击本次触发的那个任务, 选择控制台输出, 将会看到 Jenkins 在云端执行的过程.
命令行最后一行是 Finished 状态的如果是 SUCCESS(蓝色)则证明执行的任务都顺利进行, 是 FAILURE(红色)则证明中间有重大错误导致任务失败, UNSTABLE(黄色)代表有虽然有些小问题, 但不阻碍任务进行, 黄色或者红色可以去命令行看下错误输出, 看下哪里出了问题.
如果上一步是 SUCCESS, 点击项目的工作空间, 将会发现多了 dist 和 node_modules 两个文件夹.
至此, 我们已经搭建了一个简易的构建工作流程, 构建完成了, 我们需要自动化部署.
如果失败了一般是 NPM 安装失败, 建议单页面部署不需要上面说的命令, 直接本地打包把 dist 文件夹提交仓库
实现自动化部署
自动化部署可能是我们最需要的功能了, 公司就一台服务器, 我们可以使用人工部署的方式, 但是如果公司有 100 台服务器呢, 人工部署就有些吃力了, 而且一旦线上出了问题, 回滚也很麻烦. 所以这一节实现一下自动部署的功能.
首先, 先在 Jenkins 上装一个插件 Publish Over SSH, 我们将通过这个工具实现服务器部署功能.
在要部署代码的服务器上创建一个文件夹用于接收 Jenkins 传过来的代码, 我在服务器上建了一个 testjenkins 的文件夹.
Jenkins 想要往服务器上部署代码必须登录服务器才可以, 这里有两种登录验证方式, 一种是 SSH 验证, 一种是密码验证, 就像你自己登录你的服务器, 你可以使用 SSH 免密登录, 也可以每次输密码登录, 系统管理 - 系统设置里找到 Publish over SSH 这一项. 重点参数说明: (详细看下文的错误解决)
Passphrase: 密码(key 的密码, 没设置就是空)
Path to key:key 文件 (私钥) 的路径
Key: 将私钥复制到这个框中(path to key 和 key 写一个即可)
SSH Servers 的配置:
SSH Server Name: 标识的名字(随便你取什么)
Hostname: 需要连接 SSH 的主机名或 ip 地址(建议 ip)
Username: 用户名
Remote Directory: 远程目录(上面第二步建的 testjenkins 文件夹的路径)
高级配置:
Use password authentication, or use a different key: 勾选这个可以使用密码登录, 不想配 SSH 的可以用这个先试试
Passphrase / Password: 密码登录模式的密码
Port: 端口(默认 22)
Timeout (ms): 超时时间 (毫秒) 默认 300000
配置完成后, 点击 Test Configuration 测试一下是否可以连接上, 如果成功会返回 success, 失败会返回报错信息, 根据报错信息改正即可.
由于配置原因造成一下错误 (参考链接)
错误: jenkins.plugins.publish_over.BapPublisherException: Failed to connect session for config [131]. Message [Auth fail]
配置方法:
1, 生成密钥
我的 jenkins 服务安装在了 Linux 下的 jenkins 用户下
- [jenkins@jenkins ~]$ SSH-keygen
- Generating public/private rsa key pair.
- Enter file in which to save the key (/home/jenkins/.SSH/id_rsa): // 密钥生成路径, 直接默认回车即可
- Created directory '/home/jenkins/.ssh'.
- Enter passphrase (empty for no passphrase): // 默认回车
- Enter same passphrase again: // 默认回车
- Your identification has been saved in /home/jenkins/.SSH/id_rsa.
- Your public key has been saved in /home/jenkins/.SSH/id_rsa.pub.
- The key fingerprint is:
- c0:3d:31:ee:81:b6:5d:5f:d7:83:96:a3:92:85:e0:ab jenkins@jenkins
2, 进入到目录进行查看
- [jenkins@jenkins ~]$ cd .SSH/
- [jenkins@jenkins .SSH]$ ll
- total 8
- -rw-------. 1 jenkins jenkins 1671 Jul 17 23:23 id_rsa
- -rw-r--r--. 1 jenkins jenkins 397 Jul 17 23:23 id_rsa.pub
3, 将公钥拷贝到 authorized_keys 文件
[jenkins@jenkins .SSH]$ cat id_rsa.pub>> authorized_keys
4, 将生成的 authorized_keys 拷贝到要连接的 Linux 机器上的对应用户或者直接 root 下的. SSH 文件夹下
- [jenkins@jenkins .SSH]$ scp authorized_keys root@192.168.0.91:/home/root/.SSH
- The authenticity of host '192.168.0.91 (192.168.0.91)' can't be established.
- RSA key fingerprint is ff:dc:00:df:2c:40:70:63:95:ad:53:85:b7:8a:15:06.
- Are you sure you want to continue connecting (yes/no)? yes
- Warning: Permanently added '192.168.0.91' (RSA) to the list of known hosts.
- reverse mapping checking getaddrinfo for bogon [192.168.0.91] failed - POSSIBLE BREAK-IN ATTEMPT!
- wqq@192.168.0.91's password:
- authorized_keys 100% 397 0.4KB/s 00:00
5, 配置 SSH Server 左上角的 jenkins-->系统管理 -->系统设置
其中 Remote Directory: 远程目录 (写上面第二步建的 testjenkins 文件夹的路径) 能 test 成功就行
4. 接下来进入我们创建的任务, 点击构建, 增加 2 行代码, 意思是将 dist 里面的东西打包成一个文件, 因为我们要传输.
- cd dist&&
- tar -zcvf dist.tar.gz *
完整示例(不推荐)
推荐本地打好包直接:
5. 点击构建后操作, 增加构建后操作步骤, 选择 send build artificial over SSH, 参数说明:
Name: 选择一个你配好的 SSH 服务器
Source files : 写你要传输的文件路径
Remove prefix : 要去掉的前缀, 不写远程服务器的目录结构将和 Source files 写的一致
Remote directory : 写你要部署在远程服务器的那个目录地址下, 不写就是 SSH Servers 配置里默认远程目录
Exec command: 传输完了要执行的命令, 我这里执行了解压缩和解压缩完成后删除压缩包 2 个命令
接着安装好 nginx 参考 Nginx 安装配置
nginx 配置改动下:
注意 nginx 配置改了后得重启
- /usr/local/webserver/nginx/sbin/nginx -s reload # 重新载入配置文件
- /usr/local/webserver/nginx/sbin/nginx -s reopen # 重启 Nginx
- /usr/local/webserver/nginx/sbin/nginx -s stop # 停止 Nginx
保存
现在当我们在本地将 Welcome to Your vue.js App 修改为 Jenkins 本地打包后发出一个 Git push, 过一会就会发现我们的服务器上已经部署好了最新的代码, 是不是很 6.
至此, 我们的自动化部署也完成了, 但是如果过程中有异常怎么办, 或是我们想知道每次 Jenkins 运行的日志及运行结果, 我们可以通过配置邮件服务来让 Jenkins 每次完成任务后通知相关人员
实现邮件提醒
这里我们不用 E-mail Notification, 因为它的邮件服务功能太少, 无法自定义邮件内容及自定义触发钩子, 而且只能在异常情况下才能发邮件. 我们使用 Editable Email Notification 这个.
打开系统管理 - 系统配置 - Extended E-mail Notification, 不是系统管理 - 系统配置 - 邮件通知, 千万不要配错了, 否则不起作用. 配置一下用来发邮件的邮箱, 我这里用的是我自己的 qq 邮箱.
要是用别的厂家的邮箱服务就查下别的邮箱厂家 smtp 怎么配, 用 qq 邮箱的除了 user Name 和 password 其他的和我写一样就行. 另外 password 写的不是 qq 邮箱的密码, 而是开启 smtp 服务后发短信获取的密码.
打开创建的那个任务, 增加构建后操作步骤选择 Editable Email Notification,Project Recipient List 那里写你要发给谁邮件, 可以多个, 用分号隔开.
然后点击 Advanced Settings-Triggers-Add Trigger, 选择 always, 意思是无论什么情况任务执行完就发邮件, 也可以选择其他模式, 如任务执行异常了才发邮件.
我这里配置的接收邮件的地址也是我的 qq 邮箱, 这个可以根据自己公司的工作流程配.
4. 现在当我们在本地修改代码后发出一个 Git push,Jenkins 自动构建部署完成后就会给我发一封邮件, 邮件附件里会有本次任务的日志.
来源: https://www.cnblogs.com/liuming666/p/11529209.html