Github组织中所有存储库的单一詹金斯工作

时间:2019-05-03 15:09:51

标签: git jenkins

我们拥有一个Github组织,其中包含数百个由贡献者编写的存储库。我们想设置一个Jenkins服务器,该服务器对Github组织中任何存储库中的每个提交执行某些标准任务。预期的CI流程非常简单:

  1. 用户提交了对仓库myorg/foobar的更改
  2. myorg的Github组织范围内的Webhook调用了Jenkins服务器
  3. Jenkins运行docker命令为myorg/foobar执行任务
  4. Jenkins将提交状态设置为待处理,包括指向命令进度输出的链接
  5. 完成后,詹金斯(Jenkins)将最终提交状态更新为成功失败

我是Jenkins的新手,我完全不知道需要设置哪种插件或作业类型。

我尝试为我的Github组织创建一个Jenkins“ GitHub组织”,但它只是告诉我“此文件夹为空,没有找到包含可构建项目的存储库” 。我也不清楚在哪里必须配置github组织的webhook。

我们不想为所有存储库设置单独的job / jenkinsfiles / webhook,而只是使用为每个存储库中的任何提交运行的标准脚本,并通过单个gh组织的webhook触发它。这可能吗?

5 个答案:

答案 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插件开始,以下是强制性插件,用于我将在此处说明的过程:

  • Github组织-用于扫描具有多个存储库的组织
  • 多分支管道-用于自动为仓库中的所有分支/ PR创建管道。这有助于验证功能分支和PR更改。
  

Jenkins配置

  1. 通过以下选项创建Github organization

enter image description here

  1. 从上述步骤配置新创建的组织。 Owner应该是您的Organization,其中有数百个存储库可用。

enter image description here

还,配置什么文件和分支内容以查看存储库以触发构建。 script path是执行仓库的步骤(可能是构建和部署)的文件。因此,只有在存储库中有此名称的文件可用时,才会检测所有存储库或将其显示在Jenkins中。

enter image description here

Jenkins按照此处提到的间隔扫描配置的组织。它会检测任何回购协议的添加/删除并进行提交。可以根据需要配置要存储的内部版本数。

enter image description here

  

Git存储库/组织配置

在github中配置webhooks

enter image description here

enter image description here

配置事件,这些事件需要通知詹金斯

enter image description here

  

PR的分支保护和状态检查

通过启用适当的检查

保护分支,将有助于通过状态检查后限制几组人的提交。这有助于保持良好的代码质量。

enter image description here

enter image description here

以下是快照,其中显示了PR升高时状态检查状态。基于此,审阅者将能够决定批准PR。

enter image description here

此链接详细说明了我在这里描述的过程。

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及其构建说明。但总的来说,也可以通过编程方式实现您正在尝试的目标。

我的做法是:

  1. 将作业模板创建为config.xml(运行docker来检查某些东西的shell脚本)
  2. 扫描GitHub以查找新的存储库
  3. 基于模板创建一个新的詹金斯工作(理想情况下,只需将SCM链接替换为新位置)即可How-to-create-a-job-using-the-REST-API-and-cURL
  4. 完成这项工作

我会使用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插件。