Gitee push自动触发Jenkins测试

news/2024/11/17 14:26:25/文章来源:https://www.cnblogs.com/EndPoem-ZH/p/18550513
# Gitee push自动触发Jenkins测试

可以实现每次提交代码(git pull, Pull Request)后自动构建、测试(需要仓库管理者配置Gitee Webhook)。

## 1 配置方法

简单来说:

1. 为一台服务器配置HTTP公网地址,实现内网穿透(如用花生壳做网页映射)
2. 在目标服务器上,安装并配置Jenkins,并配置对应的Gitee以及Generic Webhook Trigger插件。
3. 创建对应的Jenkins Item, 写自动化shell脚本。
4. 在Gitee为目标仓库配置Webhook,指向目标服务器的Jenkins。
5. 每次执行`git push`命令,就会触发Jenkins自动构建&测试,生成日志。也可手动或定时触发。

### 1.1 配置公网地址
通过FRP等方式实现。
Dashboard - Manage Jenkins - System - Jenkins Location,将Jenkins URL改为公网地址。

### 1.2 配置Jenkins

**安装插件** :Dashboard - Manage Jenkins - System Configuration - Plugins - Available plugins,搜索Gitee和Generic Webhook Trigger并安装。

**在Gitee中创建新令牌:** Dashboard - Manage Jenkins - Credentials,添加Gitee APIV5 私人令牌。

**创建Jenkins Item:**

- General
  - Gitee 链接 : Gitee
- 源码管理 : Git
  - Repository URL : `https://gitee.com/<仓库地址>.git`
- 构建触发器
  - 选中Gitee webhook 触发构建
    - Gitee WebHook 密码 : 点“生成”按钮生成一串密码
  - 选中Generic Webhook Trigger
    - Token: 输入token
- Build Steps: 编写测试脚本,见下一节。

### 1.3 编写测试脚本

> 注:笔者要运行2个进程(./server和./client),其中./server需要持续运行直到./client运行结束,但实测由于未知原因,server启动后立即退出,创建的server进程号无法追踪到。下面的脚本使用了supervisor(事先已在机器上配置,见1.4节),保证server启动后持续运行。脚本示例:
```sh
#!/bin/bash

# Show current time, user & path
whoami
pwd

# Checkout and update repository
git checkout master
git pull
git submodule update --init

# Clean and build
make clean
make

# Set log file path
rm -f *.log
now=$(date +"%Y-%m-%d-%H:%M:%S")
echo $now
LOG_FILE="$now.log"

# Define client exec path
CLIENT_EXEC="./voter_client"

# 1. Run server
echo "Starting server..." | tee -a $LOG_FILE
sudo supervisorctl start como_fscp_voter
sleep 1

# 2. Run client
echo "Starting client..." | tee -a $LOG_FILE
$CLIENT_EXEC -t 127.0.0.1 7711 -d
sleep 1

# 3. Terminate server
echo "Terminating server..." | tee -a $LOG_FILE
sudo supervisorctl stop como_fscp_voter

# Read & print logs
echo "--------------------------------"
echo "$LOG_FILE content:"
cat "$LOG_FILE"

# Read & print syslog (if necessary)
# echo "Syslog content:"
# cat /var/log/syslog
```

### 1.4 supervisor配置

参考链接:[Ubuntu 安装和使用 Supervisor(进程管理)](https://www.cnblogs.com/xishuai/p/ubuntu-install-supervisor.html)

```sh
# 安装supervisor
sudo apt install supervisor
# 创建待运行应用的配置文件
sudo vim /etc/supervisor/conf.d/como_fscp_voter.conf
```

以笔者需构建的项目como-fscp-voter为例,写入下列配置,注意自定义directory, command(需为绝对路径)和stdout_logfile(该文件必须事先存在):
```sh
[program:voter]
directory=//var/lib/jenkins/workspace/gitee_task
command=/var/lib/jenkins/workspace/gitee_task/como_fscp_voter
autostart=true
autorestart=true
startretries=10
redirect_stderr=true
stdout_logfile=/var/lib/jenkins/workspace/gitee_task/voter.log
environment=ASPNETCORE_ENVIRONMENT="Development"
```
解释:当按照1.3节创建Jenkins任务(gitee_task)后,该路径(`/var/lib/jenkins/workspace/gitee_task/`)即所填Gitee仓库(como-fscp-voter)的根目录。

手动测试时,需要先创建.log文件:
```sh
sudo touch /var/lib/jenkins/workspace/gitee_task/voter.log
```
自动执行时,1.3节脚本(`LOG_FILE="voter.log"`)已经在每次运行前保证了log文件存在。

运行supervisor,并可运行supervisorctl进行控制:
```sh
sudo supervisord

sudo supervisorctl # 进入supervisorctl环境
  reread           # 重新加载配置
  update           # 更新配置
  start all        # 开始所有配置
  status           # 查看状态
# 成功运行:
    como_fscp_voter   RUNNING   pid 2126469, uptime 0:01:04
```
在shell中可直接执行`sudo supervisorctl start como_fscp_voter`启动(而无需进入supervisorctl环境)。

### 1.5 在Gitee为目标仓库配置Webhook

打开Gitee目标仓库页面 - 管理 - (下滑找到)Webhooks - 添加WebHook:

URL: `https://<公网IP[:端口]>/generic-webhook-trigger/invoke?token=<Generic Webhook trigger生成的token>>`

Webbook密码:`在Jenkins创建任务时生成的Webhook密码`

选择事件:`Push(默认)`, `Pull Request(可选)`

按更新按钮,若请求历史一栏显示Response值为200,说明配置成功。

## 2 测试

### 2.1 测试方法

正确配置后,可通过如下方式触发构建:
1. Gitee触发。如git push(最常用)或Pull Request;
2. Jenkins手动或定时触发。

Gitee有测试Webhook是否配置成功的模块,向Jenkins所在服务器发送HTTP请求,但据传有bug([参考链接](https://blog.csdn.net/weixin_58887621/article/details/135242286))。我们可以编写一个发送HTTP请求的Python程序,按照链接改正Headers,以模拟Gitee的git push或Pull Request事件。示例如下:
```python
import requests

# 定义URL
url = 'https://<Jenkins服务器的公网IP>/gitee-project/gitee_task'

# 设置headers
headers = {
    'X-Gitee-Token': '<Your Token>',
    'X-Gitee-Event': 'Push Hook',
    'User-Agent': 'git-oschina-hook',
    'X-Gitee-Timestamp': 'time',
    'X-Gitee-Ping': 'true',
    'Content-Type': 'application/json',
    'X-Git-Oschina-Event': 'Push Hook'
}

# 设置payload (具体在Gitee Webhook上查看)
payload = {...}

# 发送POST请求
response = requests.post(url, headers=headers, json=payload)

# 打印响应内容
print(f"Status Code: {response.status_code}")
print(f"Response Content: {response.text}")
```
若返回状态码200,表示配置成功:
```sh
Status Code: 200
Response Content: push_hooks ref = refs/heads/test_version commit sha = ad2f7b...f242a8 has been accepted.
```

### 2.2 输出示例

运行1.3节所述脚本,即可正常运行,某次测试的Jenkins控制台输出如下:
```sh
Started by user admin
Running as SYSTEM
Building in workspace /var/lib/jenkins/workspace/gitee_task
The recommended git tool is: NONE
No credentials specified
 > git rev-parse --resolve-git-dir /var/lib/jenkins/workspace/gitee_task/.git # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url https://gitee.com/tjopenlab/como-fscp-voter.git # timeout=10
Fetching upstream changes from https://gitee.com/tjopenlab/como-fscp-voter.git
 > git --version # timeout=10
 > git --version # 'git version 2.34.1'
 > git fetch --tags --force --progress -- https://gitee.com/tjopenlab/como-fscp-voter.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
Checking out Revision f352e32...a11038e1a0b3d00 (refs/remotes/origin/master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f f352e32...a11038e1a0b3d00 # timeout=10
Commit message: "Add debugging options"
 > git rev-list --no-walk f352e32...a11038e1a0b3d00 # timeout=10
[gitee_task] $ /bin/bash /tmp/jenkins5491866742155348232.sh
jenkins
/var/lib/jenkins/workspace/gitee_task
切换到分支 'master'
您的分支与上游分支 'origin/master' 一致。
已经是最新的。
rm -f como_fscp_voter
rm -f voter_client
rm -f voter_client_tcp_1
gcc -I./libzmtp/include -I./libcrc -I./inih -I./src -I./rudp src/como_fscp_voter.c src/config.c src/voter_server.c src/voterlib.c src/math_utils.c src/proc_utils.c src/voter_message.c libcrc/crc32.c inih/ini.c src/ZMQ_Switcher.c src/voter_logger.c rudp/rudp.c ./libzmtp/src/MemPool.c ./libzmtp/src/zmtp_channel.c ./libzmtp/src/zmtp_dealer.c ./libzmtp/src/zmtp_endpoint.c ./libzmtp/src/zmtp_ipc_endpoint.c ./libzmtp/src/zmtp_msg.c ./libzmtp/src/zmtp_tcp_endpoint.c -o como_fscp_voter -O0 -Wall -W -lpthread -g
gcc -I./libzmtp/include -I./libcrc -I./inih -I./src -I./rudp libcrc/crc32.c src/voter_message.c src/ZMQ_Switcher.c src/voterlib.c src/voter_logger.c clients/voter_client.c rudp/rudp.c ./libzmtp/src/MemPool.c ./libzmtp/src/zmtp_channel.c ./libzmtp/src/zmtp_dealer.c ./libzmtp/src/zmtp_endpoint.c ./libzmtp/src/zmtp_ipc_endpoint.c ./libzmtp/src/zmtp_msg.c ./libzmtp/src/zmtp_tcp_endpoint.c -o voter_client -O0 -Wall -W -lpthread -g
gcc -I./libzmtp/include -I./libcrc -I./inih -I./src -I./rudp libcrc/crc32.c src/voter_message.c src/ZMQ_Switcher.c src/voterlib.c src/voter_logger.c clients/voter_client_tcp_1.c rudp/rudp.c ./libzmtp/src/MemPool.c ./libzmtp/src/zmtp_channel.c ./libzmtp/src/zmtp_dealer.c ./libzmtp/src/zmtp_endpoint.c ./libzmtp/src/zmtp_ipc_endpoint.c ./libzmtp/src/zmtp_msg.c ./libzmtp/src/zmtp_tcp_endpoint.c -o voter_client_tcp_1 -O0 -Wall -W -lpthread -g
2024-11-15-09:17:55
Starting server...
como_fscp_voter: started
Starting client...
Terminating server...
como_fscp_voter: stopped
--------------------------------
2024-11-15-09:17:55.log content:
Starting server...
Starting client...
Terminating server...
Finished: SUCCESS
```

### 参考链接

[Jenkins + Gitee 实现代码自动化构建 - 腾讯云](https://cloud.tencent.com/developer/article/2024230)
[Jenkins - 一篇就能上手 Gitee代码自动化构建 - 阿里云](https://developer.aliyun.com/article/947111)
[Generic Webhook Trigger - Jenkins.io](https://plugins.jenkins.io/generic-webhook-trigger/)

Gitee Webhook存在404问题,使用Generic Webhook([jenkins使用gitee插件自动部署webhook404问题记录 - CSDN](https://blog.csdn.net/qq_44980517/article/details/134060461))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835320.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QObject,QMainWindpw,QWidget,QDialog介绍

QObject QObject 的角色和特点 在 Qt 框架中,QObject 是整个对象模型的核心基类,它为 Qt 对象树 和 信号-槽机制 提供了基础支持。很多 Qt 的类(包括 QWidget、QDialog、QMainWindow)都直接或间接继承自 QObject。 QObject 的核心功能对象树管理(Object Tree)QObject 提供…

2024-2025-1 20241329 《计算机基础与程序设计》第八周学习总结

作业信息 作业归属课程:https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP 作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK08 作业目标:功能设计与面向对象设计;面向对象设计过程;面向对象语言三要素;汇编、编译、解释、执行 作业正文:https://www…

Alpha冲刺(4/14)——2024.11.15

目录一、团队成员分工与进度二、成员任务问题及处理方式三、冲刺会议内容记录会议内容四、GitHub签入记录及项目运行截图GitHub签入记录五、项目开发进展及燃尽图项目开发进展燃尽图六、团队成员贡献表 一、团队成员分工与进度成员 完成的任务 完成的任务时长 剩余时间施靖杰 完…

高三鲜花 #2

水发现放假之后其实连鲜花都是不想写的了。 所以这是钓鱼博。 也不能钓这么直接,还是需要写一点东西的。 应该是马上就距离高考还剩 200 天了。然后这里本来写了很多关于 whk 的文本,全删了,觉得有点无意义,毕竟这应该是一篇钓鱼博。 whk 真难。 突然发现我已经退役四个月了…

语文成绩

语文成绩(https://www.luogu.com.cn/record/189365158) 题目描述 语文老师总是写错成绩,所以当她修改成绩的时候,总是累得不行。她总是要一遍遍地给某些同学增加分数,又要注意最低分是多少。你能帮帮她吗? 输入格式 第一行有两个整数 n,p,代表学生数与增加分数的次数。…

「LUCKY STUN穿透」使用Cloudflare的页面规则固定和隐藏网页端口

关于本教程 索引 │ ├─关于本教程 │ ├─在STUN穿透环境中使用WEB服务 │ ├─动态端口带来的麻烦 │ ├─“隐藏端口”和固定端口 │ └─可用的解决方法 │ ├─使用邮件进行通知端口变化 │ └─使用HTTP重定向 │ ├─网络环境优化和STUN穿透规则设…

平板电视食用教程

先来看一道大家基本都能默写出来的题目: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:插入一个数 \(x\)。 删除一个数 \(x\)(若有多个相同的数,应只删除一个)。 定义排名为比当前数小的数的个数 \(+1\)。查询 \(x\) 的排名。 查询数据结…

企业集成模式-第十二章

十二、中场演练:系统管理示例管理控制台:显式所有组件的工作状态(下图一) 贷款中介的服务质量:监视请求响应时间 验证信用机构的操作:周期性地发送测试消息,希望确信该服务在正常运行(下图二) 信仰机构的故障恢复:如果信仰机构出现故障,希望把信用请求消息临时重定向…

平板电视从入门到精通

先来看一道大家基本都能默写出来的题目: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:插入一个数 \(x\)。 删除一个数 \(x\)(若有多个相同的数,应只删除一个)。 定义排名为比当前数小的数的个数 \(+1\)。查询 \(x\) 的排名。 查询数据结…

人月神话-摘抄

由于人员的分工,大型编程项目碰到的管理问题和小项目区别很大:我相信关键需要是维持产品自身的概念完整性。 1. 焦油坑(the tar pit) 过去几十年的大型系统开发犹如这样一个焦油坑,很多大型和强壮的动物在其中剧烈地挣扎。他们中大多数开发出了可运行的系统-不过,其中只有非…

Manjaro/Arch用怎么安装天翼云电脑(Ctyun-cloud-desk)?感谢信创,感谢国家

最近微信出了linux版,用vmware装linux不过瘾,把一台闲置的笔记本装上了Manjaro KDE Plasma,经过一段时间的发展,Linux桌面可用性大大提高。 Kindle->Kindle Mate->Anki这条路在linux下 我用 Kindle ->KindleVocab ->Anki这么代替了之后, 其他软件都能凑合用,…

Prometheus 和 Grafana 监控系统搭建

Prometheus 和 Grafana 监控系统的搭建和配置。Author: ACatSmiling Since: 2024-11-11Prometheus 的架构架构理解:Prometheus 既然设计为一个维度存储模型,可以把它理解为一个 OLAP 系统。 生态圈组件:Prometheus Server:主服务器,负责收集和存储时间序列数据。 Client L…