Bamboo Java规范,单个管道存储库和多个项目

时间:2020-02-17 15:49:11

标签: continuous-integration devops bamboo bitbucket-server

我真的很想采用Bamboo的Configuration as Code模型,但是我目前正在努力寻找最佳实践/文档/教程来实现以下方案:

我有50多个(Java)项目,每个项目都位于Bitbucket上的单独存储库中。因此,超过50个存储库。我希望所有这些对象都有一个共同的共享管道。

如何实现?

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

  • 一个公共图书馆
  • 使用通用的单个项目:请注意,单个项目可能包含多个@BambooSpec带注释的类,因此可能包含多个计划或部署。我以这样的方式组织这些活动:将这些构建与我拥有的一组构建项目相结合
  • 从命令行手动推送

答案 1 :(得分:0)

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

目前,我们有一个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读取此文件并生成/更新我们的计划。

如果每次进行新的推送时都需要使用Bamboo来运行管道,则可以在Java Pipeline Definition中定义触发器。

这也是我的@bambooSpecs主要方法的一个示例:

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

希望它会有所帮助:)