[TOC]
<br>
<br>
# 简介
Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
<br>
<br>
# 安装Java
首先搜索可安装的 JDK
```
$ sudo yum search java-11
```
<br>
从结果中我们可以找出两个条目
```
java-11-openjdk.x86_64 : OpenJDK Runtime Environment 11
java-11-openjdk-devel.x86_64 : OpenJDK Development Environment 11
```
<br>
他们分别是 JRE 和 JDK,根据你的需求安装即可
```
$ sudo yum install java-11-openjdk java-11-openjdk-devel -y
```
<br>
安装目录为
```
/usr/lib/jvm/java-11-openjdk-11.0.3.7-0.el7_6.x86_64
```
<br>
查看版本
```
$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)
```
<br>
<br>
# 安装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
```
<br>
如果不能安装就到官网下载Jenkins的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
```
<br>
配置Jenkins的端口,默认是8080,此端口不冲突可以不修改
```
vi /etc/sysconfig/jenkins
```
<br>
找到修改端口号:
```
JENKINS_PORT="8080"
```
<br>
启动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
<br>
<br>
# 打开Jenkins
在浏览器中访问。首次进入会要求输入初始密码如下图:
![](https://box.kancloud.cn/b08743b6fa9cf993e3871d16200f8158_982x420.png)
<br>
初始密码在:`/var/lib/jenkins/secrets/initialAdminPassword`,输入密码后点击继续
<br>
选择安装推荐的插件
![](https://box.kancloud.cn/67da5324577458f7e7024b6c3263b476_977x570.png)
<br>
![](https://box.kancloud.cn/025b9db20d64ca70dc40751d79c32a09_990x1246.png)
<br>
创建超级管理员账号,点击保存
![](https://box.kancloud.cn/e29affbdfeafe825a46a45312d2f4939_982x422.png)
<br>
配置实例,点击保存
![](https://box.kancloud.cn/b14542c7a686f315a90c8acb74715974_986x478.png)
<br>
完成
![](https://box.kancloud.cn/016661bfe72b6c2b77fa7b7cb16c71fd_986x330.png)
<br>
<br>
# 安装插件
安装包含以下内容的插件
* Publish Over SSH
* Git
* GitHub
* NodeJS
* GitLab
* SSH
<br>
![](https://box.kancloud.cn/45f1055fbe80c10bb377f43ddabdad74_1275x637.png)
<br>
![](https://box.kancloud.cn/03b28a4a2b2207bbfff140035b117135_1135x262.png)
<br>
装完插件后,直接在linux机器上重启jenkins服务,而不是勾选空闲时重启
```
systemctl restart jenkins
```
<br>
<br>
# 配置
## 系统配置
### 全局属性
![](https://box.kancloud.cn/8a228b24ad42bd8842fc7e5ea3e4a086_1424x304.png)
~~~
echo $PATH
c9/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/lampp/bin:/root/bin:/opt/lampp/bin:/root/bin:/opt/lampp/bin:/root/bin:/usr/local/git/bin:/usr/local/git/bin
~~~
<br>
### 配置SSH
![](https://box.kancloud.cn/444986c5f96aaef0ad33a5844a8538e3_1032x501.png)
<br>
点击新增
![](https://box.kancloud.cn/538557d8695345efe793a77a73f4335a_1030x394.png)
<br>
如果需要配置端口,再点击高级
![](https://box.kancloud.cn/04eaeb108afc0a6516d6c6dfe96df1c4_469x654.png)
<br>
勾选 `Use password authentication, or use a different key`,将本机到远程服务器的私钥粘贴到Key输入框
![](https://box.kancloud.cn/aa7023358ef004211d0a5ac2ce7c8c83_511x391.png)
<br>
点击 `Test Configuration`,成功会出现 Success
![](https://box.kancloud.cn/bc5f329e49ae5ffa69b70ea928d84b0c_1692x101.png)
<br>
## 全局工具配置
![](https://box.kancloud.cn/ca9c29c55bc7bbb34ad48d8fc8644c35_642x529.png)
### 配置Node
建议安装NodeJS插件后
![](https://box.kancloud.cn/2bda7b8bc8c7f4df6f9c9578172994c8_1330x639.png)
<br>
<br>
# 新建任务
![](https://box.kancloud.cn/10a46ba6fcbf68a0c1c588ff198e3984_894x701.png)
<br>
## 配置代码仓库
可以使用https或ssh
![](https://box.kancloud.cn/d46f2c0724fb8035e3bdeabc6cca822d_1434x579.png)
<br>
## 构建
拉去代码后顺序执行下面的操作
1. 点击增加构建步骤,选择执行shell
```
# 在Jenkins 服务器运行
# 安装所需的包
npm install --registry=https://registry.npm.taobao.org
# 运行测试
npm run unit
# 如果此处执行有错误,不执行后面的构建步骤
```
![](https://box.kancloud.cn/834ba2f8a246c8344eac02b7923b8e1b_1394x301.png)
<br>
2. 点击增加构建步骤,选择 `Send files or execute commands over SSH`
* Source files:填写要复制的文件
* Remote directory:填写远程服务器存放复制文件的地址,与系统设置的 SSH Servers 的 Remote Directory 合并
* Exec command:填写远程服务器要执行的命令
![](https://box.kancloud.cn/6cef8a27120604409d03249d42b5da1b_1382x750.png)
<br>
## 配置构建环境
在构建运行后通过ssh发送文件或执行命令。
<br>
勾选 `Send files or execute commands over SSH after the build runs`
![](https://box.kancloud.cn/505641938833813d843314b42af77498_1409x627.png)
<br>
<br>
# 其他注意事项
## 主目录
拉去的文件会位于`/var/lib/jenkins`
![](https://box.kancloud.cn/1bb747b1dae2517f00f5ea95687af2ae_999x130.png)
<br>
## 权限
### permission denied, access
```
npm ERR! path /var/lib/jenkins/workspace/yd-test/node_modules
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall access
npm ERR! Error: EACCES: permission denied, access '/var/lib/jenkins/workspace/yd-test/node_modules'
```
执行
```
chown jenkins:jenkins /var/lib/jenkins -R
```
### 执行npm报错
方法一:安装Nodejs插件
方法二:将jenkins默认用户改为root或其他
```
//修改用户为root或其他
vi /etc/sysconfig/jenkins
```
![](https://box.kancloud.cn/44e70fb7f3a9a5b9c2a5f077829ebf63_525x157.png)
```
//重启jenkins
systemctl restart jenkins
```
<br>
## 注意根目录
Jenkins会将项目根目录设置为工作目录
如果文件结构如下
```
├── scripts // 存放脚本目录
│ └─ deploy.sh
├── app.js
```
<br>
则要注意deploy.sh的脚本路径
```
npm install --registry=https://registry.npm.taobao.org --production
# 注意,这里不要写成../app.js
pm2 start app.js
```
<br>
## Chromeheadless
使用脚本安装
```
curl https://intoli.com/install-google-chrome.sh | bash
```
如果将jenkins用户改为root,使用 Chromeheadless 需要添加 `--no-sandbox flag
`
```
// karma.config.js
// start these browsers
// available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
browsers: ['MyHeadlessChrome'],
customLaunchers: {
MyHeadlessChrome: {
base: 'ChromeHeadless',
flags: ['--no-sandbox']
}
},
```
<br>
<br>
# 参考资料
[CentOS 7 如何安装 Java 11](https://wxnacy.com/2018/12/27/centos7-install-java11/
)
[centos下搭建Jenkins持续集成环境(安装jenkins)](https://www.cnblogs.com/loveyouyou616/p/8714544.html)
[0914-Jenkins yum安装默认jenkins用户权限问题 导致maven编译权限错误 (Permission denied)](https://blog.csdn.net/evanxuhe/article/details/82706780
)
[Chromeheadless安装与使用](https://blog.csdn.net/evanxuhe/article/details/82706780
)
- 第一部分 HTML
- meta
- meta标签
- HTML5
- 2.1 语义
- 2.2 通信
- 2.3 离线&存储
- 2.4 多媒体
- 2.5 3D,图像&效果
- 2.6 性能&集成
- 2.7 设备访问
- SEO
- Canvas
- 压缩图片
- 制作圆角矩形
- 全局属性
- 第二部分 CSS
- CSS原理
- 层叠上下文(stacking context)
- 外边距合并
- 块状格式化上下文(BFC)
- 盒模型
- important
- 样式继承
- 层叠
- 属性值处理流程
- 分辨率
- 视口
- CSS API
- grid(未完成)
- flex
- 选择器
- 3D
- Matrix
- AT规则
- line-height 和 vertical-align
- CSS技术
- 居中
- 响应式布局
- 兼容性
- 移动端适配方案
- CSS应用
- CSS Modules(未完成)
- 分层
- 面向对象CSS(未完成)
- 布局
- 三列布局
- 单列等宽,其他多列自适应均匀
- 多列等高
- 圣杯布局
- 双飞翼布局
- 瀑布流
- 1px问题
- 适配iPhoneX
- 横屏适配
- 图片模糊问题
- stylelint
- 第三部分 JavaScript
- JavaScript原理
- 内存空间
- 作用域
- 执行上下文栈
- 变量对象
- 作用域链
- this
- 类型转换
- 闭包(未完成)
- 原型、面向对象
- class和extend
- 继承
- new
- DOM
- Event Loop
- 垃圾回收机制
- 内存泄漏
- 数值存储
- 连等赋值
- 基本类型
- 堆栈溢出
- JavaScriptAPI
- document.referrer
- Promise(未完成)
- Object.create
- 遍历对象属性
- 宽度、高度
- performance
- 位运算
- tostring( ) 与 valueOf( )方法
- JavaScript技术
- 错误
- 异常处理
- 存储
- Cookie与Session
- ES6(未完成)
- Babel转码
- let和const命令
- 变量的解构赋值
- 字符串的扩展
- 正则的扩展
- 数值的扩展
- 数组的扩展
- 函数的扩展
- 对象的扩展
- Symbol
- Set 和 Map 数据结构
- proxy
- Reflect
- module
- AJAX
- ES5
- 严格模式
- JSON
- 数组方法
- 对象方法
- 函数方法
- 服务端推送(未完成)
- JavaScript应用
- 复杂判断
- 3D 全景图
- 重载
- 上传(未完成)
- 上传方式
- 文件格式
- 渲染大量数据
- 图片裁剪
- 斐波那契数列
- 编码
- 数组去重
- 浅拷贝、深拷贝
- instanceof
- 模拟 new
- 防抖
- 节流
- 数组扁平化
- sleep函数
- 模拟bind
- 柯里化
- 零碎知识点
- 第四部分 进阶
- 计算机原理
- 数据结构(未完成)
- 算法(未完成)
- 排序算法
- 冒泡排序
- 选择排序
- 插入排序
- 快速排序
- 搜索算法
- 动态规划
- 二叉树
- 浏览器
- 浏览器结构
- 浏览器工作原理
- HTML解析
- CSS解析
- 渲染树构建
- 布局(Layout)
- 渲染
- 浏览器输入 URL 后发生了什么
- 跨域
- 缓存机制
- reflow(回流)和repaint(重绘)
- 渲染层合并
- 编译(未完成)
- Babel
- 设计模式(未完成)
- 函数式编程(未完成)
- 正则表达式(未完成)
- 性能
- 性能分析
- 性能指标
- 首屏加载
- 优化
- 浏览器层面
- HTTP层面
- 代码层面
- 构建层面
- 移动端首屏优化
- 服务器层面
- bigpipe
- 构建工具
- Gulp
- webpack
- Webpack概念
- Webpack工具
- Webpack优化
- Webpack原理
- 实现loader
- 实现plugin
- tapable
- Webpack打包后代码
- rollup.js
- parcel
- 模块化
- ESM
- 安全
- XSS
- CSRF
- 点击劫持
- 中间人攻击
- 密码存储
- 测试(未完成)
- 单元测试
- E2E测试
- 框架测试
- 样式回归测试
- 异步测试
- 自动化测试
- PWA
- PWA官网
- web app manifest
- service worker
- app install banners
- 调试PWA
- PWA教程
- 框架
- MVVM原理
- Vue
- Vue 饿了么整理
- 样式
- 技巧
- Vue音乐播放器
- Vue源码
- Virtual Dom
- computed原理
- 数组绑定原理
- 双向绑定
- nextTick
- keep-alive
- 导航守卫
- 组件通信
- React
- Diff 算法
- Fiber 原理
- batchUpdate
- React 生命周期
- Redux
- 动画(未完成)
- 异常监控、收集(未完成)
- 数据采集
- Sentry
- 贝塞尔曲线
- 视频
- 服务端渲染
- 服务端渲染的利与弊
- Vue SSR
- React SSR
- 客户端
- 离线包
- 第五部分 网络
- 五层协议
- TCP
- UDP
- HTTP
- 方法
- 首部
- 状态码
- 持久连接
- TLS
- content-type
- Redirect
- CSP
- 请求流程
- HTTP/2 及 HTTP/3
- CDN
- DNS
- HTTPDNS
- 第六部分 服务端
- Linux
- Linux命令
- 权限
- XAMPP
- Node.js
- 安装
- Node模块化
- 设置环境变量
- Node的event loop
- 进程
- 全局对象
- 异步IO与事件驱动
- 文件系统
- Node错误处理
- koa
- koa-compose
- koa-router
- Nginx
- Nginx配置文件
- 代理服务
- 负载均衡
- 获取用户IP
- 解决跨域
- 适配PC与移动环境
- 简单的访问限制
- 页面内容修改
- 图片处理
- 合并请求
- PM2
- MongoDB
- MySQL
- 常用MySql命令
- 自动化(未完成)
- docker
- 创建CLI
- 持续集成
- 持续交付
- 持续部署
- Jenkins
- 部署与发布
- 远程登录服务器
- 增强服务器安全等级
- 搭建 Nodejs 生产环境
- 配置 Nginx 实现反向代理
- 管理域名解析
- 配置 PM2 一键部署
- 发布上线
- 部署HTTPS
- Node 应用
- 爬虫(未完成)
- 例子
- 反爬虫
- 中间件
- body-parser
- connect-redis
- cookie-parser
- cors
- csurf
- express-session
- helmet
- ioredis
- log4js(未完成)
- uuid
- errorhandler
- nodeclub源码
- app.js
- config.js
- 消息队列
- RPC
- 性能优化
- 第七部分 总结
- Web服务器
- 目录结构
- 依赖
- 功能
- 代码片段
- 整理
- 知识清单、博客
- 项目、组件、库
- Node代码
- 面试必考
- 91算法
- 第八部分 工作代码总结
- 样式代码
- 框架代码
- 组件代码
- 功能代码
- 通用代码