从 Bamboo 6 发布到 Artifactory

Posted

技术标签:

【中文标题】从 Bamboo 6 发布到 Artifactory【英文标题】:Publish to Artifactory from Bamboo 6 【发布时间】:2017-06-16 06:17:01 【问题描述】:

我使用的是 Bamboo 6.0.3 build 60004,我安装了 official Artifactory plugin for Bamboo 的版本 2.1.0

项目的build.gradle 如下:

apply plugin: 'maven-publish'
apply plugin: 'com.jfrog.artifactory'
...
task androidJavadocs(type: Javadoc) 
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))


task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) 
    classifier = 'javadoc'
    from androidJavadocs.destinationDir


task androidSourcesJar(type: Jar) 
    classifier = 'sources'
    from android.sourceSets.main.java.srcDirs


artifacts 
    archives androidSourcesJar
    archives androidJavadocsJar


afterEvaluate 
    androidJavadocs.classpath += files(android.libraryVariants.collect  variant ->
        variant.javaCompile.classpath.files
    )


publishing 
    publications 
        android.buildTypes.all  variant ->
            "$variant.nameAar"(MavenPublication) 
                // set values from Android manifest file
                groupId group
                version version
                if (variant.name == "release") 
                    artifactId project.getName()
                
                else 
                    artifactId "$project.getName()-$variant.name"
                

                artifact "$buildDir/outputs/aar/$project.getName()-$variant.name-$version.aar"
                artifact androidJavadocsJar

                pom.withXml 
                    def dependenciesNode = asNode().appendNode('dependencies')

                    // List all compile dependencies and write to POM
                    configurations.compile.getAllDependencies().each  Dependency dep ->
                        if (dep.group == null || dep.version == null || dep.name == null || dep.name == "unspecified")
                            return // ignore invalid dependencies

                        def dependencyNode = dependenciesNode.appendNode('dependency')
                        dependencyNode.appendNode('groupId', dep.group)
                        dependencyNode.appendNode('artifactId', dep.name)
                        dependencyNode.appendNode('version', dep.version)

                        if (!dep.transitive) 
                            // If this dependency is transitive, we should force exclude all its dependencies them from the POM
                            def exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
                            exclusionNode.appendNode('groupId', '*')
                            exclusionNode.appendNode('artifactId', '*')
                         else if (!dep.properties.excludeRules.empty) 
                            // Otherwise add specified exclude rules
                            def exclusionNode = dependencyNode.appendNode('exclusions').appendNode('exclusion')
                            dep.properties.excludeRules.each  ExcludeRule rule ->
                                exclusionNode.appendNode('groupId', rule.group ?: '*')
                                exclusionNode.appendNode('artifactId', rule.module ?: '*')
                            
                        
                    
                
            
        
    


def libraryGroupId = group
def libraryVersion = version

artifactory 
    contextUrl = '<artifactory_url>'

    publish 
        repository 
            repoKey = '<repoKey>'

            username = artifactory_username
            password = artifactory_password
        
        defaults 
            android.buildTypes.all  variant ->
                publications("$variant.nameAar")
                publishArtifacts = true
            

            properties = ['qa.level': 'basic', 'dev.team': 'core']
            publishPom = true
        
    

当我在笔记本电脑上运行命令 gradle build assembleRelease artifactoryPublish 时,它会在 Artifactory 存储库中上传 aarpom 文件。

我尝试在部署项目中使用 Artifactory Deployment 任务,该任务在执行 gradle build assembleRelease 的构建任务之后运行(因此相同,但没有发布到工件),但它只发布 aar 文件和目录结构在 artifactory 中看起来不一样(它不会按子文件夹分解包名称)。 Bamboo 如何达到同样的效果?

【问题讨论】:

【参考方案1】:

不要使用 JFrog,我们使用 Nexus,但看起来插件中的部署项目任务只是为了从部署项目所依赖的构建计划中获取共享/发布的工件并将其上传到 Artifactory。因此,对于您的第一个问题,POM 没有被上传,POM 是源构建计划中为部署项目提供的共享工件吗?那么您在该构建计划中有两个共享工件,存档 AAR 文件和 POM?

对于您的第二个问题,它可能取决于您如何在源代码构建计划中定义共享工件的路径。部署任务似乎没有为您提供有关将工件写入工件的位置的任何选项。但是,我注意到正常的构建计划任务使用 JSON 文件描述符,您可以在其中拥有更多控制权:

https://www.jfrog.com/confluence/display/RTF/Using+File+Specs

所以我想知道,如果您从提供正常构建计划而不是从部署项目发布您的工件,并且只是在该环境的部署项目任务开始时从工件下载工件,您是否会有更大的灵活性。

真的不是一个解决方案 - 只是看看一堆可能会有所帮助的东西。

【讨论】:

是的,我之前看过文件规范,但没有太多关于它如何帮助我做我想做的事的例子。我不介意使用它,但如何?另外,它需要是自动的,因此可以为每个项目设置 groupId/artifactId 之类的东西,但需要从 AAR 文件本身获取版本【参考方案2】:

根据Bamboo Artifacotry plugin official page,目前还没有适用于 Bamboo 6.0 的插件(但适用于 Bamboo 5.15)。 但是,如果您使用成绩任务发布,则不会使用 Bamboo 插件。

【讨论】:

这根本不能回答问题。我正在询问如何使用插件发布aar 文件和pom 文件,就像我没有插件时一样。我知道这是两个不同的东西,但我期望使用任何一个都可以得到相同的结果,但事实并非如此【参考方案3】:

Bamboo Server 的版本 6+ 似乎有一个可用的更新,位于此处: https://marketplace.atlassian.com/plugins/org.jfrog.bamboo.bamboo-artifactory-plugin/server/overview

但是,我现在正在尝试使用 Atlassian Bamboo 版本 6.3.2 build 60307 并不断收到此错误:

  Could not execute task  no Plugin with key 'org.jfrog.bamboo.bamboo-
   artifactory-plugin:artifactoryGenericResolveTask' is installed.

尝试将其添加为此处记录的可执行文件https://www.jfrog.com/confluence/display/RTF/Bamboo%20Artifactory%20Plug-in

但仍然收到错误消息。因此,再次尝试使用它建议仅使用通用解析任务的规范文件,但仍然没有运气。

【讨论】:

是的,我正在尝试使用相同的插件,但我不知道如何让它像我想要的那样工作。在旁注中,这不是一个真正的答案 看起来与堆栈溢出的许多答案相当,但感谢您的反馈。 我的意思是,你只是在解释你的插件问题,所以它看起来更像是一个问题而不是一个答案。我们通常将其写为问题的 cmets,或者您会为其创建一个全新的问题

以上是关于从 Bamboo 6 发布到 Artifactory的主要内容,如果未能解决你的问题,请参考以下文章

从 Bamboo 构建开始 Bamboo 部署

从 Bamboo 到 Jenkins 的单一计划迁移

将快照从 Bamboo 部署到 Artifactory 时遇到问题

Bamboo 部署项目到 Artifactory

从 Heroku Bamboo 堆栈升级到 Cedar 堆栈

将 Jar Artifact 从 Bamboo 部署到 Artifactory