Artifactory Maven 저장소에 스냅 샷 JAR을 게시하는 데 실패 함

Aug 19 2020

우리 팀은 Jenkins 작업에 의해 생성 된 JAR을 Maven 스냅 샷 저장소로 설정된 Artifactory Pro 7.6.2 인스턴스의 저장소에 배포하려고합니다. 그러나 프로젝트에서 생성 된 JAR 파일의 실제 업로드를 수행 할 때 배포가 실패하고 오류 500이 발생합니다.

Jenkins 작업의 콘솔 출력에있는 내용은 다음과 같습니다.

[consumer_0] Deploying artifact: http://<artifactory URL>/maven-dev/com/example/example-client/0.0.1-SNAPSHOT/example-client-0.0.1-20200817.130343-1-javadoc.jar
[consumer_1] Deploying artifact: http://<artifactory URL>/maven-dev/com/example/example-client/0.0.1-SNAPSHOT/example-client-0.0.1-20200817.130343-1-sources.jar
[consumer_2] Deploying artifact: http://<artifactory URL>/maven-dev/com/example/example-client/0.0.1-SNAPSHOT/example-client-0.0.1-20200817.130343-1.jar
[consumer_1] Deploying artifact: http://<artifactory URL>/maven-dev/com/example/example-client/0.0.1-SNAPSHOT/example-client-0.0.1-20200817.130343-1.module
[consumer_0] An exception occurred during execution:
java.lang.RuntimeException: java.io.IOException: Failed to deploy file. Status code: 500 Response message: Artifactory returned the following errors: 
 Status code: 500
    at org.jfrog.build.extractor.clientConfiguration.util.spec.SpecDeploymentConsumer.consumerRun(SpecDeploymentConsumer.java:44)
    at org.jfrog.build.extractor.producerConsumer.ConsumerRunnableBase.run(ConsumerRunnableBase.java:11)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Failed to deploy file. Status code: 500 Response message: Artifactory returned the following errors: 
 Status code: 500
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.uploadFile(ArtifactoryBuildInfoClient.java:685)
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.doDeployArtifact(ArtifactoryBuildInfoClient.java:367)
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.deployArtifact(ArtifactoryBuildInfoClient.java:355)
    at org.jfrog.build.extractor.clientConfiguration.util.spec.SpecDeploymentConsumer.consumerRun(SpecDeploymentConsumer.java:39)
    ... 2 more

[consumer_1] An exception occurred during execution:
java.lang.RuntimeException: java.io.IOException: Failed to deploy file. Status code: 500 Response message: Artifactory returned the following errors: 
 Status code: 500
    at org.jfrog.build.extractor.clientConfiguration.util.spec.SpecDeploymentConsumer.consumerRun(SpecDeploymentConsumer.java:44)
    at org.jfrog.build.extractor.producerConsumer.ConsumerRunnableBase.run(ConsumerRunnableBase.java:11)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Failed to deploy file. Status code: 500 Response message: Artifactory returned the following errors: 
 Status code: 500
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.uploadFile(ArtifactoryBuildInfoClient.java:685)
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.doDeployArtifact(ArtifactoryBuildInfoClient.java:367)
    at org.jfrog.build.extractor.clientConfiguration.client.ArtifactoryBuildInfoClient.deployArtifact(ArtifactoryBuildInfoClient.java:355)
    at org.jfrog.build.extractor.clientConfiguration.util.spec.SpecDeploymentConsumer.consumerRun(SpecDeploymentConsumer.java:39)
    ... 2 more

Artifactory 서버 측에서는 이것이 실패 할 때 로그에 다음이 표시됩니다 (실패한 각 파일에 대해 반복되며 여기에 하나의 예만 넣음).

2020-08-18T22:27:33.042Z [jfrt ] [ERROR] [6c7ca1a483dd3f03] [o.a.r.d.DbStoringRepoMixin:291] [tp-nio-8081-exec-407] - Couldn't save resource maven-dev:com/example/example-client/0.0.1-SNAPSHOT/example-client-0.0.1-20200818.222406-1-sources.jar, reason:
java.lang.reflect.UndeclaredThrowableException: null
    at com.sun.proxy.$Proxy46.next(Unknown Source) at org.artifactory.storage.db.fs.dao.NodesDao.getChildren(NodesDao.java:247) at org.artifactory.storage.db.fs.service.FileServiceImpl.loadChildren(FileServiceImpl.java:272) at org.artifactory.storage.fs.tree.FolderNode.getChildrenItemNode(FolderNode.java:74) at org.artifactory.storage.fs.tree.FolderNode.getChildren(FolderNode.java:56) at org.artifactory.maven.MavenMetadataCalculator.folderContainsPoms(MavenMetadataCalculator.java:422) at org.artifactory.maven.MavenMetadataCalculator.createSnapshotsMetadata(MavenMetadataCalculator.java:210) at org.artifactory.maven.MavenMetadataCalculator.calculateAndSet(MavenMetadataCalculator.java:179) at org.artifactory.maven.MavenMetadataCalculator.calculate(MavenMetadataCalculator.java:154) at org.artifactory.maven.MavenMetadataServiceImpl.calculateMavenMetadata(MavenMetadataServiceImpl.java:86) at jdk.internal.reflect.GeneratedMethodAccessor5156.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205) at com.sun.proxy.$Proxy242.calculateMavenMetadata(Unknown Source)
    at org.artifactory.repo.interceptor.MavenMetadataCalculationInterceptor.afterCreate(MavenMetadataCalculationInterceptor.java:73)
    at org.artifactory.repo.interceptor.storage.StorageInterceptorsImpl.afterCreate(StorageInterceptorsImpl.java:69)
    at jdk.internal.reflect.GeneratedMethodAccessor459.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
    at com.sun.proxy.$Proxy234.afterCreate(Unknown Source) at org.artifactory.repo.db.DbStoringRepoMixin.invokeAfterCreateInterceptors(DbStoringRepoMixin.java:407) at org.artifactory.repo.db.DbStoringRepoMixin.saveResource(DbStoringRepoMixin.java:245) at org.artifactory.repo.db.DbLocalRepo.saveResource(DbLocalRepo.java:162) at org.artifactory.repo.service.RepositoryServiceImpl.saveResourceInTransaction(RepositoryServiceImpl.java:1915) at jdk.internal.reflect.GeneratedMethodAccessor477.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy193.saveResourceInTransaction(Unknown Source)
    at org.artifactory.repo.service.RepositoryServiceImpl.saveResource(RepositoryServiceImpl.java:1903)
    at jdk.internal.reflect.GeneratedMethodAccessor526.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:205)
    at com.sun.proxy.$Proxy193.saveResource(Unknown Source) at org.artifactory.engine.UploadServiceImpl.uploadItemWithContent(UploadServiceImpl.java:574) at org.artifactory.engine.UploadServiceImpl.uploadItemWithProvidedContent(UploadServiceImpl.java:554) at org.artifactory.engine.UploadServiceImpl.uploadItem(UploadServiceImpl.java:429) at org.artifactory.engine.UploadServiceImpl.uploadFile(UploadServiceImpl.java:420) at org.artifactory.engine.UploadServiceImpl.uploadArtifact(UploadServiceImpl.java:402) at org.artifactory.engine.UploadServiceImpl.adjustResponseAndUpload(UploadServiceImpl.java:223) at org.artifactory.engine.UploadServiceImpl.validateRequestAndUpload(UploadServiceImpl.java:189) at org.artifactory.engine.UploadServiceImpl.upload(UploadServiceImpl.java:132) at jdk.internal.reflect.GeneratedMethodAccessor520.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:343) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.artifactory.request.aop.RequestAdvice.invoke(RequestAdvice.java:67) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) at com.sun.proxy.$Proxy238.upload(Unknown Source)
    at org.artifactory.webapp.servlet.RepoFilter.doUpload(RepoFilter.java:284)
    at org.artifactory.webapp.servlet.RepoFilter.execute(RepoFilter.java:176)
    at org.artifactory.webapp.servlet.RepoFilter.doFilter(RepoFilter.java:97)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.artifactory.webapp.servlet.AccessFilter.useAuthenticationAndContinue(AccessFilter.java:413)
    at org.artifactory.webapp.servlet.AccessFilter.authenticateAndExecute(AccessFilter.java:301)
    at org.artifactory.webapp.servlet.AccessFilter.doFilterInternal(AccessFilter.java:176)
    at org.artifactory.webapp.servlet.AccessFilter.doFilter(AccessFilter.java:127)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.artifactory.webapp.servlet.RequestFilter.doFilter(RequestFilter.java:78)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.artifactory.webapp.servlet.ArtifactoryCsrfFilter.doFilter(ArtifactoryCsrfFilter.java:86)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:164)
    at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80)
    at org.artifactory.webapp.servlet.SessionFilter.doFilter(SessionFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.artifactory.webapp.servlet.ArtifactoryTracingFilter.doFilter(ArtifactoryTracingFilter.java:27)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.artifactory.webapp.servlet.ArtifactoryFilter.doFilter(ArtifactoryFilter.java:126)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
    at org.apache.catalina.valves.rewrite.RewriteValve.invoke(RewriteValve.java:305)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:615)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:818) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1627)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.reflect.InvocationTargetException: null
    at jdk.internal.reflect.GeneratedMethodAccessor34.invoke(Unknown Source)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.jfrog.storage.wrapper.ResultSetWrapper.invoke(ResultSetWrapper.java:85)
    ... 109 common frames omitted
Caused by: java.sql.SQLTransactionRollbackException: A lock could not be obtained due to a deadlock, cycle of locks and waiters is:
Lock : ROW, NODES, (2975,6)
  Waiting XID : {230127895, S} , APP, SELECT * FROM nodes WHERE repo = ? AND node_path = ? AND depth = ?
  Granted XID : {230127897, X} 
Lock : ROW, NODES, (991,272)
  Waiting XID : {230127897, S} , APP, SELECT * FROM nodes WHERE repo = ? AND node_path = ? AND depth = ?
  Granted XID : {230127895, X} 
. The selected victim is XID : 230127895.
    at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
    at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.closeOnTransactionError(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.movePosition(Unknown Source)
    at org.apache.derby.impl.jdbc.EmbedResultSet.next(Unknown Source)
    ... 113 common frames omitted
Caused by: org.apache.derby.iapi.error.StandardException: A lock could not be obtained due to a deadlock, cycle of locks and waiters is:
Lock : ROW, NODES, (2975,6)
  Waiting XID : {230127895, S} , APP, SELECT * FROM nodes WHERE repo = ? AND node_path = ? AND depth = ?
  Granted XID : {230127897, X} 
Lock : ROW, NODES, (991,272)
  Waiting XID : {230127897, S} , APP, SELECT * FROM nodes WHERE repo = ? AND node_path = ? AND depth = ?
  Granted XID : {230127895, X} 
. The selected victim is XID : 230127895.
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
    at org.apache.derby.impl.services.locks.Deadlock.buildException(Unknown Source)
    at org.apache.derby.impl.services.locks.ConcurrentLockSet.lockObject(Unknown Source)
    at org.apache.derby.impl.services.locks.ConcurrentLockSet.zeroDurationLockObject(Unknown Source)
    at org.apache.derby.impl.services.locks.AbstractPool.zeroDurationlockObject(Unknown Source)
    at org.apache.derby.impl.services.locks.ConcurrentPool.zeroDurationlockObject(Unknown Source)
    at org.apache.derby.impl.store.raw.xact.RowLocking2nohold.lockRecordForRead(Unknown Source)
    at org.apache.derby.impl.store.access.heap.HeapController.lockRow(Unknown Source)
    at org.apache.derby.impl.store.access.heap.HeapController.lockRow(Unknown Source)
    at org.apache.derby.impl.store.access.btree.index.B2IRowLocking3.lockRowOnPage(Unknown Source)
    at org.apache.derby.impl.store.access.btree.index.B2IRowLocking3._lockScanRow(Unknown Source)
    at org.apache.derby.impl.store.access.btree.index.B2IRowLockingRR.lockScanRow(Unknown Source)
    at org.apache.derby.impl.store.access.btree.BTreeForwardScan.fetchRows(Unknown Source)
    at org.apache.derby.impl.store.access.btree.BTreeScan.fetchNextGroup(Unknown Source)
    at org.apache.derby.impl.sql.execute.BulkTableScanResultSet.reloadArray(Unknown Source)
    at org.apache.derby.impl.sql.execute.BulkTableScanResultSet.getNextRowCore(Unknown Source)
    at org.apache.derby.impl.sql.execute.IndexRowToBaseRowResultSet.getNextRowCore(Unknown Source)
    at org.apache.derby.impl.sql.execute.ProjectRestrictResultSet.getNextRowCore(Unknown Source)
    at org.apache.derby.impl.sql.execute.BasicNoPutResultSetImpl.getNextRow(Unknown Source)
    ... 115 common frames omitted

Jenkins 작업은 선언적 다중 분기 파이프 라인이며 Artifactory 배포는 Jenkinsfile 내에서 다음 코드를 통해 수행됩니다.

...
    dir("mavenOut/snapshot/"){
        rtBuildInfo(maxBuilds: 10)

        rtUpload(
            serverId: "artifactory", 
            spec: """{
                "files":[
                    {
                        "pattern": "**/*",
                        "excludePatterns": ["*maven-metadata.xml", "*.sha1","*.sha256","*.sha512","*.md5"],
                        "target":  "maven-dev/",
                        "flat": "false"
                    }
                ]
            }"""
        )

        rtPublishBuildInfo(serverId: "artifactory")
    }
...

프로젝트 자체는 Gradle로 빌드 된 Java 프로젝트입니다.

plugins {
    id 'java-library'
    id 'maven-publish'
    id 'maven'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'javax.websocket:javax.websocket-api:1.0'
    implementation 'org.springframework:spring-websocket:5.2.7.RELEASE'
    implementation 'org.springframework:spring-messaging:5.2.7.RELEASE'
    implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.2'
    implementation 'com.google.code.gson:gson:2.8.6'
    implementation 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.37'
    
    testCompile('org.springframework.boot:spring-boot-starter-test:2.3.0.RELEASE') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

java {
    withJavadocJar()
    withSourcesJar()
}

publishing {
    publications {
        mavenJava(MavenPublication) {
            artifactId = 'example-client'
            from components.java
        }
    }
    repositories {
        maven {
            def releasesRepoUrl = "$buildDir/mavenOut/release" def snapshotsRepoUrl = "$buildDir/mavenOut/snapshot"
            url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
        }
    }
}

test {
    useJUnitPlatform()
}

궁극적으로 배포해야하는 5 개의 파일이 생성됩니다 (타임 스탬프는 물론 각 빌드마다 변경됨).

  • example-client-0.0.1-20200817.130343-1.jar
  • example-client-0.0.1-20200817.130343-1-javadoc.jar
  • example-client-0.0.1-20200817.130343-1-sources.jar
  • example-client-0.0.1-20200817.130343-1.module
  • example-client-0.0.1-20200817.130343-1.pom

Artifactory 내의 Maven 저장소 (maven-dev)는 다음 설정으로 설정됩니다.

  • 체크섬 정책 : 클라이언트 체크섬에 대해 확인
  • Maven 스냅 샷 버전 동작 : 고유
  • 최대 고유 스냅 샷 :
  • 핸들 릴리스 : 선택 취소
  • 스냅 샷 처리 : 선택
  • POM 일관성 검사 억제 : 선택

나는 다른 누군가가 이와 같은 프로젝트를 Artifactory repo에 배포하여 무엇이 잘못되었는지 지적하기를 바랍니다. 우리는 수년 동안 Artifactory를 광범위하게 사용했지만 Maven 저장소에 스냅 샷 빌드를 배포하는 맥락에서는 사용하지 않았습니다.

편집 : 우리가 주 jar 및 * -javadoc.jar 외에도 * -sources.jar을 업로드하려고한다는 사실로 문제를 좁혔습니다. 파일 사양의 제외 필터를 다음과 같이 업데이트하면 게시가 예상대로 완벽하게 작동합니다.

"excludePatterns": ["*maven-metadata.xml","*.sha1","*.sha256","*.sha512","*.md5","*sources.jar"],

그래서 sources.jar가 게시되는 것에 대한 무언가가 그것을 버리고 있습니다, 어떤 아이디어?

편집 2 : 음, 소스 jar를 제외하면 여러 빌드에서 작동 한 다음 동일한 오류로 다시 실패하기 시작했습니다. 한두 번의 빌드에서 작동하고 잠시 실패한 다음 몇 번의 성공으로 돌아갑니다.

편집 3 : 나는 또한 더 일반적인 rtUpload접근 방식 보다 Artifactory Gradle 구문을 통해 배포를 시도했습니다 . Gradle 빌드가 실행되고 buildinfo가 게시되지만 아티팩트가 업로드되지 않습니다.

** 편집 4 : ** 아래 제안에 따라 작동했습니다. 또한 Artifactory Jenkins 플러그인을 최신 버전으로 업데이트했습니다. 다음은 다른 누군가가 유사한 문제에 부딪 힐 경우를 대비하여 작동하게 된 Jenkinsfile의 스 니펫입니다.

   stage('Artifactory Config') {
        steps {
            rtBuildInfo(maxBuilds: 10, deleteBuildArtifacts: true)
            
            rtGradleDeployer(
                id: "rtDeployer",
                serverId: "artifactory",
                releaseRepo: "gradle-release",
                snapshotRepo: "gradle-dev"
            )
            
            rtGradleResolver(
                id: "rtResolver",
                serverId: "artifactory",
                repo: "maven"
            )
        }
    }

    stage('Build Client'){
        steps {
            echo "invoking gradle"

            rtGradleRun(
                tasks: "artifactoryPublish",
                useWrapper: true,
                deployerId: "rtDeployer",
                resolverId: "rtResolver"
            )
            
            rtPublishBuildInfo(serverId: "artifactory")
        }
    }

답변

2 Prostagma Aug 20 2020 at 21:39

Jenkins Artifactory Plugin에서 제공되는 전용 Gradle 통합을 사용하여 Gradle 아티팩트를 빌드하고 배포하는 것이 좋습니다 .

rtUpload현재 사용중인 일반 명령 ( ) 과 달리 Gradle 빌드를 위해 특별히 개발되었으므로 현재 직면하고있는 문제와 같은 문제를 방지 할 수 있습니다 .

파이프 라인에서이 통합을 쉽게 사용하는 방법을 알아 보려면이 Jenkinsfile 예제 를 참조 하세요.

1 MuhammedKashif Aug 20 2020 at 01:03

오류 로그 스 니펫을 기반으로 오류가 DB 트랜잭션의 교착 상태와 관련이 있음을 알 수 있습니다. Artifactory가 기본 더비 DB로 실행되고 있다고 생각합니다. 아래 오류 로그 스 니펫은 Derby에 교착 상태가 있음을 알려줍니다.

원인 : org.apache.derby.iapi.error.StandardException : 교착 상태, 잠금 및 대기 주기로 인해 잠금을 얻을 수 없습니다. 잠금 : ROW, NODES, (2975,6) XID 대기 : {230127895, S}, APP, SELECT * FROM 노드 WHERE repo =? AND node_path =? AND 깊이 =? 부여 된 XID : {230127897, X} Lock : ROW, NODES, (991,272) Waiting XID : {230127897, S}, APP, SELECT * FROM nodes WHERE repo =? AND node_path =? AND 깊이 =? 부여 된 XID : {230127895, X}

Artifacts를 Artifactory에 배포 하고이 문제에 직면하지 않은 유사한 JenkinFile이 있습니다. Artifactory를 다시 시작하는 것만으로도 교착 상태에서 Derby DB를 제거 할 수 있습니다.