本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1、jenkins简介
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant。
2、jenkins的部署
2.1、jenkins部署逻辑架构
下图部署逻辑架构图中,采用基于docker容器一主多从分布式部署方式,图中只画出一个slave1来表示,实际情况按需扩展slave来解决资源不足问题。另外对于使用到的构建和打包工具使用动态的方式来拉起docker容器,构建完成后即释放相应的容器资源。
图1、部署逻辑架构
2.2、基于docker容器化的jenkins部署
2.2.1、master部署
使用docker来启动社区版的blueocean版jenkins,将jenkins_home挂载到本地来持久化数据。将/var/run/docker.sock挂载到容器内,方便实现docker-in-docker的方式启动一些构建工具。
mkdir -p /home/jenkins-data
docker run \
--name jenkins-master \
-u root \
--restart=always \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /home/jenkins-data:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkinsci/blueocean
2.2.2、slave部署
使用静态添加的方式,在jenkins web界面节点管理添加固定节点。
图2、新增slave节点
图3、slave秘钥
根据生成的秘钥来启动slave节点连接master。
mkdir -p /home/jenkins-data
docker run -dit -u root \
-v /home/jenkins-data:/home/jenkins-data \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
--name slave2\
--init jenkins/inbound-agent \
-url http://192.168.103.43:8080 \
-workDir=/home/jenkins-data a51724e529b4ac21ab16f1a4a023d474820118afd3aab999a0fcaf7cbaeae58f slave2
2.2.3、部署效果
一共部署了1个master,2个slave节点。
图4、部署效果
3、jenkins构建maven程序
3.1、pipeline配置
构建maven项目的pipeline,agent指定在带有标签master的节点上面进行构建,states里面定义构建的每个阶段的具体的步骤。这里面使用docker来集成构建工具,reuseNode true表示重复用当前的代理节点,保持和上面声明的节点一致,防止在其他节点进行构建。
pipeline {
agent {
node {
label "master"
}
}
stages {
stage('Build') {
agent{
docker {
image 'maven:3.8.6-jdk-8'
args '-v /home/maven-data/.m2:/root/.m2'
reuseNode true
}
}
steps {
sh 'mvn -B -DskipTests clean package'
}
}
}
}
3.2、构建的步骤
3.2.1、配置token
配置gitlab项目token方便jenkins拉取代码。
图5、配置token
jenkins配置gitlab的凭证。
图6、凭证配置
3.2.2、创建流水线
在jenkins中创建流水线任务。
图7、创建任务
配置从git服务器上面拉取代码。
图8、拉取源码和jenkinsfile
构建流水线。
图9、任务
图10、构建情况
4、jenkins构建nodejs程序
nodejs项目的构建和maven项目构建相似,依旧使用容器来运行构建工具,在此仅给出pipeline,具体的步骤就不在熬述。
nodejs项目pipeline。
pipeline {
agent {
node {
label "master"
}
}
stages {
stage('Build') {
agent{
docker {
image 'node:18.9.0-alpine'
args '-p 3000:3000'
reuseNode true
}
}
steps {
sh 'npm install'
sh 'npm run build'
}
}
}
}
5、jenkins接入LDAP进行权限和认证管理
新版本的jenkins可以配置用户,但在权限管理方面需要借助一些额外的RBAC权限插件。LDAP是一个统一认证管理的工具,比较老,但是比较好用。多种类型的工具都可以接入,比如nexus、gitlab、jenkins。这些工具都可以接入ldap来统一管理用户。
5.1、ldap的配置
ldap的安装部署不在此讨论,如有需要后续补充,此处ldap中设置了两个分组jenkins-admin、jenkins-user以及几个测试用户。
图11、ldap配置
5.2、jenkins接入ldap的配置
需要jenkins安装好ldap插件。
图12、jenkins截图配置
5.3、rbac的权限控制
为了达到更细粒度的权限控制,可以安装rbac插件来进行权限规划和分配。
图13、rbac权限设置
图14、角色管理
图15、角色分配