1. Jenkins 介绍

软件开发生命周期(SLDC, Software Development Life Cycle):它集合了计划、开发、测试、部署的集合。


软件开发瀑布模型


软件的敏捷开发

1.1 持续集成

持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。

持续集成的流程: 提交、测试、构建、测试、部署、回滚

1.2 Jenkins 介绍

Jenkins 是一款流行的开源持续集成 (Continuous Integration) 工具,广泛用于项目开发,具有自动化构建、测试、部署等功能。

Jenkins 特点:

  • 开源的 Java 语言开发持续集成工具,支持持续集成、持续部署。
  • 易于安装部署
  • 消息通知、测试报告
  • 分布式构建
  • 文件识别
  • 丰富的插件支持

2. 持续集成环境安装

服务器规划

名称IP地址安装软件
代码托管服务器192.168.3.57Gitlab
持续集成服务器192.168.3.58Jenkins、jdk、maven、Git
应用测试服务器192.168.3.0jdk

2.1 Gitlab 安装

Gitlab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。

# 1. 安装依赖yum -y install policycoreutils openssh-server openssh-clients postfix# 2. 启动 ssh 服务,并设置开机启动。systemctl start sshd & systemctl enable sshd# 3. 启动 postfix 服务,并设置开机启动systemctl start postfix & systemctl enable postfix# 4. 开放 ssh、http 服务,并重新加载防火墙firewall-cmd --add-service=ssh --permanentfirewall-cmd --add-service=http --permanentfirewall-cmd --reload# 5. 添加 Gitlab 镜像仓库,并安装tee /etc/yum.repos.d/gitlab-ce.repo <<-'EOF'[gitlab-ce]name=Gitlab CE Repositorybaseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/gpgcheck=0enabled=1EOF# 安装 gitlabyum makecache# yum list gitlab-ce --showduplicatesyum install gitlab-ce# yum install --setopt=obsoletes=0gitlab-ce-16.0.0-ce.0.el7 -y# 6. 修改 gitlab 配置 vim /etc/gitlab/gitlab.rb# external_url 'http://192.168.3.57:30001'# nginx['listen_port'] = 30001# 7. 重载配置,启动 gitlabgitlab-ctl reconfiguregitlab-ctl restart# 8. 开放端口firewall-cmd --zone=public --add-port=30001/tcp --permanentfirewall-cmd --reload# 启动成功后,修改管理员 root 密码,就可以登录了。# 查看默认密码,默认密码保存 24 小时 cat /etc/gitlab/initial_root_password# 访问 http://192.168.3.57:30001

2.2 Jenkins 安装

# 1. 安装 jdkyum -y remove java-*# 请选择合适的jdk 版本 https://pkg.jenkins.io/redhat-stable/rpm -ivh jdk-17_linux-x64_bin.rpmtee /etc/profile.d/java.sh <<-'EOF'JAVA_HOME=/usr/java/jdk-17/CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/libPATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/binexport PATH CLASSPATH JAVA_HOMEEOFsource /etc/profile.d/java.sh# 2. 测试 jdk 是否安装成功java -version# 3. 获取 Jenkins 安装包wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.reporpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.keyyum install fontconfig -y# yum list jenkins --showduplicatesyum install jenkins -y# 最新的支持 jdk 8 的 Jenkins 版本 2.346# yum install --setopt=obsoletes=0jenkins-2.346.3-1.1 -y# 4. 指定 root 用户运行 Jenkins,后面持续部署需要用到 root 权限去执行脚本vim /usr/lib/systemd/system/jenkins.service#User=root#Group=root# 5. 启动 Jenkinssystemctl daemon-reloadsystemctl start jenkins# 6. 开放端口firewall-cmd --zone=public --add-port=8080/tcp --permanentfirewall-cmd --reload# 启动成功后,修改管理员 root 密码,就可以登录了。# 查看默认密码, cat /var/lib/jenkins/secrets/initialAdminPassword# 访问 192.168.3.58:8080

2.3 Jenkins 插件安装

# jenkins 菜单切换到 Manage Jenkins > Plugins > Available pluginscd/var/lib/jenkins/updates/sed -i 's#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g' default.json && sudo sed -i 's#www.google.com#www.baidu.com#g' default.json# jenkins 菜单切换到 Manage Jenkins > Plugins > Advanced settings# https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 替换 https://updates.jenkins.io/update-center.json # 提交保存# 重启 Jenkins,浏览器访问 http://192.168.3.58:8080/restart# 重启好之后,安装插件 Localization: Chinese (Simplified)、git、Credentials Binding Plugin、Role-based Authorization Strategy# 配置 jdk、maven# 配置 Jebnkins 系统环境变量 JAVA_HOME、M2_HOME、PATH+EXTRA# PATH+EXTRA 的值配 $M2_HOME/bin

3. Jenkins 构建 maven 项目

Jenkins 自动构建项目的类型:

  • 自由风格软件项目 (freeStyle Project)
  • maven 项目 (Maven Project)
  • 流水线项目 (Pipeline Project) (推荐使用这种,自由灵活)

安装插件 Deploy to container 用于部署 war/ear 包
安装插件 maven integration 用于 maven 项目的构建

3.1 Pipeline 流水线项目构建

Pipeline 简单来说,就是一套运行在 jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。

安装插件 Pipeline、Pipeline: Stage View、 用于构建 Pipeline 流水线项目

如何创建 Jenkins Pipeline 呢?

  • Pipeline 脚本是由 Groovy 语言实现的,
  • Pipeline 支持两种语法,Declarative(声明式的) 和 Script Pipeline (脚本式语法)
  • Pipeline 有两种创建方法,可以直接在 jenkins 的 web ui 种创建脚本,也可以创建一个 Jenkinsfile 脚本放入源码中

可以利用 Jenkins 片段生成器生成脚本 http://192.168.3.58:8080/job/spring-cloud-alibaba-study-pipeline/pipeline-syntax/

Jenkinsfile 示例

pipeline {agent anystages {stage('pull') {steps {checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-auth-ssh', url: 'git@192.168.3.57:springcloud/spring-cloud-alibaba-study.git']])}}stage('build') {steps {sh 'mvn clean package'}}stage('deploy') {steps {echo 'deploy code'}}}}

常用内置构建触发器

  • 触发远程构建
  • 其他工程构建后触发(Build after other projects are build)
  • 定时构建(build periodically)
  • 轮询SCM (Poll SCM)

git hook 自动触发构建:需要安装两个插件 Gitlab hook、Gitlab(新版本只需要安装Gitlab插件)

安装插件 Email Extension、Email Extension Template 用于发送构建结果

4. 附录

4.1 生成公钥和私钥

使用 ssh-keygen 生成公钥和私钥,用于免密操作。

# 生成 公钥和私钥,公钥配置在 gitlab, 私钥配置在 jenkinsssh-keygen -t rsa

4.2 maven 安装

# maven 安装wget -c https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.zip# 配置 maven 环境变量tee /etc/profile.d/maven.sh <<-'EOF'export MAVEN_HOME=/usr/maven/apache-maven-3.9.6export PATH=$PATH:$MAVEN_HOME/binEOF# 刷新环境变量,使之生效source /etc/profile.d/maven.sh# 改 maven 的本地仓库位置、加速镜像源vim /usr/maven/apache-maven-3.9.6/conf/settings.xml #/root/data/mvnRepo##nexus-aliyun#central#Nexus aliyun#http://maven.aliyun.com/nexus/content/groups/public#

参考文献

Gitlab官网
Jenkins官网
groovy教程
SonarQube官网
maven官网
openJDK官网
Oracle JDK官网