目录

Jenkins CICD 实践

jenkins简介

Jenkins是一个自包含的开源自动化服务器,可用于自动化与构建,测试以及交付或部署软件有关的各种任务。 Jenkins可以通过本机系统软件包Docker安装,甚至可以由安装了Java Runtime Environment(JRE)的任何计算机独立运行。

可实现的功能

① 持续、自动地构建/测试软件项目。

② 监控软件开放流程,快速问题定位及处理,提高开发效率。

工作原理

https://tc.ctq6.cn/tc/20220917103627.png

  1. 开发者检入代码到源代码仓库。
  2. CI系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区。
  3. CI系统会在对应的工作区内执行构建过程。
  4. (配置如果存在)构建完成后,CI系统会在一个新的构件中执行定义的一套测试。完成后触发通知(Email,RSS等等)给相关的当事人。
  5. (配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器)或存储为软件仓库中的一个新版本。软件仓库可以是CI系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像Java.net、 SourceForge之类的网站。
  6. CI系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件

优势

易于安装-只要把jenkins.war部署到servlet容器,不需要数据库支持。

  • 易于配置-所有配置都是通过其提供的web界面实现。
  • 集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知。
  • 生成JUnit/TestNG测试报告。
  • 分布式构建支持Jenkins能够让多台计算机一起构建/测试。
  • 文件识别:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
  • 插件支持:支持扩展插件,你可以开发适合自己团队使用的工具

jenkins安装

物理机安装

1、安装java环境

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
wget https://download.oracle.com/otn/java/jdk/8u261-b12/a4634525489241b9a9e1aa73d9e118e6/jdk-8u261-linux-x64.tar.gz?AuthParam=1597552691_67429c142927b21fadba4cd7de9df6e5
mv jdk-8u261-linux-x64.tar.gz?AuthParam=1597552691_67429c142927b21fadba4cd7de9df6e5 jdk-8u261-linux-x64.tar.gz
tar zxvf jdk-8u261-linux-x64.tar.gz -C /usr/local
tee > /etc/profile.d/jdk.sh <<- 'EOF'
export JAVA_HOME=/usr/local/jdk1.8.0_261
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
EOF
source /etc/profile

2、安装jenkins

  • 安装
1
2
3
4
5
6
7
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum clean all
yum makecache
yum install jenkins -y
### 无法拉取官方源
yum install -y https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.235.4-1.1.noarch.rpm
  • 修改配置
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
sed -i 's/^JENKINS_USER/#JENKINS_USER/' /etc/sysconfig/jenkins
sed -i 's/^JENKINS_HOME/#JENKINS_HOME/' /etc/sysconfig/jenkins
sed -i 's/^JENKINS_PORT/#JENKINS_PORT/' /etc/sysconfig/jenkins
tee >> /etc/sysconfig/jenkins <<- 'EOF'
# jenkins configurage
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true -Dorg.jenkinsci.plugins.gitclient.Git.timeOut=60"
JENKINS_USER="root"
JENKINS_HOME="/data/jenkins"
JENKINS_PORT="8080"
EOF
sed -i '/candidates/a\/usr/local/jdk1.8.0_221/bin/java' /etc/init.d/jenkins
systemctl enable jenkins
mkdir -pv /data/jenkins
systemctl start jenkins
  • 修改默认镜像源
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
cp /data/jenkins/hudson.model.UpdateCenter.xml /data/jenkins/hudson.model.UpdateCenter.xml.bak
tee > /data/jenkins/hudson.model.UpdateCenter.xml <<- 'EOF'
<?xml version='1.1' encoding='UTF-8'?>
<sites>
  <site>
    <id>default</id>
    <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json</url>
  </site>
</sites>
EOF
  • 访问
1
2
cat /data/jenkins/secrets/initialAdminPassword
curl -v http://localhost:8080

docker 安装

1、制作镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
tee > Dockerfile <<- 'EOF'
FROM jenkins/jenkins
ARG dockerGid=999
ENV JENKINS_HOME=/data/jenkins
USER root
#清除了基础镜像设置的源,切换成腾讯云的阿里云源
RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list \
  && echo "deb http://mirrors.aliyun.com/debian jessie main contrib non-free" > /etc/apt/sources.list \
  && echo "deb http://mirrors.aliyun.com/debian jessie-updates main contrib non-free" >> /etc/apt/sources.list \
  && echo "deb http://mirrors.aliyun.com/debian-security jessie/updates main contrib non-free" >> /etc/apt/sources.list \
  && apt-get update && apt-get install -y libltdl7 && apt-get update \
  && echo "docker:x:${dockerGid}:jenkins" >> /etc/group \
  && curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose \
  && chmod +x /usr/local/bin/docker-compose
EOF
# 打包镜像
docker build -t jenkins .

2、启动jenkins

1
2
3
4
5
6
7
8
9
chown -R 1000 /data/jenkins
docker run --name jenkins \
    -p 8080:8080 \
    -p 50000:50000 \
    -v /var/run/docker.sock:/var/run/docker.sock \
    -v $(which docker):/bin/docker \
    -v /data/jenkins:/data/jenkins \
    -v /etc/localtime:/etc/localtime \
    -d auto-jenkins

常用插件安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
Build Monitor View
Workspace Cleanup
Disk Usage
Multijob plugin
Build Pipeline Plugin:灰度发布
Mask Passwords Plugin:密码加密
Configuration Slicing Plugin:批量修改JOB的配置
BlueOcean
Locale
Zentimestamp plugin
multibranch-scan-webhook-trigger
Structs	
Pipeline: Step API	
Token Macro	
Build Timeout	
Credentials	
Plain Credentials	
SSH Credentials	
Credentials Binding	
SCM API	
Pipeline: API	
Timestamper	
Pipeline: Supporting APIs	
Pipeline: Nodes and Processes	
Snakeyaml API	
Jackson 2 API	
ECharts API	
JUnit	
Matrix Project	
Workspace Cleanup	
Ant	
Pipeline: SCM Step	
Pipeline: Groovy	
Pipeline: Job	
Pipeline: Basic Steps	
Gradle	
Pipeline: Milestone Step	
Pipeline: Input Step	
Pipeline: Stage Step	
Pipeline Graph Analysis	
Pipeline: REST API	
Pipeline: Stage View	
Pipeline: Build Step	
Pipeline: Model API	
Pipeline: Declarative Extension Points API	
JSch dependency	
Git client	
GIT server	
Pipeline: Shared Groovy Libraries	
Branch API	
Pipeline: Multibranch	
Pipeline: Stage Tags Metadata	
Pipeline: Declarative	
Lockable Resources	
Pipeline	
GitHub API	
GitHub Branch Source	
Pipeline: GitHub Groovy Libraries	
Pipeline: Stage View	
Git	
SSH Build Agents	
Email Extension	
ECharts API	
JUnit	
Matrix Project	

jenkinsfile脱离代码仓库

安装插件

1
2
1、Config File Provider Plugin
2、Pipeline: Multibranch with defaults

配置jenkins

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// 添加default jenkinsfile
#!/usr/bin/env groovy
import groovy.transform.Field

@Field def job_name=""

node() {

    environment {
       PATH = "/usr/local/git/bin:$PATH" 
    }

    job_name="${env.JOB_NAME}".replace('%2F','/').split('/')
    job_name=job_name[0]

    workspace="/data/jenkins/workspace/CICD"

    ws("$workspace")
    {
      dir('Cnblog')
      {
        git url: 'https://github.com/MikelPan/Cnblog.git'
        def check_groovy_file="kubernetes/CICD/Jenkinsfile/${job_name}/${env.BRANCH_NAME}/Jenkinsfile.groovy"
        load "${check_groovy_file}"
      }
    }
}
//  在项目根目录中实现如下结构
---Cnblog
  ---master
    ---Jenkinsfile

jenkins 忘记管理员密码

操作步骤如下

  • 删除jenkins目录中的config.xml中的下面部分
1
2
3
4
5
6
7
8
<useSecurity>true</useSecurity>  
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">  
  <denyAnonymousReadAccess>true</denyAnonymousReadAccess>  
</authorizationStrategy>  
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">  
  <disableSignup>true</disableSignup>  
  <enableCaptcha>false</enableCaptcha>  
</securityRealm>
  • 重启Jenkins服务;
  • 进入首页>“系统管理”>“Configure Global Security”;
  • 勾选“启用安全”;
  • 点选“Jenkins专有用户数据库”,并点击“保存”;
  • 重新点击首页>“系统管理”,发现此时出现“管理用户”;
  • 点击进入展示“用户列表”;
  • 点击右侧进入修改密码页面,修改后即可重新登录

Jenkins CICD 流水线说明

流水线组成

流水线的写法有两种,声明式写法和脚本化写法。两种用的语言都是 Groovy的语法,不过表述方式上会有点差别,可以根据自己喜好选取。

  • .Pipeline 流水线,整个构建过程

  • .Node 节点,是一个机器, Jenkins环境的一部分

  • .Stage 阶段,一般是不同子集,构建、测试、发布

  • .Step 步骤,单一任务,用的较少

1、声明式写法

1

2、脚本式写法

1