使用阿里云函数计算实现 GitLab Webhook 钉钉推送
在 DevOps 流程中,及时的消息通知对于团队协作至关重要。虽然 GitLab 自带了一些集成,但往往难以满足个性化的通知需求。本文将介绍如何利用阿里云函数计算(FC)搭建一个轻量、低成本且高度可定制的 GitLab Webhook 转发服务,将代码提交、合并请求、Pipeline 状态等实时推送到钉钉群。
在 DevOps 流程中,及时的消息通知对于团队协作至关重要。虽然 GitLab 自带了一些集成,但往往难以满足个性化的通知需求。本文将介绍如何利用阿里云函数计算(FC)搭建一个轻量、低成本且高度可定制的 GitLab Webhook 转发服务,将代码提交、合并请求、Pipeline 状态等实时推送到钉钉群。
2025年国际邀请赛(TI14)作为DOTA2顶级赛事的第十四届盛会,于9月4日至14日在德国汉堡拉开帷幕。由Valve与PGL合作举办的本届赛事,不仅是TI系列首次重回汉堡,更在赛制层面迎来颠覆性变革——以瑞士轮赛制全面取代沿用十余年的传统小组赛,这一调整被官方定义为“回归竞技本质的战略优化”[1][2]。16支全球顶尖战队将通过“国际邀请赛之路”(9月4-7日)与“国际邀请赛”(9月11-14日)两个阶段的角逐,争夺基础奖金池160万美元及众筹后预计超200万美元的总奖金[3]。这一改革的背后,是Valve对往届赛事体系深层矛盾的系统性回应。
长期以来,TI系列赛事的小组赛阶段饱受争议。传统循环赛制下,“算分放水”现象屡见不鲜——尤其在小组赛最后一天,已确定出线或淘汰的队伍往往缺乏竞争动力,导致比赛观赏性大幅下降[4]。更严重的是,强弱队伍过早相遇时常造成悬殊比分(如往届出现的1-9碾压局),这类“垃圾时间”不仅消耗观众耐心,更削弱了比赛结果对晋级命运的实质影响[5]。TI13赛季爆发的赛制争议进一步暴露了循环赛的缺陷:部分场次因“仅与场外队伍积分相关”而丧失竞技意义,引发战队与观众对公平性的质疑[6]。
在安装docker环境后 mpi 多机并行环境运行程序失效,mpi 程序拉起后无后续执行的信息,导致进程卡住
export I_MPI_DEBUG=5export I_MPI_HYDRA_DEBUG=on可以看到输出如下启动时的网卡信息输出后卡住:
1 | [0] MPI startup(): ===== NIC pinning on ubuntu04 ===== |
默认的gcc版本是4.8.5,无法编译高版本的glibc 2.28,需要升级到gcc 8以上的版本
1 | yum -y install centos-release-scl |
注意:make 的版本高于4.4 会造成 glibc 编译时卡在这一行
make[2]: Entering directory '/root/glibc-2.28/stdio-common
所以安装 make 4.2 的版本即可
1 | wget http://ftp.gnu.org/pub/gnu/make/make-4.2.tar.gz |
1 | wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz |
查询是否升级成功:
strings /lib64/libc.so.6 | grep GLIBC
安装:pip install python-jenkins
1 | import python-jenkins |
1 | server = jenkins.Jenkins('https://jenkins.domain.com/',username='username', password='password',timeout =5) |
1 | jobs = server.get_jobs(view_name="my view") |
1 | for job in jobs: |
安装:pip install pandas
1 | import pandas as pd |
1 | def read_csv_file(csv): |
subprocess 模块主要用于创建子进程,并连接它们的输入、输出和错误管道,获取它们的返回状态,在某种特殊情况下,我们需要对子进程的运行时间做限制,当超时时强制终止并获取输出。
subprocess 模块首先推荐使用的是它的 run 方法,更高级的用法是使用 Popen。
Popen 方法语法格式如下:
1 | subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=False, startupinfo=None, creationflags=0,restore_signals=True, start_new_session=False, pass_fds=(),*, encoding=None, errors=None) |
常用参数:
1 | import datetime |
如下 Shell 脚本:
1 | #!/bin/bash |
在 Jenkins 中执行此脚本时,通过 Shell 调用了 Python 脚本,当 Python 脚本内部异常退出例如遇到 sys.exit(1001),导致异常退出码无法抓取。
这是由于 Jenkins 在执行 shell 脚本时,默认会在命令行中加上 -e 选项,该选项的作用是在脚本中遇到错误时会立即退出。这样可以确保在脚本发生错误时及时停止执行,避免继续执行可能导致更严重问题的命令。
在 Shell 脚本前手动添加
set +e来禁用该选项。即可继续执行后续命令。
PS:Jenkins 在执行 shell 脚本时,默认会在命令行中加上 -xe 选项, 该选项的作用是在脚本运行时打印每一行命令以及运行中遇到错误时会立即退出。这样可以确保在脚本发生错误立即中断。
1 | def get_log_file(log_dir): |
1 | def get_log_file(rootdir): |
改动
if file.endswith(".log")可查找任意后缀的文件。