课程安排

时间 标题 内容




下午





Jenkins基本使用

1. Jenkins简介与Jenkins的应用场景
2. Jenkins安装部署Server +Agent
3. Jenkins系统基本配置(数据目录、插件源)
4. Jenkins系统用户管理
5. Jenkins项目参数配置

1. Jenkins系统权限配置管理
2. Jenkins凭据管理与应用
3. Jenkins常用的项目管理
4. BlueOCean UI基本使用
**

0. 传统应用发布模式

一般一个开发团队中都会存在多个角色:开发、测试、运维。当时我们的应用发布模式可以能是这样的:

  • 开发同学进行项目代码开发,本地运行测试成功后将代码上传到版本控制系统
  • 开发同学通知运维同学项目可以发布了,然后运维同学下载代码进行打包和构建,生成应用制品
  • 运维同学使用部署脚本将生成的制品部署到测试环境,并提示测试同学可以进行产品的测试。
  • 测试同学开始进行手动、自动化测试,测试完成后提醒运维同学可以进行预生产环境部署
  • 运维同学开始进行预生产环境部署,然后测试同学进行测试,测试完成后,开始部署生产环境

手动操作很多、出现的问题很多。上面看似很流畅的过程,其实每次构建或发布都可能会出现问题。未对每次提交验证、构建环境不一致:开发人员本地测试成功后提交代码,运维同学下载代码进行编译却出现了错误。

1.Jenkins简介与应用场景

对于持续集成工具现在也有很多,目前应用最多的是Jenkins。Jenkins前身是Hudson,使用java语言开发的自动化发布工具。Jenkins是跨平台的可以在Win、Linux、MacOS部署。Jenkins是应用最广的开源免费的持续集成服务器,企业中普遍使用Jenkins来作为项目集成发布工具。Jenkins官方提供的插件使Jenkins更为强大。目前发展超过15年,比较成熟的CI工具(也可以CD)能够实现自动化集成发布。目前普遍使用Jenkins完成持续集成CI/持续部署CD等相关技术实践。 可以把Jenkins想象成一个脚本执行器,我们可以通过编写代码的方式灵活的控制Jenkins作业的运行与控制。

1.1 应用场景

  • 持续集成实践
    • 集成svn/git客户端实现源代码下载检出
    • 集成maven/ant/gradle/npm等构建工具实现源码编译打包单元测试
    • 集成sonarqube对源代码进行质量检查(坏味道、复杂度、新增bug等)
  • 持续部署实践
    • 集成SaltStack/Ansible实现自动化部署发布
  • 自动化测试实践
    • 集成Jmeter/Soar/Kubernetes/…..

1.2 功能特点

  • 开源免费
  • 多平台支持(windows/linux/macos)
  • 主从分布式架构
  • 提供web可视化配置管理页面
  • 安装配置简单
  • 插件资源丰富

官网: http://jenkins.io
image.png

image.png


2.Jenkins安装部署

关于Jenkins的安装可以使用rpm或者war包安装,需要提前安装好JDK8+环境。 Jenkins采用分布式架构,分为server节点和agent节点。server节点也是可以运行构建任务的,但我们一般使其主要来做任务的调度。(毕竟server节点挂了就都…)agent节点专门用于任务的执行。随着现在容器的盛行,我们可以将server节点和agent节点在容器或者基于Kubernetes中部署。关于agent节点借助容器可以实现动态的资源分配等等好处。agent节点可以分为静态节点和动态节点。静态节点是固定的一台vm虚机或者容器。动态节点是随着任务的构建来自动创建agent节点。

2.1 安装JDK环境

如果使用rpm的方式安装的Jenkins需要提前安装好JDK,Jenkins Slave运行也需要使用JDK。

jdk 下载链接:https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u282b08.tar.gz

  1. tar zxf OpenJDK8U-jdk_x64_linux_hotspot_8u282b08.tar.gz -C /usr/local
  2. cd /usr/loca/jdk8u282-b08
  3. pwd
  4. vim /etc/profile
  5. export JAVA_HOME=/usr/local/jdk8u282-b08
  6. export PATH=$JAVA_HOME/bin:$PATH
  7. source /etc/profile
  8. java -version
  9. openjdk version "1.8.0_282"
  10. OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_282-b08)
  11. OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.282-b08, mixed mode)

2.2 安装Jenkins Master

redhat/centos: https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/

2.2.1 rpm 安装

  1. wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.277.1-1.1.noarch.rpm
  2. rpm -ivh jenkins-2.277.1-1.1.noarch.rpm
  3. /etc/sysconfig/jenkins
  4. ## service start
  5. [root@zeyang-nuc-service jenkins]# netstat -anlpt | grep 8080
  6. tcp6 0 0 :::8080 :::* LISTEN 16016/java
  7. [root@zeyang-nuc-service jenkins]# service jenkins status
  8. systemctl stop firewalld
  9. ## 访问
  10. http://192.168.1.200:8080/

image.png

  • 跳过默认的插件安装,仅选择中文社区插件。

image.png

  • 创建admin用户

image.png

  • 配置站点url

image.png


2.2.2 docker安装

  1. docker pull jenkins/jenkins:2.277.1-lts-centos7
  2. mkdir -p /data/cicd/jenkins
  3. chmod +x /data/cicd/jenkins
  4. docker run -itd --name jenkins \
  5. -p 8080:8080 \
  6. -p 50000:50000 \
  7. --privileged=true \
  8. -v /data/cicd/jenkins:/var/jenkins_home docker.io/jenkins/jenkins:2.277.1-lts-centos7
  9. ##FAQ
  10. [root@zeyang-nuc-service ~]# docker logs -f jenkins
  11. touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
  12. Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
  13. chmod 777 -R jenkins/
  • 默认端口8080
  • 配置JENKINS_HOME /var/lib/jenkins
  • 配置启动用户Jenkins
  • 配置插件更新源(Jenkins 中文社区源)

2.2.3 配置插件源

进入Jenkins首页,然后最下面(点击 Jenkins中文社区)
image.png
然后跳转到这个页面,按照图中的操作。 (2,3,4)
image.png
粘贴上个步骤2的复制内容。(https://updates.jenkins-zh.cn/update-center.json
点击立即获取。
image.png

2.3 安装Jenkins Slave

系统设置 > 节点管理 > 新建节点
image.png

  • 填写节点信息

image.png

  • 下载agent.jar

image.png

  1. ## 创建agent目录
  2. mkdir -p /data/cicd/jenkinsagent
  3. cd /data/cicd/jenkinsagent
  4. wget http://192.168.1.200:8080/jnlpJars/agent.jar
  5. ## 编写启动脚本
  6. #!/bin/bash
  7. echo e199ecad9b95bc93277d74469256a7b4b3aa7c9d2c67916e93cdd0f93c9f9a5e > secret-file
  8. nohup java -jar agent.jar -jnlpUrl http://192.168.1.200:8080/computer/build-01/jenkins-agent.jnlp -secret @secret-file -workDir "/data/cicd/jenkinsagent" >/dev/null &
  9. ## 启动agent
  10. sh -x start.sh
  11. ps aux | grep agent
  • 效果

image.png

自定义agent的通信端口,Configure Global Security
image.png

3. Jenkins的数据目录

Jenkins采用文件存储, 其配置相关信息都保存到了XML文件中。

  1. [root@zeyang-nuc-service jenkins]# ls -d */
  2. caches/ jobs/ nodes/ secrets/ userContent/ war/ workspace/
  3. fingerprints/ logs/ plugins/ updates/ users/
  • caches: 系统缓存数据
  • jobs: Jenkins项目作业
  • nodes: Jenkins slave节点信息
  • secrets: 秘钥信息
  • userContent: 类似于web站点目录,可以上传一些文件
  • workspace: 默认的工作目录
  • fingerprints: 指纹验证信息
  • logs : 日志信息
  • plugins: 插件相关配置
  • updates: 插件更新目录
  • users: jenkins系统用户目录

4. Jenkins用户管理

Jenkins默认使用的是自**带的数据库管理用户,支持同步LDAP、Github等认证集成。
image.png
_
系统设置 > 管理用户**_

image.png

5. 项目类型与参数

image.png

参数化构建:

  • 字符参数

image.png

  • 选项参数

image.png

丢弃历史构建
image.png
并行构建**
image.png

  1. microservicecicd@2
  2. 1.一个job 对应一个 microservicecicd
  3. 2.microservicecicd@2
  4. 3.microservicecicd@3
  5. ## 解决方法: 随机生成一个不同的workspace。


构建触发器
image.png**

  1. ## 未选择参数化构建
  2. curl -u admin:admin http://192.168.1.200:8080/job/test1/build?token=devops
  3. ## 选择了参数化构建就不能使用上面的请求操作了。
  4. curl -u admin:admin "http://192.168.1.200:8080/job/microservicecicd/buildWithParameters?token=devops&Version=1.1.54&EnvName=dev"

上下游构建依赖
image.png
定时构建
image.png
轮询版本控制系统
image.png
构建步骤
image.png
构建后配置
当前运行的shell创建的目录,是在当前job所运行的节点的workspace下面。
image.png

  • 效果

image.png

视图配置:

image.png

  1. ## 通过demo-uat视图访问URL
  2. http://192.168.1.200:8080/view/demo-uat/job/demo02-service_UAT/
  3. ## 通过all视图访问URL
  4. http://192.168.1.200:8080/job/demo02-service_UAT/
  • 效果

image.png


6. Jenkins系统权限管理

注意安装插件: 权限默认使用 Role-Based Strategy。

image.png

image.png
image.png

6.1 管理权限

  • 系统设置->Manage and Assign Roles->Manage Roles
  • Global roles:添加用户和用户组,分配某个用户属于哪个用户组。
  • Item roles:添加某个工程或某一组工程的用户或用户组
  • Node roles:添加某个节点或某一组节点的用户或用户组

image.png

6.2 全局权限

image.png

6.3 项目权限

image.png

6.4 项目授权

image.png

6.5 实践

权限配置
image.png

权限授权
image.png

效果

  • PM角色: 能够操作和管理所属的业务和项目

image.png

  • DEV角色:只允许对所属的项目进行构建和取消查看操作

image.png

FAQ:
如果未赋予用户Global Role ”read“ 会报错。
image.png

先备份

7. Jenkins系统凭据管理

Jenkins的凭据有很多种类型,可以将一些敏感信息存储为凭据,然后在项目中引用。 凭据-> 系统-> 全局凭据。

安装插件 Credentials
**
image.png
image.png
image.png

  • Username with password类型存储Harbor或者其他系统的用户名和密码。
  • GitLab API token类型存储Gitlab的用户API token。
  • Secret text类型可以用来存储OpenShift等系统中的token。
  • Certificate类型可以用户存储证书,例如k8s的用户证书。

8. BlueOCean UI基本使用

Blue Ocean减少了混乱而且进一步明确了团队中每个成员 Blue Ocean 的主要特性包括:

  • 持续交付(CD)Pipeline的 复杂可视化 ,可以让您快速直观地理解管道状态。
  • Pipeline 编辑器 - 引导用户通过直观的、可视化的过程来创建Pipeline,从而使Pipeline的创建变得平易近人。
  • 个性化 以适应团队中每个成员不同角色的需求。
  • 在需要干预和/或出现问题时 精确定位 。Blue Ocean 展示 Pipeline中需要关注的地方, 简化异常处理,提高生产力
  • 本地集成分支和合并请求, 在与GitHub 和 Bitbucket中的其他人协作编码时实现最大程度的开发人员生产力。

官方文档:https://jenkins.io/zh/doc/book/blueocean/getting-started/

进入Jenkins插件管理然后安装blueocean插件。

image.png

image.png

9. Jenkins学习的一些建议

只要熟练的掌握Jenkinsfile的编写,Jenkins什么事情都是可以做。限制Jenkins功能的不是Jenkins本身。你可以将Jenkins想象成一个可以配置的web前端页面,而后面的Jenkinsfile就是我们要写的后端代码。

谈谈我们学习Jenkins之前要具备哪些基础知识呢?
基础要求

  • 熟练Linux系统运维(常用的命令等等)
  • 熟悉Shell脚本编程(Jenkins pipeline会调用很多shell语句)

扩展知识

  • 掌握一门编程语言例如Python(Jenkins会用到groovy语法)
  • 掌握docker、kubernetes基础知识

是不是看上去很多呢?可以让你的流水线更加强大与灵活。其实这些都是我们前往技术型DevOps工程师所必备的知识点了。如果你是开发人员你需要补充运维相关的知识,如果你是运维人员需要补开发知识。Jenkins是开发、运维同学到DevOps的转折点。
**