How do Gradle Uploads Really Work?

2019-02-27 20:04发布

问题:

I'm having some real problems understanding how all the pieces in gradle to create and upload an artifact fit together.

My intention in this script is simple: I want to download a source tarball and possibly a bunch of dependencies, run a "build.sh" shellscript which will end up creating a binary tarball and have the gradle script publish it to an artifact repo.

The main idea is that I can use gradle's dependency management, maven artifact knowledge and build parallelization and avoidance to control the execution of the build scripts themselves, mainly to manage my set of third party binary dependencies...

The following script fails with a 400 error, I suspect it's because I'm not linking the artifact with the actual output file.

What's the right and proper way to go?

apply plugin: 'maven'

version 'testarch-4.2'

repositories {
  maven {
    url "http://nexus/..."
  }
}

configurations {
  sourceArchive
  binaryArchive
}

dependencies {
  sourceArchive "org.gnu:bash:4.2:src@tgz"
}

task buildFromSource(type: Exec) {
  inputs.files configurations.sourceArchive.files
  outputs.file file("${project.name}-${project.version}.tgz")
  executable './build.sh'
  def myArgs = configurations.sourceArchive.files.path
  myArgs.add(0, outputs.files.asPath)
  args myArgs
}

artifacts {
  // Is this really the only way to transform a singleton collection
  // into the singleton?
  //   def outputFile
  //   buildFromSource.outputs.files.each { outputFile = it }
  // Nope: this is better magic:
  def outputFile = buildFromSource.outputs.files.singleFile
  println outputFile.path
  binaryArchive file: outputFile, name: 'bash'
  // binaryArchive file: file(buildFromSource.outputs.files.asPath), name: 'bash'
}

uploadArchives {
  configuration = configurations.binaryArchive
  repositories.mavenDeployer {
    repository(url: "http://nexus/..") {
      authentication(userName: "me", password: "secret!")
    }
    pom.groupId = 'org.gnu'
  }
}

uploadArchives.dependsOn buildFromSource

The error I get is:

* What went wrong:
Execution failed for task ':uploadArchives'.
> Could not publish configuration 'binaryArchive'
   > Error deploying artifact 'org.gnu:bash:tgz': Error deploying artifact: Failed to transfer file: http://nexus/.../org/gnu/bash/testarch-4.2/bash-testarch-4.2.tgz. Return code is: 400

Updated from comments, same error - trying to get access to the nexus logs for further debugging.

Error from Nexus is "missing entity", see: Missing Request Entity response to a PUT to Nexus

回答1:

The root cause of my problem was I was testing with an empty file. Nexus doesn't like empty files. As soon as I put content in it, Nexus was happy and the code was working.



标签: gradle