Jenkins_学习笔记

一、DevOPS_学习笔记

此文档来源于B站"尚硅谷"博主的视频资料汇总,发布此平台的目的主要是为个人笔记所用。

视频地址:

https://www.bilibili.com/video/BV1bS4y1471A?spm_id_from=333.788.videopod.sections\&vd_source=b4b223afff1abfc0bf7da0beff6ce97d

二、基础环境建设

准备CentOS7镜像安装虚拟机,建议初始化后留存一份环境,后续有新的虚拟机使用需求可以使用克隆功能快速搭建环境

配置IP可参考

https://blog.csdn.net/anduchencang/article/details/114524142?spm=1011.2415.3001.5331

1、centos7环境学习阶段可关闭防火墙

markdown 复制代码
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
# 看到:inactive (dead) 且 Enabled: disabled 就对了

2、修改yum源

markdown 复制代码
# 1. 备份旧源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

# 2. 下载阿里云 CentOS 7 源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

# 或者 
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo

# 3. 清理缓存、重建缓存
yum clean all
yum makecache

# 4.安装字体
yum install -y fontconfig dejavu-sans-fonts dejavu-serif-fonts

3、新建公共目录

复制代码
 mkdir -p /apps/{conf,data,lib,logs,run,sh,sharedstorage,svr,tools}

三、GitLab

新起一台CentOS7

1、提供三种安装方式,三选一

1.1 离线安装(企业级)

官方安装文档:https://gitlab.cn/install/?version=ce

gitlab-ce = 官方原版社区版(国际版,功能一致,原生英文 / 基础汉化)

markdown 复制代码
# 下载安装包
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.9.1-ce.0.el7.x86_64.rpm

# 安装
rpm -i gitlab-ce-15.9.1-ce.0.el7.x86_64.rpm

# 编辑 /etc/gitlab/gitlab.rb 文件
# 修改 external_url 访问路径 http://ip:port
http://192.168.127.128:28080/users/sign_in

# 其他配置修改如下
gitlab_rails['time_zone'] = 'Asia/Shanghai'
puma['worker_processes'] = 2
sidekiq['max_concurrency'] = 8
postgresql['shared_buffers'] = "128MB"
postgresql['max_worker_processes'] = 4
prometheus_monitoring['enable'] = false

# 更新配置并重启
gitlab-ctl reconfigure
gitlab-ctl restart

密码存在下面文件中,登录后需要改密码不然24小时之后会失效

vasg 复制代码
cat /etc/gitlab/initial_root_password
1.2 docker安装(个人/测试)

docker安装可参考上面章节"安装docker"

1.2.1 添加容器(启动GitLab容器)
bash 复制代码
# 拉取镜像
docker pull registry.gitlab.cn/omnibus/gitlab-jh:latest

# 启动容器
docker run --detach \
  --hostname 192.168.127.180 \
  --publish 443:443 --publish 80:80 \
  --name gitlab \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab:z \
  --volume $GITLAB_HOME/logs:/var/log/gitlab:z \
  --volume $GITLAB_HOME/data:/var/opt/gitlab:z \
  --shm-size 256m \
  registry.gitlab.cn/omnibus/gitlab-jh:latest
  

容器命令

复制代码
docker start gitlab
docker restart gitlab

查看容器

bash 复制代码
docker ps -a

进入容器

bash 复制代码
docker exec -it gitlab /bin/bash

访问GitLab

bash 复制代码
http://192.168.127.180

首次出现502错误排查

当首次运行出现502错误时,优先排查以下两个原因:

1.虚拟机内存至少需要 4G

2.稍微再等等刷新一下可能就好了

管理员账号登录

用户名:root

密码存在下面文件中,登录后需要改密码不然24小时之后会失效

vasg 复制代码
cat /etc/gitlab/initial_root_password
1.3 ssh安装

gitlab-jh = 极狐 GitLab(国内维护,适配国内网络、汉化完善、有本土化功能)

1.3.1 安装依赖
复制代码
sudo yum install -y curl policycoreutils-python oppenssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd
1.3.2 配置镜像
复制代码
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash
1.3.3 开始安装
复制代码
sudo EXTERNAL_URL="http://192.168.127.180" yum install -y gitlab-jh

除非您在安装过程中指定了自定义密码,否则将随机生成一个密码并存储在

/etc/gitlab/initial_root_password 文件中(出于安全原因,24小时后,此文件会被第一次gitlab-ctl

reconfigure 自动删除 , 因此若使用随机密码登录,建议安装成功初始登录成功之后,立即修改初始密码)。

vasg 复制代码
cat /etc/gitlab/initial_root_password
1.3.4 gitlab常用命令
markdown 复制代码
# 启动所有gitlab组件:
gitlab-ctl start 
# 停止所有 gitlab组件:
gitlab-ctl stop
# 重启所有 gitlab组件:
gitlab-ctl restart
# 查看服务状态;
gitlab-ctl status
# 启动服务:
gitlab-ctl reconfigure
# 修改默认的配置文件:
vi /etc/gitlab/gitlab.rb
# 查看日志;
gitlab-ctl tail

2、配置GitLab

2.1 页面配置
markdown 复制代码
# 查看默认密码
cat /etc/gitlab/initial_root_password
# 登录后修改默认密码 > 右上角头像 > Perferences > Access > Password > Change password


# 取消个人全球标识-修改系统配置:点击左上角三横 > Admin
Settings > General > Account and limit > 取消 Gravatar enabled > Save changes

# 关闭用户注册功能
# Settings > General > Sign-up restrictions > 取消 Sign-up enabled > Save changes
新版本在这里 Settings > General >  New user account restrictions  > Save changes

# 开启 webhook 外部访问
 Settings > Network > Outbound requests > Allow requests to the local network from web hooks and services/integrations 勾选  > Save changes

# 设置语言为中文(全局)
Settings > Preferences > Localization > Default language > 选择简体中文 > Save changes

# 设置当前用户语言为中文
右上角用户头像 > Preferences > Localization > Language > 选择简体中文 > Save changes
2.2 为项目配置webhook
markdown 复制代码
进入项目点击侧边栏设置 > Webhooks 进入配置即可

URL:在 jenkins 创建 pipeline 项目后
触发来源:
	推送事件:表示收到新的推送代码就会触发
	标签推送事件:新标签推送才会触发
	评论:根据评论决定触发
	合并请求事件:创建、更新或合并请求触发

添加成功后,可以在下方点击测试按钮查看 jenkins 是否成功触发构建操作

配置token和ssh密钥

2.3 卸载
markdown 复制代码
# 停止服务
gitlab-ctl stop

# 卸载 rpm 软件(注意安装的软件版本是 ce 还是 ee)
rpm -e gitlab-ce

# 查看进程
ps -ef|grep gitlab 
# 干掉第一个 runsvdir -P /opt/gitlab/service log 进程

# 删除 gitlab 残余文件
find / -name *gitlab* | xargs rm -rf
find / -name gitlab | xargs rm -rf

四、Jenkins

1、安装 JDK

1.1 OpenJDK17安装

https://download.java.net/java/GA/jdk17.0.2/dfd4a8d0985749f896bed50d7138ee7f/8/GPL/openjdk-17.0.2_linux-x64_bin.tar.gz

安装

shell 复制代码
mv ~/openjdk-17.0.2_linux-x64_bin.tar.gz /apps/svr/
tar -zxvf /apps/svr/openjdk-17.0.2_linux-x64_bin.tar.gz -C /apps/svr/
mv /apps/svr/jdk-17.0.2 /apps/svr/jdk17
rm -f /apps/svr/openjdk-17.0.2_linux-x64_bin.tar.gz

vi /etc/profile
export JAVA_HOME_17=/apps/svr/jdk17
export JAVA_HOME=$JAVA_HOME_17
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile

java -version
1.2 JDK8安装

https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u492-b09/OpenJDK8U-jdk_x64_linux_hotspot_8u492b09.tar.gz

shell 复制代码
mv ~/OpenJDK8U-jdk_x64_linux_hotspot_8u492b09.tar.gz  /apps/svr/
tar -zxvf /apps/svr/OpenJDK8U-jdk_x64_linux_hotspot_8u492b09.tar.gz -C //apps/svr/
mv /apps/svr/jdk8u492-b09 /apps/svr/jdk8
rm -f /apps/svr/OpenJDK8U-jdk_x64_linux_hotspot_8u492b09.tar.gz

vi /etc/profile

export JAVA_HOME_8=/apps/svr/jdk8
export JAVA_HOME_17=/apps/svr/jdk17
# 根据你的常用JDK版本来配置
export JAVA_HOME=$JAVA_HOME_8
#export JAVA_HOME=$JAVA_HOME_17
export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile

java -version

或者使用yum下载

bash 复制代码
yum search openjdk
yum install -y 你指定的版本 

2、安装 maven

官网

https://maven.apache.org/download.cgi

下载链接

https://dlcdn.apache.org/maven/maven-3/3.9.16/binaries/apache-maven-3.9.16-bin.tar.gz

安装

shell 复制代码
mv ~/apache-maven-3.9.16-bin.tar.gz  /apps/svr/
tar -zxvf /apps/svr/apache-maven-3.9.16-bin.tar.gz -C /apps/svr/
mv /apps/svr/apache-maven-3.9.16 /apps/svr/maven
rm -f /apps/svr/apache-maven-3.9.16-bin.tar.gz

vi /etc/profile
export M2_HOME=/apps/svr/maven
export PATH=$PATH:$M2_HOME/bin

source /etc/profile
mvn --version

配置仓库

shell 复制代码
mkdir -p /apps/data/repo

vi /apps/svr/maven/conf/settings.xml

<localRepository>/apps/data/repo</localRepository>
    <!-- 私服没有可不配置 -->
	<mirror>
      <id>nexus-snapshots</id>
      <mirrorOf>central</mirrorOf>
      <url>http://10.231.7.182:8081/repository/maven-public/</url>
    </mirror>
    <!-- 阿里云仓库 -->
    <mirror>
        <mirrorOf>central</mirrorOf>
        <id>alimaven</id>
        <name>aliyun maven</name>
        <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
    </mirror>

    <!-- 阿里云https -->
    <mirror>
      <id>aliyun-central</id>
      <mirrorOf>central</mirrorOf>
      <name>Aliyun Maven Central</name>
      <url>https://maven.aliyun.com/repository/central</url>
    </mirror>

验证配置是否生效

shell 复制代码
# 建临时文件夹
mkdir -p /tmp/maven-test && cd /tmp/maven-test

# 生成空pom
cat > pom.xml <<EOF
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test</groupId>
    <artifactId>maven-demo</artifactId>
    <version>1.0.0</version>

    <!-- 引入一个常用依赖,比如 hutool 工具包 -->
    <dependencies>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.25</version>
        </dependency>
    </dependencies>
</project>
EOF

执行依赖拉取命令

复制代码
mvn clean compile

3、安装 Git

markdown 复制代码
# 安装git
yum install -y git 

[root@localhost srv]# git --version
git version 1.8.3.1
[root@localhost srv]#

支持jDK8、11、17

https://www.jenkins.io/zh/

下载war包

http://mirrors.jenkins.io/war-stable/2.541.3/jenkins.war

安装手册

https://www.jenkins.io/zh/doc/book/installing/

4、安装 jenkins.war

shell 复制代码
mv ~/jenkins.war  /apps/svr
cd /apps/svr 
# 控制台启动
java -jar jenkins.war
# 后台启动
nohup java -jar jenkins.war >/dev/null 2>&1 &
# 插件默认安装在这里
~/.jenkins/plugins/
4.1 配置开机自启动(二选一)
4.1.1 rc.local
shell 复制代码
# 启动命令加入 rc.local
echo  "nohup  /apps/svr/jdk17/bin/java -jar /apps/svr/jenkins.war >/dev/null 2>&1 &" >> /etc/rc.local


# 赋权 
chmod +x /etc/rc.d/rc.local
 
# 确保 rc-local 服务开机启用
systemctl enable rc-local
systemctl start rc-local
systemctl status rc-local 

# 重启验证
reboot
4.1.2 jenkins.service

/etc/systemd/system/jenkins.service

复制代码
[Unit]
Description=Jenkins standalone WAR service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
Group=root
WorkingDirectory=/root
Environment="JAVA_HOME=/apps/svr/jdk17"
Environment="JENKINS_HOME=/root/.jenkins"
ExecStart=/apps/svr/jdk17/bin/java -jar /apps/svr/jenkins.war --httpPort=8080
Restart=always
RestartSec=10
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

添加开机自启动服务

markdown 复制代码
# 每次新增或修改 service 文件后,先执行
systemctl daemon-reload
# 开机自启动
systemctl enable jenkins.service
# 验证是否开机自启
systemctl is-enabled jenkins.service
# 启动、关闭、重启、查看状态
systemctl start jenkins
systemctl stop jenkins
systemctl restart jenkins
systemctl status jenkins
4.2 访问
markdown 复制代码
http://ip:8080
# 密码在这里
/root/.jenkins/secrets/initialAdminPassword

安装推荐的插件

创建第一个管理员账号,保存并完成

4.3 配置 升级站点 为阿里云镜像
markdown 复制代码
Manage jenkins -> Plugin Manager -> Advanced -> Update Site

# 目前Jenkins官网可访问反而是阿里云的不可访问,信息过时了,这个建议先不配
https://updates.jenkins.io/update-center.json -> https://mirrors.aliyun.com/jenkins/updates/update-center.json
4.4 安装插件
复制代码
Manage jenkins -> Plugin Manager -> Available
Maven Integration
Pipeline Maven Integration
Pipeline: REST API
Pipeline: Stage View
Docker Pipeline
Blue Ocean
SonarQube
GitLab
SSH Pipeline Steps
Publish Over SSH
Docker
Role-based Authorization Strategy

5、配置

5.1 全局工具配置

Maven Conf、JDK、Maven

复制代码
/apps/svr/maven/conf/settings.xml
/apps/svr/jdk17
/apps/svr/jdk8
/apps/svr/maven
5.2 添加GitLab凭证

系统管理配置 -> 全局配置 -> 添加GitLab凭证

5.3 新建jenkins任务

配置git仓库

​ 测试时项目给的权限是公开

markdown 复制代码
# 生产要配置ssh密钥

ssh-keygen -t ed25519 -C  [your email] -f  ~/.ssh/id_ed25519
回车到底
cat ~/.ssh/id_ed25519.pub        

# 把公钥配置到GitLab
手动去jenkins服务器拉一下代码,之后再去走自动化构建任务

选择构建触发器

​ Build whenever a SNAPSHOT dependency is built(保存快照,pom文件未变化时不去更新依赖)

构建环境

​ 先不配置

Pre Steps 构建前的操作

​ 可以在构建前执行脚本

Build Maven

​ Root Pom

​ pom.xml

​ Global and options

Post Steps 构建完成后的操作

​ 配置归档成品

​ target/*.jar

​ target/*.war

​ 可以发布到测试环境

Post Steps 构建完成后的操作 -> 配置归档成品

markdown 复制代码
# 文件归档
/root/.jenkins/jobs/项目名/builds/构建id

# 工作空间
/root/.jenkins/workspace/项目名
5.4 Publish ssh

系统管理 -> 系统配置 -> 新增ssh服务

配置超时时间

配置构建任务 Post Steps

验证通过、发布成功

6、常见的自动构建方式

  • Build whenever a SNAPSHOT dependency is built

    • 当前依赖的快照被构建时执行本job
  • 触发远程构建 (例如脚本、GitLab)

    • 远程调用本 job 的 restAPI 时调用本 job
  • 其他工程构建后触发(例如父项目)

    • 当前依赖的 job 被构建时执行本 job
  • 定时构建(cron表达式同linux)

  • GitHub hook trigger for GITScm polling(关联)

    • ① Push Events 本地 git push 推送代码到远端分支时触发构建

      • 场景:你在本地写完代码 git push 推送到 jenkins /suyan6082 分支,GitLab 发 WebHook,Jenkins 自动打包;
      • 配合你上面的多分支配置:只推送白名单内的分支才会构建,其他分支 push 不触发。
    • ② Push Events in case of branch delete 删除分支时触发构建

      • 勾选后:在 GitLab 删除分支,也会调用 Jenkins;
      • 一般不需要,默认不选。
    • ③ Opened Merge Request Events 新建合并请求 (MR) 时自动构建

      • 场景:开发从 suyan6082 提 MR 合并到 jenkins,刚创建 MR 的瞬间,Jenkins 自动拉取 MR 两边代码做合并校验打包;
      • 作用:MR 还没合并就提前检测代码编译、单元测试报错,防止合出坏代码。
    • ④Build only if new commits were pushed to Merge Request 仅 MR 有新提交才重新构建

      • 勾选后:只有往这个 MR 新增 commit 才会触发构建;单纯编辑 MR 标题、描述、指派审核人,不会重复打包;
      • 适合频繁改 MR 备注的场景,减少无效构建
    • ⑤ Accepted Merge Request Events MR 审核通过、点击合并完成后触发构建

      • 场景:代码合并到目标分支后,自动打包部署测试环境;
      • 如果你想合并完成后才构建部署,就勾选此项。
    • ⑥ Closed Merge Request Events

      • MR 被关闭(放弃合并)时触发构建,几乎用不到,不用勾选
    • Rebuild open Merge Requests(对已打开的 MR,哪些操作会重新构建)

      • 下拉框 Never:从不自动重跑 MR 构建,只有手动点构建才会执行。

        可选其他值:

        • On push to source branch:源分支更新自动重跑 MR;
        • On push to target branch:目标分支更新自动重跑 MR;
        • Always:任意变动都重跑。
      • Approved Merge Requests (EE-only)

        GitLab 企业版专属:MR 被审核人审批通过后,自动重新跑一次构建。

      • Comments

        在 MR 下面评论内容,可触发构建;

        配合下方 Comment (regex) for triggering a build 正则框使用。

        举例:下方填写 @build,则在 MR 评论里输入 @build,Jenkins 立刻重新打包。

      • Comment (regex) for triggering a build

        ​ 正则匹配评论关键词,只有评论命中这个正则才会触发构建;

        • 空着:任意评论都会触发;
        • ^start-build$:只有评论完整输入 start-build 才构建。
  • 轮询 SCM

    • 使用 cron 表达式定时主动去访问GitLab检查代码变更,变更后构建本job
6.1 触发远程构建 (例如脚本)

触发方法:http://192.168.127.172:8080/job/test_suyan_mvn/build?token=suyan_token

6.2 webhook调用自动构建

安装插件 build authorization

方法一(更简单):

​ 自动化构建 -> 触发远程构建 -> token

http://192.168.127.172:8080/job/test_suyan_mvn/build?token=suyan_token

方案二:Build when a change is pushed to GitLab

​ Jenkins配置token

​ GitLab -> 设置 -> 网络 -> 出站请求 -> 允许来自web hooks 和服务对本地网络的请求 + 允许系统勾子向本地网络发起请求

​ GitLab -> webhooks -> 配置url + 关闭SSL验证 + 和并请求

GitLab配置系统钩子webhook

代码推送后成功触发自动构建

6.3 定时构建(cron表达式同linux)
6.4 SCM调用自动构建

7、配置邮件通知

7.1 qq邮箱配置 SMTP/IMAP

账号管理 -> 安全设置 -> POP3/IMAP/SMTP/Exchange/CardDAV 服务 -> 开启服务 + 生成授权码

qq邮箱配置方法:https://wx.mail.qq.com/list/readtemplate?name=app_intro.html#/agreement/authorizationCode

复制代码
uqdtmtcjbmfzecei
7.1.1 在第三方客户端/服务设置

登录时,请在第三方客户端的密码输入框 里面填入授权码进行验证。(不是填入QQ的密码)

7.1.1.1 IMAP/SMTP 设置方法

用户名/帐户: 你的QQ邮箱完整的地址

密码: 生成的授权码

电子邮件地址: 你的QQ邮箱的完整邮件地址

接收邮件服务器: imap.qq.com,使用SSL,端口号993

发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587

7.1.1.2 POP3/SMTP 设置方法

用户名/帐户: 你的QQ邮箱完整的地址

密码: 生成的授权码

电子邮件地址: 你的QQ邮箱的完整邮件地址

接收邮件服务器: pop.qq.com,使用SSL,端口号995

发送邮件服务器: smtp.qq.com,使用SSL,端口号465或587

7.2 Jenkins配置

Manage Jenkis -> System Configuration -> Configure System -> Jenkins Location -> 系统管理员邮件地址(系统发件邮箱) + 邮件通知(系统级别的邮件通知)+ Extended E-mail Notification(个性化邮件通知,可以配置各种触发器,需要安装插件,如果安装了系统推荐的插件则自带,没有的话去插件市场安装下)

Default Recipients 收件人列表:cc:someone@example.com, bcc:bob@example.com

配置成功

构建任务 -> 构建后操作 -> E-mail Notification(原生基础)/ Editable Email Notification (扩展邮件 EE)

7.2.1 使用场景建议
  1. 只勾选 E-mail Notification

    适合个人本地测试,不需要美观、不需要附件,简单告警即可;缺点信息太少,排查问题不方便。

  2. 只使用 Editable Email Notification(推荐)

    正式项目统一用这个,功能完整,支持定制化告警,搭配 GitLab 分支、构建产物、错误日志。

注意:不要两个同时勾选,会重复发送两封邮件。

8、Jenkins 集群/并发构建

集群化构建可以有效提升效率,尤其是团队项目较多或是子项目比较多的时候,可以并发在多台机器上执行构建

Manage Jenkins -> Manage Nodes and Clouds -> 新建节点

复制代码
远程工作目录: /root

标签:jenkins-02

Number of executors : 并发数量

用法:Use this node as much as possible / Only build jobs whth  label expressions mathing this node

启动方式:SSH
	主机:ip地址
	credentials:录入用户、密码、Non verifying
	
其他的可以先不配置,后根据需要来配置

我之前没有指定Java 路径,默认找到的是系统自带的 Jre8 导致启动 Agent.jar 失败,可以在上面的图指定下,也可以把环境变量往 系统的非交互shell文件同步一份环境变量的配置

markdown 复制代码
vi /etc/bashrc

# 在文件的最后写入

export JAVA_HOME_8=/apps/svr/jdk8
export JAVA_HOME_17=/apps/svr/jdk17
# 根据你的常用JDK版本来配置
# export JAVA_HOME=$JAVA_HOME_8
export JAVA_HOME=$JAVA_HOME_17
export PATH=$JAVA_HOME/bin:$PATH

# 验证是否生效
bash -c 'echo $PATH; echo $JAVA_HOME'

点击进节点可以查看控制台日志

设置项目 -> Generral -> 在必要的时候并发构建 + 限制项目的运行节点

从节点构建成功

9、pipepline 流水线

流水线既能作为任务的本身,也能作为 Jenkinsfile

使用流水线可以让我们的任务从 ui 手动操作,转换为代码化,像 docker 的 dockefile 一样,从 shell 命令到配置文件,更适合大型项目,可以让团队其他开发者同时参与进来,同时也可以编辑开发 jenkinswebui 不能完成的更复杂的构建逻辑,作为开发者可读性也更好

9.1 完整语法

5个必备的组成部分

复制代码
pipeline: 整条流水线
    agent:指定执行器
    stages:所有阶段
        stage:某一阶段,可有多个
            steps:阶段内的每一步,可执行命令
9.2 声明式流水线

​ 好处

  • 更像是在 jenkins web ui 中的操作
  • 可读性比较高
  • 可以使用 blue ocean 自动生成
  • 支持语法检查

​ 坏处

  • 代码逻辑能力比脚本试弱,不能完成特别复杂的任务
9.3 脚本式流水线(Groovy)

​ 好处

  • 更少的代码和弱规范要求

  • 更灵活的自定义代码操作

  • 不受约束,可以构建特别复杂的工作流和流水线

    坏处

  • 读写对编程要求比较高

  • 比声明式流水线代码更复杂

9.4 测试脚本

Groovy 沙盒(更复杂的构建逻辑会用到,普通的用不到)

安装插件:Pipeline:stage View、Blue ocean

编辑 Pipeline script后,鼠标点击代码框外,出现Approve script需要审批(每次更新脚本都需要做审批),最后点击保存

根据片段生成器生成pipeline语句

9.5 测试服务器新增 jenkins 用户权限
shell 复制代码
# 编辑sudoers
visudo
# 添加root级别权限
jenkins     ALL=(ALL)       ALL
9.6 测试案例
shell 复制代码
pipeline {
    agent any
    tools {
        maven "maven"
        jdk "JDK17"
    }
    stages {
        stage('拉取代码') {
            steps {
                git branch: 'jenkins', url: 'http://192.168.127.180/root/suyan.git'
                echo '拉取成功'
            }
        }
        stage('编译代码') {
            steps {
                sh "java -version"
                sh "mvn -version"
                sh "pwd"
                sh "mvn clean package"
                echo '构建成功'
            }
        }
        stage('清理服务器历史文件') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.127.201', sshCredentials: [encryptedPassphrase: '{AQAAABAAAAAQb4cS9qE9yXEmobCj1LRvPTAWZ46tDtmtL78qr1u7UtU=}', key: '', keyPath: '', username: 'root'], transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''PID=$(ps -ef | grep ScannerApi | grep -v grep | awk \'{print $2}\')
if [ -n "$PID" ]; then
	kill -15 $PID
	sleep 2
	kill -9 $PID 2>/dev/null
else
	echo "未检测到ScannerApi运行进程,无需关闭"
fi
rm -f /apps/svr/suyan/ScannerApiExt-0.0.2-SNAPSHOT.jar''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '清理成功'
            }
        }
        stage('推送jar包到服务器') {
            steps {
                sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.127.201', sshCredentials: [encryptedPassphrase: '{AQAAABAAAAAQgRTfse/2CI6/gu56y15gBMh80vWnIgLaMwXDf3fdyps=}', key: '', keyPath: '', username: 'root'], transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'nohup /apps/svr/jdk8/bin/java -jar /apps/svr/suyan/ScannerApiExt-0.0.2-SNAPSHOT.jar >/dev/null 2>&1 &', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '/suyan', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
                echo '发布成功'
            }
        }
    }
}
9.7 sshPublisher 模版
复制代码
sshPublisher(
    publishers: [
        sshPublisherDesc(
            configName: '目标服务器配置名',
            transfers: [
                // 前置执行脚本
                sshTransfer(
                    cleanRemote: false,
                    excludes: '',
                    execCommand: '''echo "PreShell"
''',
                    execTimeout: 120000,
                    flatten: false,
                    makeEmptyDirs: false,
                    noDefaultExcludes: false,
                    patternSeparator: '[, ]+',
                    remoteDirectory: '',
                    remoteDirectorySDF: false,
                    removePrefix: '',
                    sourceFiles: ''
                ),
                // 上传压缩包
                sshTransfer(
                    cleanRemote: false,
                    excludes: '',
                    execCommand: '',
                    execTimeout: 120000,
                    flatten: false,
                    makeEmptyDirs: false,
                    noDefaultExcludes: false,
                    patternSeparator: '[, ]+',
                    remoteDirectory: '/vmsnginx/html',
                    remoteDirectorySDF: false,
                    removePrefix: 'dist',
                    sourceFiles: 'dist/static.zip'
                ),
                // 后置解压、重启服务脚本
                sshTransfer(
                    cleanRemote: false,
                    excludes: '',
                    execCommand: '''echo "PostShell"
echo "update html start"
cd  /vmsroot/app/vmsnginx/html/
rm -rf ./static/
unzip -q ./static.zip
chmod 755 -R ./static/
/vmsroot/script/vms_service.sh/vms_service.sh  restart vmshttp
echo "update html success"''',
                    execTimeout: 120000,
                    flatten: false,
                    makeEmptyDirs: false,
                    noDefaultExcludes: false,
                    patternSeparator: '[, ]+',
                    remoteDirectory: '',
                    remoteDirectorySDF: false,
                    removePrefix: '',
                    sourceFiles: ''
                )
            ],
            usePromotionTimestamp: false,
            useWorkspaceInPromotion: false,
            verbose: false
        )
    ]
)
9.8 Groovy格式化
复制代码
npm install -g npm-groovy-lint

npm-groovy-lint --format Jenkinsfile

五、docker

https://docs.gitlab.cn/jh/install/docker.html

安装所需最小配置

  • 内存至少4G
  • 系统内核至少在3.10以上 uname -r 命令可查看系统内核版本
markdown 复制代码
# 操作系统
Centos7

# 安装docker依赖
sudo yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

# 设置docker的yum源
sudo yum-config-manager \
--add-repo \
https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

# 查看源中可用版本
yum list docker-ce --showduplicates | sort -r

# 安装20.10
yum install -y docker-ce-20.10.24-3.el7 docker-ce-cli-20.10.24-3.el7 containerd.io

# 指定镜像地址
mkdir -p /etc/docker

# 写入配置文件
tee /etc/docker/daemon.json <<-'EOF'
{
  "dns": ["8.8.8.8", "114.114.114.114"],
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://mirror.baidubce.com",
    "https://hub-mirror.c.163.com"
  ]
}
EOF

# 重启docker
systemctl daemon-reload
systemctl restart docker

# 配置开机启动项
systemctl enable docker

# 安装docker compose
curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 赋权
chmod +x /usr/local/bin/docker-compose

# 测试版本
[root@bogon yum.repos.d]# docker-compose -v
Docker Compose version v2.20.3

#  注意
Docker 20.10 在 CentOS 7 上有一个 BUG:
配置了 daemon.json 镜像加速,但是不生效!依然强制走官方 registry-1.docker.io
所以后面安装sonarqube的yaml配置了镜像前缀 

1、docker compose 命令

markdown 复制代码
# 查看状态
docker-compose ps

# 查看日志
docker-compose logs 容器名

# 停止并删除容器,但不会删除数据
docker-compose down

# 启动所有服务,后台运行
docker-compose up -d

# 先停止,再启动(相当于重启)
cd /apps/svr/harbor
docker-compose down
docker-compose up -d

# 或者直接用 restart
docker-compose restart

# 升级(仅替换镜像版本即可)
docker-compose pull && docker-compose up -d

六、nexus

待补充

七、harbor

新起一台centos7

docker安装可参考上面章节"安装docker"

1、安装

markdown 复制代码
# 下载 harbor 安装包
https://github.com/goharbor/harbor/releases/download/v2.15.0/harbor-offline-installer-v2.15.0.tgz
mv ~/harbor-offline-installer-v2.15.0.tgz  /apps/svr
tar -zxvf /apps/svr/harbor-offline-installer-v2.15.0.tgz -C /apps/svr/
rm -f /apps/svr/harbor-offline-installer-v2.15.0.tgz


# 复制配置文件 
cd /apps/svr/harbor
cp harbor.yml.tmpl harbor.yml
# 修改配置
hostname: 192.168.127.181
  port: 80
harbor_admin_password: Harbor1234i5

# 注释https相关配置 
# https:
#  port: 18443
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path

# 执行 install.sh 
/apps/svr/harbor/install.sh

# 验证容器是否启动成功
docker-compose ps

# 修改配置后的正确重启流程
1. 重新生成配置:
./prepare
2. 停止旧实例:
docker-compose down
3. 启动新实例:
docker-compose up -d

2、登录验证

markdown 复制代码
# 登录harbor网站
http://192.168.127.180:28080/
admin/你的密码

八、SonarQube

可以和GitLab放在同一台机器上

1、安装

shell 复制代码
# 配置宿主机内核参数
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
echo "fs.file-max=65536" >> /etc/sysctl.conf
sysctl -p

# 创建部署目录
mkdir -p /apps/svr/sonarqube && cd /apps/svr/sonarqube
mkdir -p /apps/data/sonarqube
mkdir -p /apps/logs/sonarqube
mkdir -p /apps/extensions/sonarqube

mkdir -p /apps/data/postgresql


# 创建 docker-compose.yml
vi docker-compose.yml

配置文件如下

yaml 复制代码
version: '3.8'

services:
  # 数据库(SonarQube 推荐 PostgreSQL)
  postgres:
    image: postgres:15
    container_name: sonar-postgres
    restart: always
    environment:
      POSTGRES_USER: sonar
      POSTGRES_PASSWORD: sonar@123 # 请修改为强密码
      POSTGRES_DB: sonar
    volumes:
      - ./postgresql/data:/apps/data/postgresql
    networks:
      - sonar-net

  # SonarQube 社区版 (LTS 长期支持版)
  sonarqube:
    image: sonarqube:lts-community # 9.9 LTS 最稳定
    container_name: sonarqube
    restart: always
    depends_on:
      - postgres
    environment:
      # 数据库连接
      SONAR_JDBC_URL: jdbc:postgresql://postgres:5432/sonar
      SONAR_JDBC_USERNAME: sonar
      SONAR_JDBC_PASSWORD: sonar@123 # 与上面密码一致
      # JVM 内存配置 (服务器内存 >= 4G)
      SONAR_JAVA_OPTS: "-Xms2g -Xmx2g"
      SONAR_WEB_JAVA_OPTS: "-Xms1g -Xmx1g"
      SONAR_CE_JAVA_OPTS: "-Xms512m -Xmx1g"
      SONAR_ES_JAVA_OPTS: "-Xms512m -Xmx1g"
    ports:
      - "9000:9000" # Web 访问端口
    volumes:
      - ./sonarqube/data:/apps/data/sonarqube
      - ./sonarqube/logs:/apps/logs/sonarqube
      - ./sonarqube/extensions:/apps/extensions/sonarqube
    networks:
      - sonar-net

networks:
  sonar-net:
    driver: bridge

启动服务

markdown 复制代码
# 可以先尝试拉取镜像,拉取失败的情况下可以在自己本机安装的docker来拉取下,猜测可能是docker不兼容(Docker 20.10 在 CentOS 7 上有一个 BUG:
配置了 daemon.json 镜像加速,但是不生效!依然强制走官方 registry-1.docker.io)centos7?
docker pull postgres:15
docker pull sonarqube:lts-community

# 离线导入 或者推送到 harbor
docker save -o postgres_15.tar postgres:15
docker save -o sonarqube_lts-community.tar sonarqube:lts-community

docker load -i postgres_15.tar
docker load -i sonarqube_lts-community.tar

docker-compose up -d
# 查看日志
docker-compose logs -f sonarqube

2、登录页面

markdown 复制代码
# 默认9000端口
http://192.168.127.180:9000/
# 使用默认账号密码登录
admin/admin

3、生成服务token

markdown 复制代码
# 登录到 sonarqube 后台,点击头像 > MyAccount > Security > Generate Tokens > generate 生成 token 并复制

4、创建webhook

markdown 复制代码
# 点击顶部菜单栏的配置 > 配置(小三角) > 网络调用

Name:wolfcode-jenkins
URL:http://<sonar ip>:<sonar port>/sonarqube-webhook/

5、创建项目

markdown 复制代码
# SonarQube 顶部菜单栏 Projects > Create new project > 配置基础信息并保存 > Provide a token > Generate 生成 token > Continue

# 分别选择 Java / Maven 后,按照脚本配置 Jenkinsfile 中的 sonar 配置信息
mvn sonar:sonar -Dsonar.projectKey=k8s-cicd-demo

6、创建 gitlab 访问凭证

markdown 复制代码
系统管理 > 安全 > Manage Credentials > System > 全局凭据(unrestricted) > Add Credentials

范围:全局
用户名:root
密码:wolfcode
ID:gitlab-user-pass

待完善

``markdown

可以先尝试拉取镜像,拉取失败的情况下可以在自己本机安装的docker来拉取下,猜测可能是docker不兼容(Docker 20.10 在 CentOS 7 上有一个 BUG:

配置了 daemon.json 镜像加速,但是不生效!依然强制走官方 registry-1.docker.io)centos7?

docker pull postgres:15

docker pull sonarqube:lts-community

离线导入 或者推送到 harbor

docker save -o postgres_15.tar postgres:15

docker save -o sonarqube_lts-community.tar sonarqube:lts-community

docker load -i postgres_15.tar

docker load -i sonarqube_lts-community.tar

docker-compose up -d

查看日志

docker-compose logs -f sonarqube

复制代码
[外链图片转存中...(img-mJ438ADG-1782399280628)]

[外链图片转存中...(img-1X4OHUvr-1782399280628)]

### 2、登录页面

```markdown
# 默认9000端口
http://192.168.127.180:9000/
# 使用默认账号密码登录
admin/admin
```

[外链图片转存中...(img-wcpqhOF0-1782399280628)]

### 3、生成服务token

```markdown
# 登录到 sonarqube 后台,点击头像 > MyAccount > Security > Generate Tokens > generate 生成 token 并复制
```

### 4、创建webhook

```markdown
# 点击顶部菜单栏的配置 > 配置(小三角) > 网络调用

Name:wolfcode-jenkins
URL:http://<sonar ip>:<sonar port>/sonarqube-webhook/
```

### 5、创建项目

`````markdown
# SonarQube 顶部菜单栏 Projects > Create new project > 配置基础信息并保存 > Provide a token > Generate 生成 token > Continue

# 分别选择 Java / Maven 后,按照脚本配置 Jenkinsfile 中的 sonar 配置信息
mvn sonar:sonar -Dsonar.projectKey=k8s-cicd-demo

6、创建 gitlab 访问凭证

markdown 复制代码
系统管理 > 安全 > Manage Credentials > System > 全局凭据(unrestricted) > Add Credentials

范围:全局
用户名:root
密码:wolfcode
ID:gitlab-user-pass

待完善