我们拥有一个Github组织,其中包含数百个由贡献者编写的存储库。我们想设置一个Jenkins服务器,该服务器对Github组织中任何存储库中的每个提交执行某些标准任务。预期的CI流程非常简单:
myorg/foobar
的更改myorg
的Github组织范围内的Webhook调用了Jenkins服务器myorg/foobar
执行任务我是Jenkins的新手,我完全不知道需要设置哪种插件或作业类型。
我尝试为我的Github组织创建一个Jenkins“ GitHub组织”,但它只是告诉我“此文件夹为空,没有找到包含可构建项目的存储库” 。我也不清楚在哪里必须配置github组织的webhook。
我们不想为所有存储库设置单独的job / jenkinsfiles / webhook,而只是使用为每个存储库中的任何提交运行的标准脚本,并通过单个gh组织的webhook触发它。这可能吗?
答案 0 :(得分:0)
您在这里有多个要求。让我们一一讲解。
a)Jenkins GitHub组织:这将扫描您的所有GitHub组织,并创建构建存储库所需的任意数量的作业,因为在Jenkins上仅执行一项工作不是标准。基本上,您丢失了历史数据(Jenkins不知道它在每次迭代中都会构建不同的东西)。它在帮助中说“扫描GitHub组织(或用户帐户)以查找与某些已定义标记匹配的所有存储库。”
b)尝试将Jenkins视为自动化器,而不是将托管所有构建/部署逻辑的东西。我要做的是创建“ build.sh”,“ deploy.sh”等文件。这样,我可以直接从Shell构建和部署。因此,只有在此之后,我才为Jenkins创建脚本,无论它们实际做什么,都只调用构建/部署脚本。詹金斯不需要知道。副作用是所有项目“都可以以相同的方式构建”,无论它们是NodeJS,Python还是其他任何东西。当然,在某些情况下,您可能需要额外的依赖关系,而Docker确实可以在这里提供帮助。
c)我过去做过类似的事情,工作少于存储库/分支/拉取请求。 Jenkins是一种转储,一些插件可以在这里提供帮助。但是在您的情况下,如果您确实想要一份工作,则只需要一份常规的参数化工作即可。诀窍是,您的Github Organization全球网络挂钩不会指向Jenkins。它需要指向其他地方,您需要维护一些代码。该代码可以解析Github有效负载,对其进行分析,最终可以回调GitHub(“是否对该分支有拉取请求?不?然后忘记它”)以增强其决策树,最后,触发该作业Jenkins具有您能够捕获的所有参数。这些参数将告诉单个作业要克隆的存储库,要部署到的环境,就是这样。您已经知道脚本名称,因为它们是标准名称。
d)就是说,我会问...您需要詹金斯吗?这个解析器小软件真的可以克隆您的存储库,并在Docker容器中运行一些脚本吗?里面有每个依赖项的builder-docker-container吗?
e)关于“回聊”到GitHub,我使用Python做到了。有GitHub库,因此我能够从Jenkins那里得到一些东西,并进行API发布以向GitHub提供构建状态。由于我实际上是在使用Jenkins实例,因此我的工具是中间人经纪人。对于您来说,对于一项工作,Docker容器将很好地发挥作用。
希望这有助于以不同的角度来看。
如果您实际上想使用Jenkins实例,那么我在这里所说的大部分内容仍然可以使用。
答案 1 :(得分:0)
我不确定这个答案有多少会帮助您,但是即使它提供了对Jenkins管道的一些见解,我也很高兴。
我正在详细说明使用 Jenkins管道的过程,如果现在不是某个时候,您需要将构建和部署作为代码部署到基础设施管道
从Jenkins插件开始,以下是强制性插件,用于我将在此处说明的过程:
Jenkins配置
Github organization
:Owner
应该是您的Organization
,其中有数百个存储库可用。还,配置什么文件和分支内容以查看存储库以触发构建。 script path
是执行仓库的步骤(可能是构建和部署)的文件。因此,只有在存储库中有此名称的文件可用时,才会检测所有存储库或将其显示在Jenkins中。
Jenkins按照此处提到的间隔扫描配置的组织。它会检测任何回购协议的添加/删除并进行提交。可以根据需要配置要存储的内部版本数。
Git存储库/组织配置
在github中配置webhooks
配置事件,这些事件需要通知詹金斯。
通过启用适当的检查PR的分支保护和状态检查
保护分支,将有助于通过状态检查后限制几组人的提交。这有助于保持良好的代码质量。
以下是快照,其中显示了PR升高时状态检查状态。基于此,审阅者将能够决定批准PR。
此链接详细说明了我在这里描述的过程。
https://github.com/gitbucket/gitbucket/wiki/Setup-Jenkins-Multibranch-Pipeline-and-Organization
答案 2 :(得分:0)
假设您的Jenkins运行在Linux或MacOS或支持Shell脚本命令的Windows中,请配置Jenkins作业以执行以下脚本。不要忘记替换用户和密码字段并阅读注释行,以了解和改进它。
curl -i -u "user":"password" "https://github.com/your_organization" | grep "codeRepository" | awk -F '"' '{print $8}' | while read line; do
mkdir "_temp_repo"
cd "_temp_repo"
# `--depth=1` clones the last commit only improving the speed of the clone
# if you want to clone a specific branch add `-b branch` to the command below
git clone --depth=1 "https://github.com"$line .
# execute here your peding commands...
git add .
git commit -am "[pending] XPTO..."
git push
# execute here your success/failure commands...
git add .
git commit -am "[success/failure] XPTO..."
git push
cd ..
rm -rfv "_temp_repo"
done
我建议创建一个SH文件并以详细模式执行:sh -x ./my_script.sh
。
为了对每个新更新执行此操作,请为此任务设置一个Github Webhook。
答案 3 :(得分:0)
标准方法是创建一个新的多分支管道,以扫描组织中的新存储库。每个存储库都应有一个jenkinsfile
及其构建说明。但总的来说,也可以通过编程方式实现您正在尝试的目标。
我的做法是:
我会使用Folders Plugin为此类作业创建一个文件夹。
如果这是您真正想做的,我可以进一步阐述。
答案 4 :(得分:0)
回答我自己的问题:
正如几个人指出的那样,詹金斯假设每个存储库都有一份工作。 Github Organization插件不能很好地工作,因为它笨拙,需要您为每个存储库提交并维护一个Jenkinsfile
,这正是我要避免的。
我不了解的关键信息是Jenkins具有出色的CLI和REST api来控制作业,并且单个作业配置可以轻松导出为简单的xml文件。
所以我要做的是通过Jenkins GUI为其中一个存储库设置Jenkins作业。然后,我编写了一个简单的REST客户端,该客户端下载了此作业的config.xml
,并为Github组织中的每个存储库创建或更新了Jenkins作业。
如果URL与任何存储库的URL匹配,则该构建会自动由Github(组织范围内)的Webhook触发。不需要特殊的Github Organization插件。