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

Allow unstable branches to be merged #25

Merged
merged 8 commits into from
Mar 6, 2024
Merged
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
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ jobs:
with:
GITHUB_TOKEN: '${{ github.token }}'
MERGE_METHOD: "SQUASH"
ALLOW_UNSTABLE: true
```

#### Inputs
Expand All @@ -48,6 +49,10 @@ You can find all the inputs in [the action file](./action.yml), but let's walk t
- `ALLOWLIST`: List of user accounts which are allowed to use the bot aside from the author and org members.
- **Optional**
- Must be a comma separated value: `user-1,user-2,user-3`.
- `ALLOW_UNSTABLE`: If unstable, ready to merge, PRs can be merged
- An [unstable PR](https://docs.github.com/en/graphql/reference/enums#mergestatestatus) is a PR that can be merged, but a *non required status check* is failing.
- This is only relevant once the PR can be merged. GitHub's auto-merge always merges unstable PRs
- **Optional**: Defaults to `true`

## Usage

Expand Down
5 changes: 4 additions & 1 deletion action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,13 @@ inputs:
ALLOWLIST:
required: false
description: List of users which are allowed to use the bot. Separated by commas (abc,def,ghi)
ALLOW_UNSTABLE:
required: false
description: If unstable, ready to merge, PRs can be merged. Defaults to true
outputs:
repo:
description: 'The name of the repo in owner/repo pattern'

runs:
using: 'docker'
image: 'docker://ghcr.io/paritytech/auto-merge-bot/action:1.0.0'
image: 'docker://ghcr.io/paritytech/auto-merge-bot/action:1.0.1'
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "auto-merge-bot",
"version": "1.0.0",
"version": "1.0.1",
"description": "Bot which enables or disable auto-merge",
"main": "src/index.ts",
"scripts": {
Expand Down
23 changes: 19 additions & 4 deletions src/github/merger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,26 @@ export class Merger {
private readonly gql: typeof graphql,
private readonly logger: ActionLogger,
private readonly mergeMethod: PullRequestMergeMethod,
private readonly allowUnstable: boolean = false,
) {}

errorPermitsToMerge(error: Error): boolean {
// If it's clean it can be merged
if (error.message.includes("Pull request is in clean status")) {
return true;
}

// If it is unstable and allowed, it can also be merged
if (error.message.includes("Pull request is in unstable status")) {
this.logger.warn(
"PR is unstable! Some non required status checks are failing.",
);
return this.allowUnstable;
}

return false;
}

async enableAutoMerge(): Promise<void> {
try {
await this.gql<{
Expand All @@ -48,10 +66,7 @@ export class Merger {
this.logger.info("Succesfully enabled auto-merge");
} catch (error) {
this.logger.warn(error as Error);
if (
error instanceof Error &&
error.message.includes("Pull request is in clean status")
) {
if (error instanceof Error && this.errorPermitsToMerge(error)) {
this.logger.warn(
"Pull Request is ready to merge. Running merge command instead",
);
Expand Down
15 changes: 14 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,11 @@ const getMergeMethod = (): PullRequestMergeMethod => {
return method;
};

/** If it should allow PRs that have failed NON REQUIRED status check to be merged */
const getAllowUnstable = (): boolean => {
return getInput("ALLOW_UNSTABLE", { required: false }) !== "false";
};

const silentMode = getInput("SILENT", { required: false }) === "true";

logger.info(
Expand Down Expand Up @@ -80,7 +85,15 @@ if (context.payload.comment) {
const gql = getOctokit(token).graphql.defaults({
headers: { authorization: `token ${token}` },
}) as graphql;
const merger = new Merger(issue.node_id, gql, logger, getMergeMethod());
const mergeMethod = getMergeMethod();
const unstableAllowed = getAllowUnstable();
const merger = new Merger(
issue.node_id,
gql,
logger,
mergeMethod,
unstableAllowed,
);
const bot = new Bot(
comment,
issue,
Expand Down
Loading