【问题标题】:Bamboo Java specs, single pipeline repository and multiple projectsBamboo Java 规范、单一管道存储库和多个项目
【发布时间】:2020-02-17 15:49:11
【问题描述】:

我对采用 Bamboo 的 Configuration as Code 模型非常感兴趣,但我目前正在努力寻找最佳实践/文档/教程来实现以下场景:

我有 50 多个 (Java) 项目,每个项目都位于 Bitbucket 上的一个单独存储库中。因此,50 多个存储库。我想为他们所有人提供一个共同的共享管道。

如何做到这一点?

我设法创建了一个特定于项目的管道(保存在竹规范文件夹中),但我无法承受 50 多种不同的管道定义,因为此管道中定义的任务可能会随着时间而改变......

理想情况下,我希望拥有一个独立于项目的 repo,仅包含管道定义......并以某种方式指示 Bamboo 每次在上述任何分支上进行新推送时触发定义的阶段/作业/任务50 多个存储库。

这是否可行(在管道项目中没有硬编码 repo 引用)?

我的公司 CI 在 Bamboo 6.8.1 上运行。

谢谢!

【问题讨论】:

    标签: continuous-integration devops bamboo bitbucket-server


    【解决方案1】:

    我们公司目前也有同样的问题。我们联系了 atlassian,它建议我们拥有一个 Java 项目并从那里管理我们所有的项目。 这样,每次我们需要更新管道时,我们只需要运行一次 Java 项目。

    目前我们有一个 JSON 配置文件:

    {
    "project": [
        {
            "key": "PROJECTKEY",
            "name": "Project name",
            "description": "testing",
            "plans": [
                {
                    "key": "PUNO",
                    "name": "plan 1",
                    "description": "plan description",
                    "repositoryName": "repository link / linked repository name",
                    "branches": [ "master", "develop"],
                    "templateBuild": "TemplateName",
                    "templateDeploy": "TemplateName",
                    "variables": [
                        {
                            "key": "",
                            "value": ""
                        }
                    ]
                }
            ]
        }
    ]
    }
    

    Java 然后读取此文件并生成/更新我们的计划。

    如果您需要在每次进行新推送时都运行管道,您可以在 Java 管道定义中定义触发器。

    这里也是我的@bambooSpecs main 方法的一个例子:

    ConfigurationFile file = new ConfigurationFile("configurationFile.json");
    Project[] proyectos = file.getProjects();
    if (proyectos != null && proyectos.length >= 1) {
        List<com.atlassian.bamboo.specs.api.builders.plan.Plan> bambooPlans = new ArrayList<>();
        for (Project p : proyectos) {
            for (Plan plan : p.getPlans()) {
                Class<?> buildClass = Class.forName("com.my.company.templates.build." + plan.getTemplateBuild());
                TemplateBaseBuild template = (TemplateBaseBuild) buildClass.getDeclaredConstructor(TemplateBaseBuild.getConstructorClassArgs()).newInstance(p.getKey(), p.getName(), p.getDescription(), plan.getKey(), plan.getName(), plan.getDescription(), "", plan.getRepositoryName(), Utils.VariablesToBambooVariable(plan.getVariables()));
                for (com.atlassian.bamboo.specs.api.builders.plan.Plan currentPlan : template.getPlans()) {
                    bambooPlans.add(currentPlan);
                }
                //TODO: deploy
            }
        }
        bambooPlans.forEach(bambooServer::publish);
    
    }
    

    我们需要定义模板,因为我们的项目可以使用不同的技术。每个模板都有管道定义(阶段、任务、权限、触发器等)

    我知道可能有更好的方法来实现这一点,但这就是我们目前找到的解决方案。

    这里是官方文档:https://docs.atlassian.com/bamboo-specs-docs/6.8.1/specs-java.html

    触发器:https://docs.atlassian.com/bamboo-specs-docs/6.8.1/specs-java.html#build-triggers

    希望对你有帮助:)

    【讨论】:

    • 非常感谢!实际上,我对缺少官方操作方法感到惊讶……正如您所说,这是一种解决方法,但暂时可能会有所帮助。希望 atlassian 在未来的版本中添加此功能!
    • 有趣的是,plan.getTemplateBuild() 在 6.10.4 api 版本中不存在。
    【解决方案2】:

    我不确定这是否会回答您的问题,在我这边,我将所有内容都放在同一个存储库中,并将一段 Java 代码共享到一个公共库。我使用的方法描述here:

    • 一个通用库
    • 使用公共的单个项目:请注意,单个项目可能包含多个@BambooSpec 注释类,因此有多个计划或部署。我以这样一种方式组织这些构建,使这些构建在我拥有的构建项目集中耦合
    • 从命令行手动推送

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 2023-03-29
      • 1970-01-01
      • 2021-10-26
      • 1970-01-01
      相关资源
      最近更新 更多