Jenkins + gitlab 持续集成和持续部署的学习笔记

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.57 Gitlab
持续集成服务器 192.168.3.58 Jenkins、jdk、maven、Git
应用测试服务器 192.168.3.0 jdk

2.1 Gitlab 安装

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

shell 复制代码
# 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 --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
# 5. 添加 Gitlab 镜像仓库,并安装
tee /etc/yum.repos.d/gitlab-ce.repo <<-'EOF'
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
EOF
# 安装 gitlab
yum makecache
# yum list gitlab-ce --showduplicates
yum install gitlab-ce
# yum install --setopt=obsoletes=0  gitlab-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. 重载配置,启动 gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
# 8. 开放端口
firewall-cmd --zone=public --add-port=30001/tcp --permanent
firewall-cmd --reload
# 启动成功后,修改管理员 root 密码,就可以登录了。
# 查看默认密码,默认密码保存 24 小时 cat /etc/gitlab/initial_root_password
# 访问 http://192.168.3.57:30001

2.2 Jenkins 安装

shell 复制代码
# 1. 安装 jdk
yum -y remove java-*
# 请选择合适的jdk 版本 https://pkg.jenkins.io/redhat-stable/
rpm -ivh jdk-17_linux-x64_bin.rpm
tee /etc/profile.d/java.sh <<-'EOF'
JAVA_HOME=/usr/java/jdk-17/
CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME
EOF
source /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.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install fontconfig -y
# yum list jenkins --showduplicates
yum install jenkins -y
# 最新的支持 jdk 8 的 Jenkins 版本 2.346
# yum install --setopt=obsoletes=0  jenkins-2.346.3-1.1 -y
# 4. 指定 root 用户运行 Jenkins,后面持续部署需要用到 root 权限去执行脚本
vim /usr/lib/systemd/system/jenkins.service
#User=root
#Group=root
# 5. 启动 Jenkins
systemctl daemon-reload
systemctl start jenkins
# 6. 开放端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
# 启动成功后,修改管理员 root 密码,就可以登录了。
# 查看默认密码, cat /var/lib/jenkins/secrets/initialAdminPassword
# 访问 192.168.3.58:8080

2.3 Jenkins 插件安装

shell 复制代码
# jenkins 菜单切换到 Manage Jenkins > Plugins > Available plugins
cd  /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 示例

groovy 复制代码
pipeline {
    agent any

    stages {
        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 生成公钥和私钥,用于免密操作。

shell 复制代码
# 生成 公钥和私钥,公钥配置在 gitlab, 私钥配置在 jenkins
ssh-keygen -t rsa

4.2 maven 安装

shell 复制代码
# 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.6
export PATH=$PATH:$MAVEN_HOME/bin
EOF
# 刷新环境变量,使之生效
source /etc/profile.d/maven.sh
# 改 maven 的本地仓库位置、加速镜像源
vim /usr/maven/apache-maven-3.9.6/conf/settings.xml 
#<localRepository>/root/data/mvnRepo</localRepository>
#<mirror>
#  <id>nexus-aliyun</id>
#  <mirrorOf>central</mirrorOf>
#  <name>Nexus aliyun</name>
#  <url>http://maven.aliyun.com/nexus/content/groups/public</url>
#</mirror>

参考文献

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

相关推荐
Linux运维老纪5 小时前
DNS缓存详解(DNS Cache Detailed Explanation)
计算机网络·缓存·云原生·容器·kubernetes·云计算·运维开发
Elastic 中国社区官方博客6 小时前
使用真实 Elasticsearch 进行高级集成测试
大数据·数据库·elasticsearch·搜索引擎·全文检索·jenkins·集成测试
千夜啊7 小时前
Nginx 运维开发高频面试题详解
运维·nginx·运维开发
画船听雨眠aa13 小时前
gitlab云服务器配置
服务器·git·elasticsearch·gitlab
risc1234561 天前
【Elasticsearch】中数据流需要配置索引模板吗?
大数据·elasticsearch·jenkins
Linux运维老纪1 天前
windows部署deepseek之方法(The Method of Deploying DeepSeek on Windows)
linux·人工智能·分布式·云原生·运维开发·devops
skinGap2 天前
Node.js 中文编码问题全解析
node.js·jenkins·android-studio
字节全栈_PVK2 天前
Jenkins 的安装(详细教程)_jenkins安装
运维·jenkins
risc1234562 天前
【Elasticsearch】match_bool_prefix 查询 vs match_phrase_prefix 查询
大数据·elasticsearch·jenkins
柠檬豆腐脑2 天前
从前端到全栈:Jenkins 自动化部署 Node.js后端+ Vue.js 前端
前端·ci/cd·jenkins