On 19/01/2011, at 11:22 AM, Howard Lewis Ship wrote:

> I'm trying to get my libraries to deploy via FTP.  I have it partly
> working, but there's a problem.
> 
> My multi-module project's build.gradle:
> 
> description = "Collection of add-ons for Tapestry 5"
> 
> tapestryVersion = "5.2.4"
> 
> subprojects {
>    apply plugin: 'java'
>    apply plugin: 'groovy' // mostly for testing
>    apply plugin: 'eclipse'
>    apply plugin: 'maven'
>    apply plugin: 'project-report'
> 
>    sourceCompatibility = '1.5'
>    targetCompatibility = '1.5'
> 
>    version = '1.1-SNAPSHOT'
> 
>    group = 'com.howardlewisship'
> 
>    repositories {
>        mavenCentral()
> 
>        // All things JBoss/Javassist/Hibernate
>        mavenRepo urls:
> "https://repository.jboss.org/nexus/content/repositories/releases/";
> 
>        // For the Kaptcha library
>        mavenRepo urls: "http://howardlewisship.com/repository/";
>    }
> 
>    configurations {
>        deployerJars
>    }
> 
>    dependencies {
>        compile "org.apache.tapestry:tapestry-core:$tapestryVersion"
>        testCompile "org.apache.tapestry:tapestry-test:$tapestryVersion"
>        testCompile "org.easymock:easymock:3.0"
>        groovy "org.codehaus.groovy:groovy-all:1.7.4"
> 
>        deployerJars "org.apache.maven.wagon:wagon-ftp:1.0-beta-2"
>    }
> 
>    test {
>        useTestNG()
> 
>        options.suites("src/test/conf/testng.xml")
>    }
> 
>    task sourcesJar(type: Jar, dependsOn:classes) {
>       classifier = 'sources'
>       from sourceSets.main.allSource
>    }
> 
>    artifacts {
>       archives sourcesJar
>    }
> 
> 
>    uploadArchives {
>        repositories.mavenDeployer {
>            configuration = configurations.deployerJars
>            // settings.xml must contain <server> entry for
> howardlewisship.com with username and password
>            snapshotRepository(id: 'howardlewisship.com', url:
> "ftp://howardlewisship.com/snapshot-repository";) {
>              authentication(userName: '[email protected]',
> password: 'TOPSECRET')
>            }
> 
>        }
>    }
> }
> 
> 
> This works ... but notice that I have my userName and password in the
> authentication.  This shouldn't be necessary.  I have a
> ~/.m2/settings.xml:
> 
> <?xml version="1.0"?>
> <settings>
>  <servers>
>    <server>
>      <id>howardlewisship.com</id>
>      <username>[email protected]</username>
>      <password>TOPSECRET</password>
>    </server>
>  </servers>
> </settings>
> 
> 
> 
> If I omit the authentication() element, or omit the password, or set
> the password to blank, I get:
> 
> 16:16:13.316 [DEBUG]
> [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:null]
> Maven Ant Tasks version: 2.1.1
> 16:16:13.771 [DEBUG]
> [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:null]
> Loading Maven settings file:
> /var/folders/9h/9hzVZeGsGtSsTZH5Eejb0U+++TI/-Tmp-/gradle_empty_settings7294710492673423739.xml
> 16:16:13.885 [DEBUG]
> [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:null]
> Loading Maven settings file: /Users/hlship/.m2/settings.xml
> 16:16:13.928 [INFO]
> [org.gradle.api.internal.project.ant.AntLoggingAdapter] [ant:null]
> Deploying to ftp://howardlewisship.com/snapshot-repository
> 16:16:13.934 [INFO] [system.out] [INFO] Retrieving previous build
> number from howardlewisship.com
> 16:16:17.452 [DEBUG] [org.gradle.api.internal.tasks.SkipTaskExecuter]
> Finished executing task ':tapx-datefield:uploadArchives'
> 16:16:17.464 [ERROR] [org.gradle.BuildExceptionReporter]
> 16:16:17.465 [ERROR] [org.gradle.BuildExceptionReporter] FAILURE:
> Build failed with an exception.
> 16:16:17.466 [ERROR] [org.gradle.BuildExceptionReporter]
> 16:16:17.466 [ERROR] [org.gradle.BuildExceptionReporter] * Where:
> 16:16:17.466 [ERROR] [org.gradle.BuildExceptionReporter] Build file
> '/Users/hlship/workspaces/tapestry/tapx/tapx-datefield/build.gradle'
> 16:16:17.466 [ERROR] [org.gradle.BuildExceptionReporter]
> 16:16:17.466 [ERROR] [org.gradle.BuildExceptionReporter] * What went wrong:
> 16:16:17.467 [ERROR] [org.gradle.BuildExceptionReporter] Execution
> failed for task ':tapx-datefield:uploadArchives'.
> 16:16:17.468 [ERROR] [org.gradle.BuildExceptionReporter] Cause: Could
> not publish configurations [configuration ':tapx-datefield:archives'].
> 16:16:17.468 [ERROR] [org.gradle.BuildExceptionReporter]
> 16:16:17.469 [ERROR] [org.gradle.BuildExceptionReporter] * Exception is:
> 16:16:17.469 [ERROR] [org.gradle.BuildExceptionReporter]
> org.gradle.api.tasks.LocationAwareTaskExecutionException: Build file
> '/Users/hlship/workspaces/tapestry/tapx/tapx-datefield/build.gradle'
> 16:16:17.470 [ERROR] [org.gradle.BuildExceptionReporter] Execution
> failed for task ':tapx-datefield:uploadArchives'.
> 16:16:17.470 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.tasks.DefaultTaskExecuter.executeActions(DefaultTaskExecuter.java:66)
> 16:16:17.470 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.tasks.DefaultTaskExecuter.execute(DefaultTaskExecuter.java:43)
> 16:16:17.470 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.project.taskfactory.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:32)
> 16:16:17.470 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.project.taskfactory.ExecutionShortCircuitTaskExecuter.execute(ExecutionShortCircuitTaskExecuter.java:50)
> 16:16:17.471 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.tasks.SkipTaskExecuter.doExecute(SkipTaskExecuter.java:57)
> 16:16:17.471 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.tasks.SkipTaskExecuter.execute(SkipTaskExecuter.java:35)
> 16:16:17.471 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.tasks.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:32)
> 16:16:17.471 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.AbstractTask.execute(AbstractTask.java:231)
> 16:16:17.471 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.execution.DefaultTaskGraphExecuter.executeTask(DefaultTaskGraphExecuter.java:167)
> 16:16:17.472 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.execution.DefaultTaskGraphExecuter.doExecute(DefaultTaskGraphExecuter.java:160)
> 16:16:17.472 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.execution.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:78)
> 16:16:17.472 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.execution.TaskNameResolvingBuildExecuter.execute(TaskNameResolvingBuildExecuter.java:113)
> 16:16:17.472 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.execution.DelegatingBuildExecuter.execute(DelegatingBuildExecuter.java:54)
> 16:16:17.473 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:153)
> 16:16:17.473 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:107)
> 16:16:17.473 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:75)
> 16:16:17.473 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.RunBuildAction.execute(RunBuildAction.java:41)
> 16:16:17.473 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.RunBuildAction.execute(RunBuildAction.java:27)
> 16:16:17.474 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.CommandLineActionFactory$WithLoggingAction.execute(CommandLineActionFactory.java:209)
> 16:16:17.474 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.CommandLineActionFactory$WithLoggingAction.execute(CommandLineActionFactory.java:193)
> 16:16:17.474 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.Main.execute(Main.java:55)
> 16:16:17.474 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.Main.main(Main.java:40)
> 16:16:17.475 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.ProcessBootstrap.runNoExit(ProcessBootstrap.java:46)
> 16:16:17.475 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.ProcessBootstrap.run(ProcessBootstrap.java:28)
> 16:16:17.475 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.launcher.GradleMain.main(GradleMain.java:24)
> 16:16:17.475 [ERROR] [org.gradle.BuildExceptionReporter] Caused by:
> org.gradle.api.GradleException: Could not publish configurations
> [configuration ':tapx-datefield:archives'].
> 16:16:17.476 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingIvyService.publish(ErrorHandlingIvyService.java:44)
> 16:16:17.476 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.publish(DefaultConfiguration.java:211)
> 16:16:17.476 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.tasks.Upload.upload(Upload.java:56)
> 16:16:17.476 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:158)
> 16:16:17.477 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:93)
> 16:16:17.477 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.tasks.Upload_Decorated.invokeMethod(Unknown Source)
> 16:16:17.477 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23)
> 16:16:17.477 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$2.execute(AnnotationProcessingTaskFactory.java:131)
> 16:16:17.478 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$2.execute(AnnotationProcessingTaskFactory.java:130)
> 16:16:17.478 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.tasks.DefaultTaskExecuter.executeActions(DefaultTaskExecuter.java:58)
> 16:16:17.478 [ERROR] [org.gradle.BuildExceptionReporter]      ... 24 more
> 16:16:17.478 [ERROR] [org.gradle.BuildExceptionReporter] Caused by:
> java.lang.NullPointerException
> 16:16:17.478 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.wagon.providers.ftp.FtpWagon.openConnection(FtpWagon.java:130)
> 16:16:17.479 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.wagon.AbstractWagon.connect(AbstractWagon.java:207)
> 16:16:17.479 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.manager.DefaultWagonManager.getRemoteFile(DefaultWagonManager.java:494)
> 16:16:17.479 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.manager.DefaultWagonManager.getArtifactMetadataFromDeploymentRepository(DefaultWagonManager.java:452)
> 16:16:17.479 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager.getArtifactMetadataFromDeploymentRepository(DefaultRepositoryMetadataManager.java:379)
> 16:16:17.480 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.repository.metadata.DefaultRepositoryMetadataManager.resolveAlways(DefaultRepositoryMetadataManager.java:347)
> 16:16:17.480 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.transform.SnapshotTransformation.resolveLatestSnapshotBuildNumber(SnapshotTransformation.java:161)
> 16:16:17.480 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.transform.SnapshotTransformation.transformForDeployment(SnapshotTransformation.java:100)
> 16:16:17.480 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.transform.DefaultArtifactTransformationManager.transformForDeployment(DefaultArtifactTransformationManager.java:74)
> 16:16:17.481 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.deployer.DefaultArtifactDeployer.deploy(DefaultArtifactDeployer.java:86)
> 16:16:17.481 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.ant.DeployTask.doExecute(DeployTask.java:125)
> 16:16:17.481 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.publish.maven.deploy.CustomDeployTask.doExecute(CustomDeployTask.java:42)
> 16:16:17.481 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.maven.artifact.ant.AbstractArtifactTask.execute(AbstractArtifactTask.java:718)
> 16:16:17.482 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.publish.maven.deploy.AbstractMavenResolver.execute(AbstractMavenResolver.java:189)
> 16:16:17.482 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.publish.maven.deploy.AbstractMavenResolver.commitPublishTransaction(AbstractMavenResolver.java:180)
> 16:16:17.482 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.apache.ivy.core.publish.PublishEngine.publish(PublishEngine.java:262)
> 16:16:17.482 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.ivyservice.DefaultIvyDependencyPublisher.publish(DefaultIvyDependencyPublisher.java:54)
> 16:16:17.482 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.ivyservice.DefaultIvyService.publish(DefaultIvyService.java:144)
> 16:16:17.483 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.ivyservice.ShortcircuitEmptyConfigsIvyService.publish(ShortcircuitEmptyConfigsIvyService.java:61)
> 16:16:17.483 [ERROR] [org.gradle.BuildExceptionReporter]      at
> org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingIvyService.publish(ErrorHandlingIvyService.java:42)
> 16:16:17.483 [ERROR] [org.gradle.BuildExceptionReporter]      ... 33 more
> 16:16:17.483 [ERROR] [org.gradle.BuildExceptionReporter]
> 16:16:17.484 [LIFECYCLE] [org.gradle.BuildResultLogger]
> 16:16:17.484 [LIFECYCLE] [org.gradle.BuildResultLogger] BUILD FAILED
> 16:16:17.484 [LIFECYCLE] [org.gradle.BuildResultLogger]
> 16:16:17.484 [LIFECYCLE] [org.gradle.BuildResultLogger] Total time: 11.268 
> secs
> 
> 
> Which appears to be this:
> 
> http://jira.codehaus.org/browse/WAGON-145
> 
> ... indicating that the userName and/or password are null.
> 
> 
> Meanwhile, I have a separate Ant build.xml that is used to populate
> the same Maven repository (actually, howardlewisship.com/repository,
> not howardlewisship.com/snapshot-repository).  This is for a module
> that is not built with Maven (a kpatcha library) that I want to be
> downloadable using standard Maven.
> 
> Anyway, this build.xml works:
> 
> <?xml version="1.0"?>
> <project xmlns:mvn="urn:maven-artifact-ant" default="deploy-libs">
>  <macrodef name="deploy">
>    <attribute name="name"/>
>    <sequential>
>      <mvn:deploy file="lib-import/@{name}.jar">
>        <remoteRepository id="howardlewisship.com"
> url="ftp://howardlewisship.com/repository"/>
>        <pom file="lib-import/@{name}.pom"/>
>        <attach file="lib-import/@{name}-sources.jar" classifier="sources"/>
>      </mvn:deploy>
>    </sequential>
>  </macrodef>
>  <target name="-setup-maven">
>    <typedef resource="org/apache/maven/artifact/ant/antlib.xml"
> uri="urn:maven-artifact-ant"/>
>    <mvn:install-provider artifactId="wagon-ftp" version="1.0-beta-2"/>
>  </target>
>  <target name="deploy-libs" depends="-setup-maven"
> description="Deploys libraries to Maven repository.">
>    <deploy name="kaptcha-2.3"/>
>  </target>
> </project>
> 
> Notice that <remoteRepository> specifies and id but does not have any
> authentication information.  The username and password are coming from
> settings.xml.
> 
> 
> $ gradle -v
> 
> ------------------------------------------------------------
> Gradle 0.9.1
> ------------------------------------------------------------
> 
> Gradle build time: Sunday, 2 January 2011 11:40:57 AM EST
> Groovy: 1.7.6
> Ant: Apache Ant version 1.8.1 compiled on April 30 2010
> Ivy: 2.2.0
> JVM: 1.6.0_22 (Apple Inc. 17.1-b03-307)
> OS: Mac OS X 10.6.6 x86_64
> 
> 
> 
> 
> .... so, is this a known bug

Yes: http://jira.codehaus.org/browse/GRADLE-1039


> and is there any kind of workaround where
> I don't have to leave my passwords visible?

As others have mentioned, you can use project properties for this. Have a look 
at: 
http://gradle.org/0.9.1/docs/userguide/tutorial_this_and_that.html#sec:gradle_properties_and_system_properties

At some point (soon, hopefully) we hope to add better handling for credentials. 
To start with, this will be something simple, such as some way for a task to 
declare that it needs a certain type of credentials, and a basic implementation 
that maps this to project properties. Over time, this could then grow. There's 
heaps of stuff we could do here:

* Gradle can validate the credentials early in the build, possibly even 
attempting to authenticate with the remote service. Or perhaps --dry-run could 
attempt to authenticate.

* Gradle can prompt for missing credentials, and optionally store them 
somewhere.

* We would add a credentials provider API, which others could implement in 
plugins to obtain credentials from other sources.

* Integration with the pgp plugin, and other plugins, so that credentials for 
signing artifacts can be managed.

* A trust model, so that you can lock down which plugins can get at which 
credentials (if you care).

* Some more built-in providers. Personally, I'd like something which can use my 
keys in ~/.ssh, and possibly my password manager.


--
Adam Murdoch
Gradle Developer
http://www.gradle.org
CTO, Gradle Inc. - Gradle Training, Support, Consulting
http://www.gradle.biz

Reply via email to