Skip to content

Enable customization of the publication step #631

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

Open
wants to merge 1 commit 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
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,24 @@ This plugin updates `gradle.properties` to bump up project version. If you want
},
```

## Configure `gradle-semantic-release-plugin`

The plugin offers some configuration options to customize its default behavior. You can configure your `package.json` like below:

```json
"release": {
"plugins": [
[
"gradle-semantic-release-plugin",
{
"skipPublishing": true, // Decide whether the publication task should run during the execution
"publicationTask": "jib" // Configure a custom publication task
}
]
]
},
```

# Gradle Properties

## Publish Properties
Expand Down
17 changes: 17 additions & 0 deletions src/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Signale } from "signale";
import { PluginConfig } from "./definition";
import { autoDetectPublicationTask } from "./gradle";

export async function getTaskToPublish(
pluginConfig: PluginConfig,
cwd: string,
env: NodeJS.ProcessEnv,
logger: Signale,
) {
const customTask = pluginConfig.publicationTask;
if (customTask) {
return [customTask];
}

return autoDetectPublicationTask(cwd, env, logger);
}
5 changes: 5 additions & 0 deletions src/definition.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,8 @@ export interface IContext {
nextRelease: INextRelease;
logger: Signale;
}

export type PluginConfig = {
publicationTask?: string;
skipPublishing?: boolean;
};
4 changes: 2 additions & 2 deletions src/gradle.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export function getCommand(cwd: string): Promise<string> {
* @param {string} cwd the path of current working directory
* @return A promise that resolves name of task to publish artifact
*/
export function getTaskToPublish(
export function autoDetectPublicationTask(
cwd: string,
env: NodeJS.ProcessEnv,
logger: Signale,
Expand Down Expand Up @@ -186,12 +186,12 @@ export function buildOptions(env: NodeJS.ProcessEnv): string[] {

export function publishArtifact(
cwd: string,
task: string[],
env: NodeJS.ProcessEnv,
logger: Signale,
) {
return new Promise(async (resolve, reject) => {
const command = getCommand(cwd);
const task = await getTaskToPublish(cwd, env, logger);
const options = [...task, "-q"].concat(buildOptions(env));
logger.info(`launching child process with options: ${options.join(" ")}`);
const child = spawn(await command, options, { cwd, env });
Expand Down
2 changes: 1 addition & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
module.exports = {
prepare: require("./prepare").default,
publish: require("./publish"),
publish: require("./publish").default,
verifyConditions: require("./verify-conditions"),
};
22 changes: 17 additions & 5 deletions src/publish.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,22 @@
import { IContext } from "./definition";
import { getTaskToPublish } from "./config";
import { IContext, PluginConfig } from "./definition";
import { publishArtifact } from "./gradle";

module.exports = async function publish(
pluginConfig: object,
export default async function publish(
pluginConfig: PluginConfig,
context: IContext,
) {
const { cwd, env, logger } = context;
await publishArtifact(cwd, env as NodeJS.ProcessEnv, logger);
};

if (pluginConfig.skipPublishing) {
return;
}

const task = await getTaskToPublish(
pluginConfig,
cwd,
env as NodeJS.ProcessEnv,
logger,
);
await publishArtifact(cwd, task, env as NodeJS.ProcessEnv, logger);
}
21 changes: 15 additions & 6 deletions src/verify-conditions.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,27 @@
import { IContext } from "./definition";
import { getCommand, getTaskToPublish } from "./gradle";
import { getTaskToPublish } from "./config";
import { IContext, PluginConfig } from "./definition";
import { getCommand } from "./gradle";

module.exports = async function verifyConditions(
pluginConfig: object,
pluginConfig: PluginConfig,
context: IContext,
) {
const { cwd, env, logger } = context;
const command = await getCommand(cwd);
if (command !== "./gradlew") {
throw new Error(`Gradle wrapper not found at ${cwd}`);
}
const task = await getTaskToPublish(cwd, env as NodeJS.ProcessEnv, logger);
if (task.length === 0) {
throw new Error("No task found that can publish artifacts");

if (!pluginConfig.skipPublishing) {
const task = await getTaskToPublish(
pluginConfig,
cwd,
env as NodeJS.ProcessEnv,
logger,
);
if (task.length === 0) {
throw new Error("No task found that can publish artifacts");
}
}
logger.debug("Verified conditions, and found no problem");
};
39 changes: 39 additions & 0 deletions test/src/config.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { join } from "path";
import { cwd } from "process";
import { Signale } from "signale";
import { getTaskToPublish } from "../../src/config";
import { describe, expect, it, jest } from "@jest/globals";

describe("Test for config handling", function () {
jest.setTimeout(60000);
describe("getTaskToPublish()", () => {
it("returns 'jib' when custom task is set", async () => {
const gradleProject = join(
cwd(),
"test/project/with-maven-publish-plugin",
);
const task = await getTaskToPublish(
{
publicationTask: "jib",
},
gradleProject,
process.env,
new Signale(),
);
expect(task).toEqual(["jib"]);
});
it("returns 'publish' when it should auto detect", async () => {
const gradleProject = join(
cwd(),
"test/project/with-maven-publish-plugin",
);
const task = await getTaskToPublish(
{},
gradleProject,
process.env,
new Signale(),
);
expect(task).toEqual(["publish"]);
});
});
});
21 changes: 11 additions & 10 deletions test/src/gradle.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import { cwd } from "process";
import { sync as rmdir } from "rimraf";
import { Signale } from "signale";
import {
autoDetectPublicationTask,
buildOptions,
getCommand,
getTaskToPublish,
getVersion,
publishArtifact,
} from "../../src/gradle";
Expand All @@ -26,10 +26,10 @@ describe("Test for gradle handling", function () {
});
});

describe("getTaskToPublish()", () => {
describe("autoDetectPublicationTask()", () => {
it("returns empty array when there is no task to publish", async () => {
const gradleProject = join(cwd(), "test/project/without-plugin");
const task = await getTaskToPublish(
const task = await autoDetectPublicationTask(
gradleProject,
process.env,
new Signale(),
Expand All @@ -41,7 +41,7 @@ describe("Test for gradle handling", function () {
cwd(),
"test/project/with-maven-publish-plugin",
);
const task = await getTaskToPublish(
const task = await autoDetectPublicationTask(
gradleProject,
process.env,
new Signale(),
Expand All @@ -50,7 +50,7 @@ describe("Test for gradle handling", function () {
});
it.skip("returns 'uploadArchives' when there is available legacy publishing method", async () => {
const gradleProject = join(cwd(), "test/project/with-legacy-publishing");
const task = await getTaskToPublish(
const task = await autoDetectPublicationTask(
gradleProject,
process.env,
new Signale(),
Expand All @@ -59,7 +59,7 @@ describe("Test for gradle handling", function () {
});
it("returns 'artifactoryDeploy' when there is available artifactory-plugin", async () => {
const gradleProject = join(cwd(), "test/project/with-artifactory-plugin");
const task = await getTaskToPublish(
const task = await autoDetectPublicationTask(
gradleProject,
process.env,
new Signale(),
Expand All @@ -71,7 +71,7 @@ describe("Test for gradle handling", function () {
cwd(),
"test/project/with-plugin-publish-plugin",
);
const task = await getTaskToPublish(
const task = await autoDetectPublicationTask(
gradleProject,
process.env,
new Signale(),
Expand All @@ -83,7 +83,7 @@ describe("Test for gradle handling", function () {
cwd(),
"test/project/with-plugin-publish-and-maven-publish",
);
const task = await getTaskToPublish(
const task = await autoDetectPublicationTask(
gradleProject,
process.env,
new Signale(),
Expand All @@ -92,7 +92,7 @@ describe("Test for gradle handling", function () {
});
it("returns 'publishToSonatype' when there is available gradle-nexus", async () => {
const gradleProject = join(cwd(), "test/project/with-gradle-nexus");
const task = await getTaskToPublish(
const task = await autoDetectPublicationTask(
gradleProject,
process.env,
new Signale(),
Expand Down Expand Up @@ -124,7 +124,8 @@ describe("Test for gradle handling", function () {

it("runs 'publish' task", async () => {
const gradleProject = join(cwd(), "test/project/with-publish");
await publishArtifact(gradleProject, process.env, new Signale());
const task = ["publish"];
await publishArtifact(gradleProject, task, process.env, new Signale());
const file = join(
gradleProject,
"build/repo/com/example/project/1.0/project-1.0.jar",
Expand Down
16 changes: 16 additions & 0 deletions test/src/publish.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { describe, expect, it, jest } from "@jest/globals";
import * as gradle from "../../src/gradle";
import * as publish from "../../src/publish";

describe("publish()", () => {
const publishSpy = jest.spyOn(gradle, "publishArtifact");
it("will skip publication if configured", () => {
publish.default(
{
skipPublishing: true,
},
{} as any,
);
expect(publishSpy).not.toBeCalled();
});
});