2021-07-31 系统化装修 2021-06-13 初稿
0 基础概念
信息卡片
新技术QA | |
---|---|
技术名称 | Jenkins |
文档官网 | https://www.jenkins.io/zh/ |
作者、技术团队 | |
能做解决什么问题 | 自动执行脚本,CI/CD |
特点、优点 | 开源免费、自托管、生态优秀 |
同类选型 | gitlab CI / teamcity 等 |
缺点、踩坑注意 | 尽量使用配置文件,纳入版本管理 |
宣传语 | Jenkins构建伟大,无所不能 |
选型关键词 | CI/CD |
官方网站标语:
Jenkins构建伟大,无所不能 Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。
Jenkins 一直是公司的持续集成工具,同类选型工具有 gitlabCI / TeamCity ,但Jenkins凭借着可以自托管的优点,一直收到青睐。关于如何选型,可以看我的一篇文章:前端可以弄懂的CI/CD
Jenkins从使用程度来说,是其中的佼佼者,前端熟悉Jenkins还是值得的。
[
](https://www.yuque.com/xinbao37/roadmap/docker-basic.md)
1 安装、配置、使用
1.1 安装
本文尝试通过本地的docker运行一个Jenkins,需要你有docker知识,如果你不熟悉docker,可以看我的docker文章 前端可以弄懂的Docker基础。
docker下载官方最新lts镜像,这里锁版本:
docker pull jenkins/jenkins:2.298-alpine
如果想自己查找版本,点击这里 https://hub.docker.com/r/jenkins/jenkins/tags?page=1&ordering=last_updated(从经验来看 vscode+docker 合起来用最省心,体验太好了。)
上图是Docker面板,这里我指定了Jenkins的web端口是 8222
。
数据映射这里 jenkins-data:/var/jenkins_home
。备忘 admin-123456a
剩下的就是等待重启访问即可。简单初始化操作见官方操作文档:
- docker run 安装完成,根据控制台密码,进入web页面
- 安装插件,当然是全选!完事记得安装
Blue Ocean
,下面讲到
注意,我们需要在docker里运行jenkins,同时jenkins有需要使用docker环境,套娃。两种方案:dind
一个容器里跑,不够优雅,dood
共享宿主docker资源,推荐 dood
。
思路是
- 启动jenkins容器时候传递
docker.sock
- 容器内部继续安装docker
细节看这里 https://gitee.com/help/articles/4332
docker run -d --restart always -p 8085:8080 -v /var/run/docker.sock:/var/run/docker.sock --name jenkins --hostname jenkins --volume jenkins-data:/var/jenkins_home jenkins/jenkins:2.298-alpine
1.2 配置
更新:这里我删掉了大量描述内容,也就是下图创建自由风格的选项。理由是过时了,我们专注流水线语法。
1.3 使用
2 配置文件
2.1 概念
除了第一次所必要的设置,后续就是持续优化 Pipe 流水线,也就是操作的step。使用纯文本而不是填写表单,好处不言而喻,纯文本能够集成进git中,纳入操作审计。
略过 blue ocean 创建,补充git仓库。提示没有流水线配置文件,点击创建。
2.1 配置文件怎么写
官方文档 https://www.jenkins.io/zh/doc/book/pipeline/syntax/#agent
下面是一个简单的示例,用于观察语法结构:
pipeline {
agent {
docker {
# registryUrl 'https://coding-public-docker.pkg.coding.net' # 这个牛逼了
image 'node:14-alpine'
args '-p 3000:3000'
}
}
environment {
ENV = 'production'
}
stages {
stage('Build') {
steps {
sh 'npm install'
}
}
stage('Test') {
steps {
sh './jenkins/scripts/test.sh'
}
}
stage('Deliver') {
steps {
sh './jenkins/scripts/deliver.sh'
input message: 'Finished using the web site? (Click "Proceed" to continue)'
sh './jenkins/scripts/kill.sh'
}
}
}
}
总的来说,是下面的结构:
pipeline {
agent {}
environment {}
stages {
stage('A') {
steps {
// sh 'npm install'
}
}
}
}
2.1.1 agent
操作的主机。一般来说,主机会自带一些常用的SDK,比如coding就明确指出,默认的机器会自带前端关心的node和yarn,可能版本会滞后。https://help.coding.net/docs/ci/ways.html
如果选择自己制定环境,也可以指定 dockerfile
路径。
any # 使用默认环境
# 走官方的image
docker{image:"node:14-alpine"} 使用 docker 环境
node:14 走node环境
# 通过docker设定镜像
docker {
reuseNode false
registryUrl 'https://coding-public-docker.pkg.coding.net'
image 'public/docker/nodejs:14'
}
# 可以选定 dockerfile
dockerfile {
filename 'Dockerfile'
reuseNode true # 使用根节点的工作空间
}
2.1.2 environment
环境变量
2.1.3 stages
操作步骤,由多个 stage
组成。
stage里也可以包含 agent
最常见的内容是
stage('name') {
steps {
sh 'node -v'
}
}
#retry(3){} 重试三次
#timeout(time:3,unit:"MINUTES"){} 超时设置
缓存
- npm
/root/.npm/
- yarn
/usr/local/share/.cache/yarn/
两种方式
args '-v /root/.gradle/:/root/.gradle/ -v /root/.m2/:/root/.m2/'
- 使用docker语法
docker.image('node:14').inside('-v /root/.npm/:/root/.npm/') {
sh 'npm install'
}
yi
什么是 blue ocean
https://www.jenkins.io/zh/doc/book/blueocean/getting-started/
一段代码如何拿到git log
sh """logs=`git log --pretty=format:'%s' ${env.MR_TARGET_BRANCH}... --no-merges`;
echo "\$logs" | while read i; do echo \$i | npx commitlint; done
"""
- post 传递信息
- always{}
- 比如运行测试用例
- success{}
- failure{}
- always{}
检出代码
checkout([
$class: 'GitSCM',
branches: [[name: GIT_BUILD_REF]],
userRemoteConfigs: [[
url: GIT_REPO_URL,
credentialsId: CREDENTIALS_ID
]]
)
仔细一看还行,大写字母是环境变量
- $class
- branches 设定分支
- userRemoteConfigs 设定远程配置文件
基本信息 - 流程配置 - 触发规则 - 变量与缓存 - 通知提醒
操作步骤
-1 参考文档
https://www.jenkins.io/zh/doc/tutorials/build-a-node-js-and-react-app-with-npm/https://plugins.jenkins.io/nodejs/
jenkins有很多常用插件,这里做个搬运
目前推荐安装 blueOcean ,一个重构版 https://www.jenkins.io/zh/doc/book/installing/
docker pull jenkinsci/blueocean:1.24.7
插件:
- Organization and Administration 组织和管理
- Dashboard View 仪表盘,yes
- Folders Plugin 文件夹插件,使用目录管理项目,yes
- Configuation as Code 配置代码,no
- OWASP Markup Fomatter Plugin,yes
- Build Features 构建功能
- build name and description setter 构建名称和描述设置 no
- build timeout构建超时 yes
- config file provider 配置文件提供程序 no
- credentials binding plugin凭证绑定插件
- embeddable build status可嵌入的构建状态 yes
- rebuilder 重建者
- SSH Agent ssh代理
- throttle concurrent builds 限制并发构建
- timestamper时间戳 ,控制台删除时间戳,yes
- workspace cleanup 工作区清理。主动删除,yes
- Build Tools 构建工具
- ant ,过时内容 no
- gradle ,java相关,no
- MSBbuild,vs相关 no
- node, 前端必备 yes
- Build Analysis and Reporting 构建分析和报告
- 覆盖范围no
- html publlisher plugin no
- jUnit plugiin no
- 下一代警告no
- xUnit no
- Pipelines and Continuous Delivery 不翻译不较好
- pipeline 必须yes
- github branch source plugin yes
- pipe: github groovy库 yes
- pipe:stage view yes
- 条件构建步骤
- 多任务
- 参数化触发器
- copy artifact
- Source Code Management 源代码管理
- 只考虑 git 就行
- Distributed Builds 分布式构建
- 矩阵项目插件
- ssh代理 yes
- windows 代理 no
- User Management and Security 用户管理和安全
- 矩阵授权策略插件 yes
- pam认证 yes
- ldap, yes
- 角色授权
- 活动目录
- 授权项目
- Notifications and Publishing 通知和发布
- email yes
- emial 拓展
- 邮件插件 yes
- ssh 发布
- ssh 远程执行shell
- Languages
- locale
- chinease 必须
一般流程
code - git - jenkins -npm i -npm build - deploy - 测试
如果引入了docker
code - git - jenkins -npm i- docker build-docker push -harbor负责docker pull - docker run -测试