Jenkins
1.基础知识
docker run jenkinsci/blueocean
,那么Jenkins的工作目录是 /var/jenkins_home/workspace
/var/lib/jenkins/workspace
1.1 学习文档
官网doc
博客blog.mafeifan.com/
2. 安装Jenkins
这节内容来自于Jenkins官方文档
建议使用的Docker映像是jenkinsci/blueocean
image(来自 the Docker Hub repository)。 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 (可以投入使用) ,捆绑了所有Blue Ocean插件和功能。这意味着你不需要单独安装Blue Ocean插件。
注意 Blue Ocea可以理解成Jenkins UI页面的皮肤插件
2.1 通过docker安装Jenkins
Jenkins直接安装在Linux上,需要提前安装java的jdk,因为Jenkins依赖它。而利用docker安装Jenkins,可以直接使用官方dodcker镜像,不需要安装依赖,简单方便
2.1.1 通过docker run image
直接安装Jenkins
docker run
-u root # 必须给予Jenkins足够权限,否则部署在远程服务器上会报错'无法连接Jenkins'
--rm #(可选)容器关闭时自动删除自己,即 `docker stop 容器id` ,这个docker 容器会被删除
-d # 在后台运行容器
-p 8080:8080 # 映射`jenkinsci/blueocean` 容器端口8080到主机上的端口8080
-p 50000:50000 #1
-v jenkins-data:/var/jenkins_home #2
-v /var/run/docker.sock:/var/run/docker.sock #3
--name jenkins-service # 给容器起别名
--restart always # 容器总是自动重启,避免Jenkins重启后容器停止而不启动
jenkinsci/blueocean
# 无注释版本,请粘贴这个(没有加--rm)
docker run
-u root
-d
-p 8080:8080
-p 50000:50000
-v jenkins-data:/var/jenkins_home
-v /var/run/docker.sock:/var/run/docker.sock
--name jenkins-service
--restart always
jenkinsci/blueocean
其他参数含义请点击这里
参数 | 功能 |
---|---|
#1 -p | (可选)将 jenkinsci/blueocean 容器的端口50000 映射到主机上的端口50000。详细的看官方文档 |
#2 -v | (可选,但强烈建议)映射在容器中的/var/jenkins_home 目录到具有名字 jenkins-data 的volume。 如果这个卷不存在,那么这个 docker run 命令会自动为你创建卷。 如果您希望每次重新启动Jenkins(通过此 docker run ... 命令)时保持Jenkins状态,则此选项是必需的 。 如果你没有指定这个选项,那么在每次重新启动后,Jenkins将有效地重置为新的实例。 注意: 所述的 jenkins-data 卷也可以 docker volume create 命令创建: docker volume create jenkins-data 代替映射 /var/jenkins_home 目录转换为Docker卷,还 可以将此目录映射到计算机本地文件系统上的目录。 例如,指定该选项 -v $HOME/jenkins:/var/jenkins_home 会将容器的 /var/jenkins_home 目录映射 到 本地计算机上目录中的 jenkins 子目录, 该$HOME目录通常是 /Users//jenkins 或/home//jenkins 。 |
#3 -v | (可选 /var/run/docker.sock 表示Docker守护程序通过其监听的基于Unix的套接字。 该映射允许 jenkinsci/blueocean 容器与Docker守护进程通信, 如果 jenkinsci/blueocean 容器需要实例化其他Docker容器,则该守护进程是必需的。 如果运行声明式管道,其语法包含agent 部分用 docker - 例如, agent { docker { ... } } 此选项是必需的。 在Pipeline Syntax 页面上阅读更多关于这个的信息 |
注意 此镜像里已经有git,所以不用自己额外再装git
2.1.2 通过 docker-compose
安装Jenkins
2.1.3 直接安装Jenkins
如果作为直接部署网站的服务器且通过docker进行部署,只能使用此方式。否则会影响网站使用docker 部署,比如docker rmi -f $(docker images -qa),docker system prune --volumes -f(它会使所有Jenkin保存的东西被清除,比如密钥)
提示 vscode可以安装docker插件,它有代码提示及语法高亮等功能
2.2 配置Jenkins
浏览器输入
ip + 端口
,进入Jenkins
通过ip addr可查看Linux的ip地址,如果没有看见,说明网卡没有启动,具体自行百度
2.2.1 输入初始密码
- 通过查看日志
docker logs -n=25 容器id
直接看到密码
- 或者进入容器命令行
docker exec -it 容器名 bash
,输入cat /var/jenkins_home/secrets/initialAdminPassword
2.2.2 点击 选择插件来安装
2.2.3 选择无,因为服务器在国外,安装插件太慢。所以后面通过更改镜像的方式重新安装
2.2.4 配置Jenkins插件中心为国内镜像
# 1. 修改 plugin manager 中update site 的url为清华镜像源https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
# 2. 修改服务器配置
docker exec -it 容器id /bin/bash
cd /var/jenkins_home/updates
sed -i 's#https://updates.jenkins.io/download#https://mirrors.tuna.tsinghua.edu.cn/jenkins#g' default.json
sed -i 's#http://www.google.com#https://www.baidu.com#g' default.json
# 3. 重启Jenkins服务
docker restart docker容器
如果不是通过docker安装Jenkins而是直接安装,那么需要
cd /var/lib/jenkins/updates
,最后通过systemctl restart jenkins
重启Jenkins
2.2.5 安装插件
进入plugin manager
安装如下插件
-
Localization: Chinese (Simplified)(JenkinsUI页面的汉化包)
-
DingTalk(流水线工作的时候钉钉消息通知,具体配置请百度)
-
Git Parameter Plug-In
-
安装 Publish Over SSH 作用: 将构建后的编译产出发布到服务器且允许Jenkins所在机器通过SSH服务登录到远程机执行脚本
-
安装Generic Webhook Trigger Plugin作用:通用 Webhook 触发器构建
-
NodeJs 用于构建前端代码(npm build)
-
Pipeline: Stage View在非blue ocean界面,可以清晰的看见构建过程
注意 安装完插件后需要重启Jenkins
2.3 普通方式安装Jenkins
3. Jenkins构建自由风格任务
3.1参数化构建
拉取git仓库代码(这里拉取码云)
credentials是可以选择输入账号密码,也可以选择输入ssh密钥(自行百度)
3.1.1 选择参数化构建,即使用tag,方便代码回滚
3.2 常用构建触发器
(SCM,全称Software Configuration Management,中文翻译为软件配置管理,git是scm工具,就是实现scm的一种方法)
Jenkins会定时扫描整个项目源码,系统开销较大,不推荐使用
githook
算是对前者的改进,最为推荐
其他工程构建后触发
顾名思义,就是前一个项目构建完成后开始构建任务
4. Jenkins 构建流水线任务
流水线脚本(Jenkinsfile)
一般放在ui界面、项目源码里面或是单独放在一个git仓库里(推荐选择后面两种,方便版本控制,因为Jenkinsfile也会有多个版本,而且也可以防止Jenkins崩溃等极端状况发生)
参考文档1
# Jenkins教程(三)添加凭据与流水线拉取Git代码
4.1 踩坑记录
惨痛教训
一定给任务设置超时监测
给任务设置超时监测,会避免流水线出bug卡死服务器
timeout(time: 3, unit: 'MINUTES') {
sh './health-check.sh'
}
清理工作区
www.thinbug.com/q/37468455
使用yarn构建前端项目
npm装包有时会出现依赖拉不下来,从而导致由于网络问题导致的构建失败,而yarn会在第一次构建的时候就生成缓存,后面构建的时候,会先看缓存区有没有package.json里用到的依赖包,如果有的话就不会下载,没有才会下载,提高了效率。
node -v
npm install -g yarn -registry=https://registry.npm.taobao.org
yarn -v
yarn install --pure-lockfile
#--pure-lockfile 这个参数是在服务器install不生成yarn.lock,防止服务器和本地代码冲突
yarn run build
5. Jenkins环境变量
参考文章
www.artacode.com/post/ci-cd/…
5.1 自定义环境变量和内置环境变量
5.2 pipeline中的使用(声明式语法)
使用变量一定要使用双引号,带变量的字符串只能用双引号,不能用单引号
pipeline {
agent any
environment {
git_url = 'https://gitee.com/xxxxxx'
git_auth = 'e767d8bb-daf5-4d85-91c9-e34545215c44'
}
stages {
stage('拉取代码') {
steps {
echo "${git_url}"
echo "${git_auth}"
}
}
}
}
6. Jenkins常用插件的使用
6.1 publish over ssh 的使用
注意 不能使用
docker -it 容器名 command
, 只能使用docker -i 容器名 command
,因为是通过publish over ssh插件执行的命令,而不是在终端上。否则会报错ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]
,并且不会有其他详细错误提示。
# 执行sh脚本文件,在终端中输入完全没问题,但使用publish over ssh 执行就会退出,导致构建失败
docker compose up -d
docker exec -i web bash start.sh
6.2 用户权限管理
需要安装 插件Role-based Authorization Strategy
6.3 Jenkins机器人配置
主要是配置好Jenkins机器人的id,因为在Jenkinsfile中填的是id
6.4 清理工作区插件(Workspace Cleanup)
用法是cleanWs()