Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New S3-plugin features for S3 artifacts management #2

Closed
wants to merge 13 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.434</version>
<version>1.424</version>
</parent>

<artifactId>s3</artifactId>
Expand Down Expand Up @@ -31,6 +31,15 @@
<artifactId>aws-java-sdk</artifactId>
<version>1.2.1</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>copyartifact</artifactId>
<version>1.21</version>
</dependency>
<dependency>
<groupId>org.jenkins-ci.main</groupId>
<artifactId>maven-plugin</artifactId>
</dependency>
</dependencies>

</project>
31 changes: 30 additions & 1 deletion src/main/java/hudson/plugins/s3/Destination.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package hudson.plugins.s3;

import hudson.model.AbstractBuild;
import hudson.model.Run;

import java.io.Serializable;


/**
* Provides a way to construct a destination bucket name and object name based
Expand All @@ -9,8 +14,13 @@
* construct a structure in the object name. That is, a put of file.txt to bucket name
* of "mybucket/v1" will cause the object "v1/file.txt" to be created in the mybucket.
*
* The fileName can also contain '/' to implement some kind of fake directories.
*/
public class Destination {
public class Destination implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
public final String bucketName;
public final String objectName;

Expand All @@ -35,5 +45,24 @@ public String toString() {
return "Destination [bucketName="+bucketName+", objectName="+objectName+"]";
}


public static Destination newFromRun(Run run, String bucketName, String fileName)
{
String projectName = run.getParent().getName();
int buildID = run.getNumber();
return new Destination(bucketName, "jobs/" + projectName + "/" + buildID + "/" + fileName);
}

public static Destination newFromRun(Run run, S3Artifact artifact)
{
return newFromRun(run, artifact.getBucket(), artifact.getName());
}

public static Destination newFromBuild(AbstractBuild<?, ?> build, String bucketName, String fileName)
{
String projectName = build.getParent().getName();
int buildID =build.getNumber();
return new Destination(bucketName, "jobs/" + projectName + "/" + buildID + "/" + fileName);
}

}
5 changes: 5 additions & 0 deletions src/main/java/hudson/plugins/s3/Entry.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,9 @@ public final class Entry {
* <p>
*/
public String sourceFile;

/**
* Upload either from the slave or the master
*/
public boolean uploadFromSlave;
}
42 changes: 42 additions & 0 deletions src/main/java/hudson/plugins/s3/FingerprintRecord.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package hudson.plugins.s3;

import hudson.model.AbstractBuild;
import hudson.model.Fingerprint;
import hudson.model.FingerprintMap;

import java.io.IOException;
import java.io.Serializable;

import jenkins.model.Jenkins;

public class FingerprintRecord implements Serializable {
private static final long serialVersionUID = 1L;
final boolean produced;
final String md5sum;
final S3Artifact artifact;


public FingerprintRecord(boolean produced, String bucket, String name, String md5sum) {
this.produced = produced;
this.artifact = new S3Artifact(bucket, name);
this.md5sum = md5sum;
}

Fingerprint addRecord(AbstractBuild<?,?> build) throws IOException {
FingerprintMap map = Jenkins.getInstance().getFingerprintMap();
return map.getOrCreate(produced?build:null, artifact.getName(), md5sum);
}

public String getName() {
return artifact.getName();
}

public String getBucket() {
return artifact.getBucket();
}

public String getFingerprint() {
return md5sum;
}

}
23 changes: 23 additions & 0 deletions src/main/java/hudson/plugins/s3/S3Artifact.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package hudson.plugins.s3;

import java.io.Serializable;

public final class S3Artifact implements Serializable {
private static final long serialVersionUID = 1L;

final private String bucket;
final private String name;

public S3Artifact(String bucket, String name) {
this.bucket = bucket;
this.name = name;
}

public String getBucket() {
return bucket;
}

public String getName() {
return name;
}
}
80 changes: 80 additions & 0 deletions src/main/java/hudson/plugins/s3/S3ArtifactsAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package hudson.plugins.s3;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;

import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;

import hudson.model.RunAction;
import hudson.model.AbstractBuild;
import hudson.model.Run;

public class S3ArtifactsAction implements RunAction {
private final AbstractBuild build;
private final String profile;
private final List<FingerprintRecord> artifacts;

public S3ArtifactsAction(AbstractBuild<?,?> build, S3Profile profile, List<FingerprintRecord> artifacts) {
this.build = build;
this.profile = profile.getName();
this.artifacts = artifacts;
onLoad(); // make compact
}

public AbstractBuild<?,?> getBuild() {
return build;
}

public String getIconFileName() {
return "fingerprint.png";
}

public String getDisplayName() {
return "S3 Artifacts";
}

public String getUrlName() {
return "s3";
}

public void onLoad() {
}

public void onAttached(Run r) {
}

public void onBuildComplete() {
}

public String getProfile() {
return profile;
}

public List<FingerprintRecord> getArtifacts() {
return artifacts;
}

public void doDownload(final StaplerRequest request, final StaplerResponse response) throws IOException, ServletException {

String restOfPath = request.getRestOfPath();
if (restOfPath == null) {
return;
}

// skip the leading /
String artifact = restOfPath.substring(1);
for (FingerprintRecord record : getArtifacts()) {
if (record.artifact.getName().equals(artifact)) {
S3Profile s3 = S3BucketPublisher.getProfile(profile);
String url = s3.getDownloadURL(build, record);
response.sendRedirect2(url);
return;
}
}
response.sendError(404, "This artifact is not available");
}

}
54 changes: 54 additions & 0 deletions src/main/java/hudson/plugins/s3/S3ArtifactsProjectAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package hudson.plugins.s3;

import java.util.List;

import hudson.model.Action;
import hudson.model.AbstractProject;
import hudson.model.Run;

public class S3ArtifactsProjectAction implements Action {

private final AbstractProject<?, ?> project;

public S3ArtifactsProjectAction(AbstractProject<?, ?> project) {
this.project = project;
}

private Run getLastSuccessfulBuild() {
return project.getLastSuccessfulBuild();
}

@SuppressWarnings("unused")
public S3ArtifactsAction getLatestDeployedArtifacts() {
Run latestSuccessfulBuild = getLastSuccessfulBuild();
if (latestSuccessfulBuild == null) {
return null;
}
List<S3ArtifactsAction> actions = latestSuccessfulBuild.getActions(S3ArtifactsAction.class);
if (actions == null || actions.size() == 0) {
return null;
}
return actions.get(actions.size() - 1);
}

@SuppressWarnings("unused")
public int getLastSuccessfulNumber() {
Run latestSuccessfulBuild = getLastSuccessfulBuild();
if (latestSuccessfulBuild == null) {
return 0;
}
return latestSuccessfulBuild.getNumber();
}

public String getIconFileName() {
return null;
}

public String getDisplayName() {
return null;
}

public String getUrlName() {
return null;
}
}
Loading