/* * Copyright 2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. * * Licensed under the Apache License, Version 2.0 (the "License"). * You may not use this file except in compliance with the License. * A copy of the License is located at * * http://aws.amazon.com/apache2.0 * * or in the "license" file accompanying this file. This file is distributed * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either * express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.amazonaws.codepipeline.jenkinsplugin; import hudson.model.BuildListener; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.amazonaws.codepipeline.jenkinsplugin.CodePipelineStateModel.CompressionType; import com.amazonaws.services.codepipeline.AWSCodePipeline; import com.amazonaws.services.codepipeline.model.Artifact; import com.amazonaws.services.codepipeline.model.EncryptionKey; import com.amazonaws.services.codepipeline.model.EncryptionKeyType; import com.amazonaws.services.codepipeline.model.ExecutionDetails; import com.amazonaws.services.codepipeline.model.FailureDetails; import com.amazonaws.services.codepipeline.model.FailureType; import com.amazonaws.services.codepipeline.model.PutJobFailureResultRequest; import com.amazonaws.services.codepipeline.model.PutJobSuccessResultRequest; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.model.CompleteMultipartUploadRequest; import com.amazonaws.services.s3.model.InitiateMultipartUploadRequest; import com.amazonaws.services.s3.model.InitiateMultipartUploadResult; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PartETag; import com.amazonaws.services.s3.model.SSEAwsKeyManagementParams; import com.amazonaws.services.s3.model.UploadPartRequest; public final class PublisherTools { private PublisherTools() {} public static void putJobResult( final boolean buildSucceeded, final String errorMessage, final String actionID, final String jobID, final AWSCodePipeline codePipelineClient, final BuildListener listener) { if (buildSucceeded) { LoggingHelper.log(listener, "Build succeeded, calling PutJobSuccessResult"); final ExecutionDetails executionDetails = new ExecutionDetails(); executionDetails.setExternalExecutionId(actionID); executionDetails.setSummary("Finished"); final PutJobSuccessResultRequest request = new PutJobSuccessResultRequest(); request.setJobId(jobID); request.setExecutionDetails(executionDetails); codePipelineClient.putJobSuccessResult(request); } else { LoggingHelper.log(listener, "Build failed, calling PutJobFailureResult"); final FailureDetails executionDetails = new FailureDetails(); executionDetails.setExternalExecutionId(actionID); executionDetails.setMessage(errorMessage); executionDetails.setType(FailureType.JobFailed); final PutJobFailureResultRequest request = new PutJobFailureResultRequest(); request.setJobId(jobID); request.setFailureDetails(executionDetails); codePipelineClient.putJobFailureResult(request); } } public static void uploadFile( final File file, final Artifact artifact, final CompressionType compressionType, final EncryptionKey encryptionKey, final AmazonS3 amazonS3, final BuildListener listener) throws IOException { LoggingHelper.log(listener, "Uploading artifact: " + artifact + ", file: " + file); final String bucketName = artifact.getLocation().getS3Location().getBucketName(); final String objectKey = artifact.getLocation().getS3Location().getObjectKey(); final List<PartETag> partETags = new ArrayList<>(); final InitiateMultipartUploadRequest initiateMultipartUploadRequest = new InitiateMultipartUploadRequest( bucketName, objectKey, createObjectMetadata(compressionType)) .withSSEAwsKeyManagementParams(toSSEAwsKeyManagementParams(encryptionKey)); final InitiateMultipartUploadResult initiateMultipartUploadResult = amazonS3.initiateMultipartUpload(initiateMultipartUploadRequest); final long contentLength = file.length(); long filePosition = 0; long partSize = 5 * 1024 * 1024; // Set part size to 5 MB for (int i = 1; filePosition < contentLength; i++) { partSize = Math.min(partSize, (contentLength - filePosition)); final UploadPartRequest uploadPartRequest = new UploadPartRequest() .withBucketName(bucketName) .withKey(objectKey) .withUploadId(initiateMultipartUploadResult.getUploadId()) .withPartNumber(i) .withFileOffset(filePosition) .withFile(file) .withPartSize(partSize); partETags.add(amazonS3.uploadPart(uploadPartRequest).getPartETag()); filePosition += partSize; } final CompleteMultipartUploadRequest completeMultipartUpload = new CompleteMultipartUploadRequest( bucketName, objectKey, initiateMultipartUploadResult.getUploadId(), partETags); amazonS3.completeMultipartUpload(completeMultipartUpload); LoggingHelper.log(listener, "Upload successful"); } public static ObjectMetadata createObjectMetadata(final CompressionType type) { final ObjectMetadata objectMetadata = new ObjectMetadata(); switch (type) { case Tar: objectMetadata.setContentType("application/tar"); break; case TarGz: objectMetadata.setContentType("application/gzip"); break; case Zip: objectMetadata.setContentType("application/zip"); break; case None: break; } return objectMetadata; } private static SSEAwsKeyManagementParams toSSEAwsKeyManagementParams(final EncryptionKey encryptionKey) { if (encryptionKey != null && encryptionKey.getId() != null && EncryptionKeyType.KMS.toString().equals(encryptionKey.getType())) { return new SSEAwsKeyManagementParams(encryptionKey.getId()); } return new SSEAwsKeyManagementParams(); } }