找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2543

积分

1

好友

349

主题
发表于 15 小时前 | 查看: 0| 回复: 0

如何高效响应用户请求,同时又不占用过多个人时间?方法有很多。

本着能将流程自动化、就不手动处理的原则,本文将采用 “GitLab webhook触发构建” 方案,实现一个轻量级的远程运维或任务执行闭环。整个流程如下:

  1. 用户通过 Git 向 GitLab 代码库提交一个包含特定操作指令的文件。
  2. GitLab 通过配置好的 Webhook 自动通知 Jenkins 开始构建。
  3. Jenkins 拉取代码,读取指令文件并执行预设的脚本。
  4. 最后,Jenkins 将执行结果和日志推送回同一个代码库的另一个分支,方便发起者查询,形成完整闭环。

这种基于 GitLab webhook触发构建 的方式,非常适合作为远程运维或自动化任务执行的一种补充手段。

一、部署Jenkins运行环境

1、在宿主机创建用户和目录并授权

由于 Jenkins 容器默认以 jenkins 用户(uid=1000,gid=1000)运行,我们需要先在宿主机创建对应的用户和目录。

mkdir /opt/jenkins
cd /opt/jenkins

# 创建与容器内对应的 jenkins 用户和组
groupadd -g1000 jenkins
useradd -u1000 -g1000 -s /sbin/nologin jenkins

# 创建Jenkins的数据存储目录
mkdir data
# 将目录所有者改为 jenkins,确保容器有写入权限
chown -R jenkins:jenkins data

# 获取宿主机 `docker` 组的 GID,供后续 Compose 配置使用
getent group docker | cut -d: -f3
# 输出示例:993

2、创建Jenkins的compose.yaml文件

为了让 Jenkins 容器内能调用宿主机的 Docker 服务(用于在构建中创建镜像或容器),我们需要将 Docker 守护进程的套接字挂载到容器内,并通过 group_add 参数赋予容器访问权限。

cat > compose.yaml <<EOF
services:
  jenkins-lts:
    stdin_open: true
    tty: true
    ports:
      - 8588:8080
      - 10241:50000
    container_name: jenkins
    environment:
      - TZ=Asia/Shanghai
    privileged: true
    group_add:
      -  993  # 替换为上一步获取的宿主机docker组的GID
    volumes:
      - ./data:/var/jenkins_home
      # 挂载宿主机的docker套接字到容器内
      - /var/run/docker.sock:/var/run/docker.sock
    restart: always
    image: jenkins/jenkins:2.528.3-lts-jdk21
networks: {}
EOF

3、启动Jenkins容器

使用 Docker Compose 启动 Jenkins 服务。

# 启动容器
docker compose up -d

# 检查容器状态
docker compose ps

Docker Compose查看Jenkins服务状态

4、查看Jenkins的初始密码并登录

容器启动后,查看日志获取初始管理员密码,然后通过浏览器访问 http://<你的服务器IP>:8588

# 查看初始密码
docker compose logs jenkins-lts

Jenkins容器启动日志

二、Jenkins基本配置

1、初次登录Jenkins

访问 Jenkins 网址,将日志中显示的初始管理员密码粘贴到解锁页面。

Jenkins解锁页面

2、安装推荐的插件

接下来会进入插件安装界面。如果网络环境导致页面显示“离线”,你有两个选择:

  • 配置代理:可以批量安装所有推荐插件。
  • 跳过插件安装:稍后手动安装所需插件。除了可能提示连接问题,手动安装通常也能顺利进行。

Jenkins离线提示页面

如果需要,可以在此界面配置 HTTP 代理。

Jenkins HTTP代理配置界面

务必记得后续要安装 “Localization: Chinese (Simplified)”、“Docker plugin” 和 “GitLab Plugin” 这三个关键插件。

选择Jenkins插件安装方式

3、创建管理员账户并进入管理界面

按照向导创建第一个管理员用户,完成后即可进入 Jenkins 主界面。

Jenkins管理主界面

4、设置界面为中文

首先安装 “Localization: Chinese (Simplified)” 插件。安装完成后,进入 系统管理 -> 系统配置,找到“主题”和“默认语言”选项进行设置,强制所有用户使用中文界面。

Jenkins外观与语言设置

5、配置Docker插件

为了在构建任务中使用 Docker 功能,需要先安装 “Docker plugin”。安装后,进入 系统管理 -> 系统配置,找到“云”区域,添加一个 Docker 云配置。其中,“Docker Host URI” 填写 unix:///var/run/docker.sock

在Jenkins中配置Docker Cloud

6、进入Jenkins容器内生成SSH密钥对

为了让 Jenkins 能够通过 SSH 协议拉取 GitLab 上的私有代码库,需要在容器内生成 SSH 密钥对。

# 进入Jenkins容器
docker compose exec jenkins-lts bash

# 生成 ED25519 算法的SSH密钥对(在容器内执行)
ssh-keygen -t ed25519
# 连续按回车,使用默认路径和无密码

7、将私钥添加到Jenkins凭证中

将上一步生成的私钥(/root/.ssh/id_ed25519 文件内容)添加到 Jenkins 的全局凭证中。

  1. 进入 系统管理 -> 管理凭证
  2. 在“系统”域下,点击“全局凭证”。
  3. 添加一个“SSH Username with private key”类型的凭证。
  4. Username 填写 git(这是 Git 服务的默认用户)。
  5. 将私钥内容粘贴到“Private Key”区域。

在Jenkins中添加SSH私钥凭证

注意:同时需要将公钥(id_ed25519.pub 文件内容)添加到你的 GitLab 账户的 SSH Keys 设置中。

三、Jenkins作业创建与配置

现在,我们来创建一个通过 GitLab Webhook 触发的自动化构建作业。如果你在配置CI/CD或自动化流水线时遇到问题,可以参考 云栈社区 运维板块中的相关讨论。

1、配置源码管理

创建一个“自由风格”的软件项目,命名为 mytest

在“源码管理”部分,选择 Git

  • Repository URL: 填写你的 GitLab 项目 SSH 地址,例如 ssh://git@your-gitlab-server:port/group/project.git
  • Credentials: 选择上一步创建的包含私钥的凭证。
  • Branches to build: 指定分支为 */main

配置Jenkins作业的Git源码管理

2、配置构建触发器

在“构建触发器”部分,勾选 Build when a change is pushed to GitLab

  • 记录下生成的 GitLab webhook URL,后续需要在 GitLab 项目中配置。
  • 其他选项如“Push Events”等可保持默认。

配置GitLab Webhook触发器

3、配置触发器高级选项

展开“构建触发器”部分的高级选项。

  • 记录下 Secret token 的值,同样需要在 GitLab 的 Webhook 配置中填写,用于安全验证。
  • 其他高级选项可根据需要保持默认。

GitLab触发器高级选项与Secret Token

4、配置构建环境

在“构建环境”部分,勾选 Delete workspace before build starts。这样可以在每次构建前清空工作区,避免旧文件干扰,让每次构建都在一个干净的环境中进行。这类环境清理和配置管理的技巧,在 运维/DevOps/SRE 实践中非常重要。

构建环境设置:构建前删除工作区

5、添加构建步骤(执行指令)

我们的流程核心是:拉取代码 -> 读取指令 -> 执行脚本。因此,需要增加一个“Execute shell”构建步骤。

此步骤的脚本会从代码库中名为 code.txt 的文件读取指令并执行,然后将执行结果输出到日志和一个临时结果文件中。

第一个Shell构建步骤:读取并执行指令

示例脚本:

#!/bin/bash
set -e  # 执行出错立即终止

echo "$(date +%Y%m%d%H%M%S) Fail." > /tmp/result.txt
echo "### 开始执行指令..."
cat code.txt && echo "$(date +%Y%m%d%H%M%S) Success." >  /tmp/result.txt
echo "### 指令执行结束 ###"

6、添加构建步骤(回传结果)

为了实现闭环,我们需要增加第二个“Execute shell”步骤,将上一步生成的结果文件推送回 GitLab 仓库的另一个分支(例如 result 分支),方便任务发起者查看。

此步骤涉及 Git 操作,是自动化流程中与版本控制系统集成的典型场景,你可以在 云原生/IaaS 相关话题中找到更多关于容器化应用与Git集成的思路。

第二个Shell构建步骤:提交结果到Git

示例脚本:

#!/bin/bash
set -e

# 配置Git用户信息(Jenkins默认可能无配置,否则提交会失败)
git config --global user.name "Jenkins Bot"
git config --global user.email "jenkins@your-server.com"

# 同步远程分支信息
git fetch origin

# 切换到result分支(本地无则创建,本地有则重置为远程最新版本)
git checkout -B result origin/result

# 将上一步生成的result文件移动到当前目录
mv /tmp/result.txt ./

# 提交并推送变更文件
git add result.txt
git commit -m "Jenkins自动提交执行结果:$(date +%Y%m%d%H%M%S)"
git push origin result

至此,Jenkins 上关于 GitLab webhook触发构建 的作业配置已基本完成。接下来,你需要在 GitLab 对应的项目中配置 Webhook,将步骤2和步骤3中记录的 URL 与 Secret Token 填入,即可将整个自动化流程串联起来。




上一篇:Chrome 145垂直标签页功能深度解析:一个Flag实验功能如何影响浏览器竞争格局
下一篇:深入理解Java equals和hashCode:为什么必须成对重写?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-18 16:46 , Processed in 0.231658 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表