Skip to content
This repository has been archived by the owner on Jan 18, 2021. It is now read-only.

Additional CI Provider #868

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package org.shipkit.gradle.configuration;

import org.shipkit.internal.gradle.configuration.ShipkitConfigurationStore;
import org.shipkit.internal.gradle.release.ci.TravisProvider;
import org.shipkit.internal.util.EnvVariables;

import java.util.Collection;
Expand Down Expand Up @@ -63,7 +64,7 @@ public ShipkitConfiguration() {
team.setDevelopers(Collections.<String>emptyList());
team.setIgnoredContributors(Collections.<String>emptyList());

ciManagement.setSystem("TravisCI");
ciManagement.setSystem(TravisProvider.NAME);
}

ShipkitConfiguration(ShipkitConfigurationStore store) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.shipkit.internal.gradle.release.CiPlugin;
import org.shipkit.internal.gradle.release.GradlePortalReleasePlugin;
import org.shipkit.internal.gradle.release.TravisPlugin;
import org.shipkit.internal.gradle.util.ProjectUtil;
Expand All @@ -21,7 +22,7 @@ public class ShipkitGradlePlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
ProjectUtil.requireRootProject(project, this.getClass());
project.getPlugins().apply(TravisPlugin.class);
project.getPlugins().apply(CiPlugin.class);
project.getPlugins().apply(GradlePortalReleasePlugin.class);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public CiContext() {
* Returns true if it's a build inside CI environment, false otherwise
*/
public boolean isCiBuild() {
String ci = envVariables.getNonEmptyEnv("CI"); // CI env variable is set by Travis
String ci = envVariables.getNonEmptyEnv("CI"); // CI env variable is set by CI
return "true".equals(ci);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package org.shipkit.internal.gradle.release;

import org.apache.commons.lang.StringUtils;
import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.shipkit.gradle.configuration.ShipkitConfiguration;
import org.shipkit.gradle.git.IdentifyGitBranchTask;
import org.shipkit.gradle.release.ReleaseNeededTask;
import org.shipkit.internal.gradle.configuration.BasicValidator;
import org.shipkit.internal.gradle.configuration.LazyConfiguration;
import org.shipkit.internal.gradle.configuration.ShipkitConfigurationPlugin;
import org.shipkit.internal.gradle.git.GitBranchPlugin;
import org.shipkit.internal.gradle.git.GitSetupPlugin;
import org.shipkit.internal.gradle.git.tasks.GitCheckOutTask;
import org.shipkit.internal.gradle.release.ci.GenericProvider;
import org.shipkit.internal.gradle.release.ci.GitHubActionsProvider;
import org.shipkit.internal.gradle.release.ci.TravisProvider;
import org.shipkit.internal.gradle.util.StringUtil;

/**
* Configures the release automation to be used with GitHub Actions. Intended for root project.
* <p>
* Applies:
* <ul>
* <li>{@link CiReleasePlugin}</li>
* </ul>
* Adds behavior:
* <ul>
* <li>Configures {@link GitBranchPlugin}/{@link IdentifyGitBranchTask}
* so that the branch information is taken from 'GITHUB_REF' env variable.</li>
* <li>Configures {@link GitSetupPlugin}/{@link GitCheckOutTask}
* so that it checks out the branch specified in env variable.</li>
* <li>Configures {@link ReleaseNeededPlugin}/{@link ReleaseNeededTask}
* so that it uses information from 'GITHUB_EVENT' and 'GITHUB_EVENT_PATH' env variables.</li>
* </ul>
*/
public class CiPlugin implements Plugin<Project> {

private final static Logger LOG = Logging.getLogger(CiPlugin.class);

@Override
public void apply(final Project project) {
project.getPlugins().apply(CiReleasePlugin.class);
final ShipkitConfiguration conf = project.getPlugins().apply(ShipkitConfigurationPlugin.class).getConfiguration();

final CiProvider ciProvider;
switch (conf.getCiManagement().getSystem()) {
case GitHubActionsProvider.NAME:
ciProvider = new GitHubActionsProvider(conf);
break;
case TravisProvider.NAME:
ciProvider = new TravisProvider(conf);
break;
default:
ciProvider = new GenericProvider(conf);
}

final String branch = ciProvider.getBranch();
LOG.info("Branch from '{}': {}", ciProvider.getName(), branch);

//configure branch based on GitHubAction' env variable
IdentifyGitBranchTask identifyBranch = (IdentifyGitBranchTask) project.getTasks().getByName(GitBranchPlugin.IDENTIFY_GIT_BRANCH);
if (!StringUtil.isEmpty(branch)) {
identifyBranch.setBranch(branch);
}

//set the branch to be checked out on ci build
final GitCheckOutTask checkout = (GitCheckOutTask) project.getTasks().getByName(GitSetupPlugin.CHECKOUT_TASK);
checkout.setRev(branch);
LazyConfiguration.lazyConfiguration(checkout, new Runnable() {
public void run() {
BasicValidator.notNull(checkout.getRev(),
"Task " + checkout.getPath() + " does not know the target revision to check out.\n" +
"In '" + ciProvider.getName() + "' builds, it is automatically configured from " + ciProvider.getBranchDescription() + "\n" +
"Alternatively, you can set the task's 'rev' property explicitly.");
}
});

final boolean isPullRequest = ciProvider.isPullRequest();
LOG.info("Pull request from '{}': {}", ciProvider.getName(), isPullRequest);

final String commitMessage = ciProvider.getCommitMessage();

project.getTasks().withType(ReleaseNeededTask.class, new Action<ReleaseNeededTask>() {
public void execute(ReleaseNeededTask t) {
t.setCommitMessage(commitMessage);
t.setPullRequest(isPullRequest);
}
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.shipkit.internal.gradle.release;

public interface CiProvider {

String getName();

String getCommitMessage();

boolean isPullRequest();

String getBranch();

String getBranchDescription();
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
public class ShipkitBasePlugin implements Plugin<Project> {

public void apply(final Project project) {
project.getPlugins().apply(TravisPlugin.class);
project.getPlugins().apply(CiPlugin.class);
project.getPlugins().apply(BintrayReleasePlugin.class);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package org.shipkit.internal.gradle.release.ci;

import org.apache.commons.lang.StringUtils;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import org.shipkit.gradle.configuration.ShipkitConfiguration;
import org.shipkit.gradle.git.IdentifyGitBranchTask;
import org.shipkit.gradle.release.ReleaseNeededTask;
import org.shipkit.internal.gradle.configuration.BasicValidator;
import org.shipkit.internal.gradle.git.GitBranchPlugin;
import org.shipkit.internal.gradle.git.GitSetupPlugin;
import org.shipkit.internal.gradle.git.tasks.GitCheckOutTask;
import org.shipkit.internal.gradle.release.CiProvider;
import org.shipkit.internal.gradle.release.CiReleasePlugin;
import org.shipkit.internal.gradle.release.ReleaseNeededPlugin;

/**
* Configures the release automation to be used with any CI. Intended for root project.
* <p>
* Applies:
* <ul>
* <li>{@link CiReleasePlugin}</li>
* </ul>
* Adds behavior:
* <ul>
* <li>Configures {@link GitBranchPlugin}/{@link IdentifyGitBranchTask}
* so that the branch information is taken from 'CI_BRANCH' env variable.</li>
* <li>Configures {@link GitSetupPlugin}/{@link GitCheckOutTask}
* so that it checks out the branch specified in env variable.</li>
* <li>Configures {@link ReleaseNeededPlugin}/{@link ReleaseNeededTask}
* so that it uses information from 'CI_PULL_REQUEST' and 'CI_COMMIT_MESSAGE' env variables.</li>
* </ul>
*/
public class GenericProvider implements CiProvider {

public static final String NAME = "Generic CI";
private static final Logger LOG = Logging.getLogger(GenericProvider.class);

private final String name;

public GenericProvider(ShipkitConfiguration conf) {
BasicValidator.notNull(conf.getCiManagement().getUrl(),
"You are using the Generic Ci Provider and did not define a CI url!\n"
+ "Please set the 'ciManagement.url' in your 'shipkit.gradle'");
name = StringUtils.defaultIfEmpty(conf.getCiManagement().getSystem(), NAME);
}

@Override
public String getName() {
return name;
}

@Override
public String getCommitMessage() {
return System.getenv("CI_COMMIT_MESSAGE");
}

@Override
public boolean isPullRequest() {
String pr = System.getenv("CI_PULL_REQUEST");
LOG.info("Pull request from 'CI_PULL_REQUEST' env variable: {}", pr);
return pr != null && !pr.trim().isEmpty() && !pr.equals("false");
}

@Override
public String getBranch() {
final String branch = System.getenv("CI_BRANCH");
LOG.info("Branch from 'CI_BRANCH' env variable: {}", branch);
return branch;
}

@Override
public String getBranchDescription() {
return "'CI_BRANCH' environment variable.\n" +
"If you are trying to run this task outside a CI, you can export the environment variable.\n";
}
}
Loading