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

[SHIPKIT-513] Automated commit message should have CI build ID #709

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
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
Expand Up @@ -21,25 +21,25 @@

/**
* Adds Git-specific tasks needed for the release process.
*
* <p>
* Applies plugins:
* <ul>
* <li>{@link ShipkitConfigurationPlugin}</li>
* <li>{@link GitBranchPlugin}</li>
* <li>{@link ShipkitConfigurationPlugin}</li>
* <li>{@link GitBranchPlugin}</li>
* </ul>
*
* <p>
* Adds tasks:
* <ul>
* <li>identifyGitBranch - {@link IdentifyGitBranchTask}</li>
* <li>gitCommit</li>
* <li>gitTag</li>
* <li>gitPush</li>
* <li>performGitPush - {@link GitPushTask}</li>
*
* <li>performGitCommitCleanUp</li>
* <li>gitSoftResetCommit</li>
* <li>gitStash</li>
* <li>gitTagCleanUp</li>
* <li>identifyGitBranch - {@link IdentifyGitBranchTask}</li>
* <li>gitCommit</li>
* <li>gitTag</li>
* <li>gitPush</li>
* <li>performGitPush - {@link GitPushTask}</li>
* <p>
* <li>performGitCommitCleanUp</li>
* <li>gitSoftResetCommit</li>
* <li>gitStash</li>
* <li>gitTagCleanUp</li>
* </ul>
*/
public class GitPlugin implements Plugin<Project> {
Expand All @@ -61,7 +61,9 @@ public void execute(final GitCommitTask t) {
t.setDescription("Commits all changed files using generic --author and aggregated commit message");
t.setGitUserName(conf.getGit().getUser());
t.setGitUserEmail(conf.getGit().getEmail());
t.setCommitMessagePostfix(conf.getGit().getCommitMessagePostfix());
if (t.getCommitMessagePostfix() == null) {
t.setCommitMessagePostfix(conf.getGit().getCommitMessagePostfix());
}
}
});

Expand Down Expand Up @@ -89,12 +91,12 @@ public void execute(final GitPushTask t) {
t.setSecretValue(info.getWriteToken());

project.getPlugins().apply(GitBranchPlugin.class)
.provideBranchTo(t, new Action<String>() {
@Override
public void execute(String branch) {
t.getTargets().add(branch);
}
});
.provideBranchTo(t, new Action<String>() {
@Override
public void execute(String branch) {
t.getTargets().add(branch);
}
});
}
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,22 @@
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.GitCommitTask;
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.GitPlugin;
import org.shipkit.internal.gradle.git.GitSetupPlugin;
import org.shipkit.internal.gradle.git.tasks.GitCheckOutTask;
import org.shipkit.internal.gradle.util.StringUtil;

import static java.lang.System.getenv;
import static org.shipkit.internal.gradle.util.TravisCommitMessageUtils.decorateCommitMessagePostfix;

/**
* Configures the release automation to be used with Travis CI.
* Intended for root project.
Expand All @@ -28,6 +35,8 @@
* so that the branch information is taken from 'TRAVIS_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 GitSetupPlugin}/{@link org.shipkit.gradle.git.GitCommitTask}
* so that it enrich commit postfix with url to Travis build</li>
* <li>Configures {@link ReleaseNeededPlugin}/{@link ReleaseNeededTask}
* so that it uses information from 'TRAVIS_PULL_REQUEST' and 'TRAVIS_COMMIT_MESSAGE' env variables.</li>
* </ul>
Expand All @@ -39,6 +48,7 @@ public class TravisPlugin implements Plugin<Project> {
@Override
public void apply(final Project project) {
project.getPlugins().apply(CiReleasePlugin.class);
final ShipkitConfiguration conf = project.getPlugins().apply(ShipkitConfigurationPlugin.class).getConfiguration();

final String branch = System.getenv("TRAVIS_BRANCH");
LOG.info("Branch from 'TRAVIS_BRANCH' env variable: {}", branch);
Expand All @@ -52,27 +62,28 @@ public void apply(final Project project) {
//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 Travis CI builds, it is automatically configured from 'TRAVIS_BRANCH' environment variable.\n" +
"If you are trying to run this task outside Travis, you can export the environment variable.\n" +
"Alternatively, you can set the task's 'rev' property explicitly.");
}
});
LazyConfiguration.lazyConfiguration(checkout, () -> BasicValidator.notNull(checkout.getRev(),
"Task " + checkout.getPath() + " does not know the target revision to check out.\n" +
"In Travis CI builds, it is automatically configured from 'TRAVIS_BRANCH' environment variable.\n" +
"If you are trying to run this task outside Travis, you can export the environment variable.\n" +
"Alternatively, you can set the task's 'rev' property explicitly."));

//update release needed task based on Travis' env variables
String pr = System.getenv("TRAVIS_PULL_REQUEST");
String buildNumber = getenv("TRAVIS_BUILD_NUMBER");
LOG.info("Pull request from 'TRAVIS_PULL_REQUEST' env variable: {}", pr);
final boolean isPullRequest = pr != null && !pr.trim().isEmpty() && !pr.equals("false");
LOG.info("Pull request build: {}", isPullRequest);
String commitMessage = decorateCommitMessagePostfix(conf, buildNumber);

GitCommitTask gitCommitTask = (GitCommitTask) project.getTasks().getByName(GitPlugin.GIT_COMMIT_TASK);
if (!StringUtil.isEmpty(commitMessage)) {
gitCommitTask.setCommitMessagePostfix(commitMessage);
}

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

import org.shipkit.gradle.configuration.ShipkitConfiguration;

public class TravisCommitMessageUtils {
private static final String URL_PATTERN = "https://travis-ci.org/%s/builds/%s";

public static String decorateCommitMessagePostfix(ShipkitConfiguration conf, String travisBuildNumber) {
if (!StringUtil.isEmpty(travisBuildNumber)) {
return getTravisCommitMessagePostfix(conf, travisBuildNumber);
}

return conf.getGit().getCommitMessagePostfix();
}

private static String getTravisCommitMessagePostfix(ShipkitConfiguration conf, String travisBuildNumber) {
String travisJobUrl = generateTravisBuildUrl(conf, travisBuildNumber);
return String.format("CI job: %s %s", travisJobUrl, conf.getGit().getCommitMessagePostfix());
}

private static String generateTravisBuildUrl(ShipkitConfiguration conf, String travisBuildNumber) {
return String.format(URL_PATTERN, conf.getGitHub().getRepository(), travisBuildNumber);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.shipkit.internal.gradle.git

import org.shipkit.gradle.git.GitCommitTask
import org.shipkit.gradle.git.GitPushTask
import testutil.PluginSpecification

Expand All @@ -22,4 +23,16 @@ class GitPluginTest extends PluginSpecification {
gitPush.url == "https://dummy:foo@github.com/my-repo.git"
gitPush.secretValue == "foo"
}

def "configures git commit"() {
conf.gitHub.repository = 'my-repo'
conf.gitHub.writeAuthToken = 'foo'

when:
project.plugins.apply(GitPlugin)

then:
GitCommitTask gitCommit = project.tasks[GitPlugin.GIT_COMMIT_TASK]
gitCommit.commitMessagePostfix == "[ci skip]"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package org.shipkit.internal.gradle.util

import spock.lang.Specification

import org.shipkit.gradle.configuration.ShipkitConfiguration

class TravisCommitMessageUtilsTest extends Specification {

def "should build travis url with [ci skip]"() {
given:
ShipkitConfiguration shipkitConfiguration = Mock(ShipkitConfiguration)
ShipkitConfiguration.GitHub gitHub = Mock(ShipkitConfiguration.GitHub)
ShipkitConfiguration.Git git = Mock(ShipkitConfiguration.Git)
shipkitConfiguration.getGitHub() >> gitHub
shipkitConfiguration.getGit() >> git
1 * git.commitMessagePostfix >> "[ci skip]"
1 * gitHub.getRepository() >> "mockito/shipkit"
0 * _
when:
def url = TravisCommitMessageUtils.decorateCommitMessagePostfix(shipkitConfiguration, "123")
then:
url == "CI job: https://travis-ci.org/mockito/shipkit/builds/123 [ci skip]"
}

def "should build postfix without travis url if blank build number"() {
given:
ShipkitConfiguration shipkitConfiguration = Mock(ShipkitConfiguration)
ShipkitConfiguration.GitHub gitHub = Mock(ShipkitConfiguration.GitHub)
ShipkitConfiguration.Git git = Mock(ShipkitConfiguration.Git)
shipkitConfiguration.getGitHub() >> gitHub
shipkitConfiguration.getGit() >> git

1 * git.commitMessagePostfix >> "[ci skip]"
0 * _
when:
def url = TravisCommitMessageUtils.decorateCommitMessagePostfix(shipkitConfiguration, "")
then:
url == "[ci skip]"
}
}