projen
Version:
CDK for software projects
91 lines • 10.7 kB
JavaScript
;
var _a;
Object.defineProperty(exports, "__esModule", { value: true });
exports.AutoMerge = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const component_1 = require("../component");
/**
* Automatically merge Pull Requests using Mergify
*
* > [!NOTE]
* > GitHub now natively provides the same features, so you don't need Mergify
* > anymore. See `GitHubOptions.mergeQueue` and `MergeQueueOptions.autoQueue`.
*
* If `buildJob` is specified, the specified GitHub workflow job ID is required
* to succeed in order for the PR to be merged.
*
* `approvedReviews` specified the number of code review approvals required for
* the PR to be merged.
*
* @see https://mergify.com/
*/
class AutoMerge extends component_1.Component {
constructor(github, options = {}) {
super(github.project);
this.lazyConditions = new Array();
const mergify = github.mergify;
if (!mergify) {
throw new Error("auto merging requires mergify to be enabled");
}
const blockingLabels = options.blockingLabels ?? ["do-not-merge"];
const blockingCondition = blockingLabels?.length
? [`-label~=(${blockingLabels.join("|")})`]
: [];
const mergeAction = {
delete_head_branch: {},
queue: {
name: "default",
},
};
const approvedReviews = options.approvedReviews ?? 1;
// add initial conditions (additional conditions can be added later)
this.addConditions(`#approved-reviews-by>=${approvedReviews}`);
this.addConditions(...blockingCondition);
const ruleName = options.ruleName ?? "Automatic merge on approval and successful build";
const queueName = options.queueName ?? "default";
mergify.addRule({
name: ruleName,
actions: mergeAction,
conditions: (() => this.renderConditions()),
});
mergify.addQueue({
name: queueName,
updateMethod: "merge",
queueConditions: (() => this.renderConditions()),
// squash all commits into a single commit when merging
mergeMethod: "squash",
// use PR title+body as the commit message
commitMessageTemplate: [
"{{ title }} (#{{ number }})",
"",
"{{ body }}",
].join("\n"),
});
this.project.addPackageIgnore("/.mergify.yml");
}
/**
* Adds conditions to the auto merge rule.
* @param conditions The conditions to add (mergify syntax)
*/
addConditions(...conditions) {
this.addConditionsLater({ render: () => conditions });
}
/**
* Adds conditions that will be rendered only during synthesis.
* @param later The later
*/
addConditionsLater(later) {
this.lazyConditions.push(later);
}
renderConditions() {
const output = new Array();
for (const later of this.lazyConditions) {
output.push(...later.render());
}
return output;
}
}
exports.AutoMerge = AutoMerge;
_a = JSII_RTTI_SYMBOL_1;
AutoMerge[_a] = { fqn: "projen.github.AutoMerge", version: "0.95.2" };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0by1tZXJnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9naXRodWIvYXV0by1tZXJnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLDRDQUF5QztBQTRCekM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFhLFNBQVUsU0FBUSxxQkFBUztJQUd0QyxZQUFZLE1BQWMsRUFBRSxVQUE0QixFQUFFO1FBQ3hELEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFIUCxtQkFBYyxHQUFHLElBQUksS0FBSyxFQUF1QixDQUFDO1FBS2pFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7UUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFFRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbEUsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLEVBQUUsTUFBTTtZQUM5QyxDQUFDLENBQUMsQ0FBQyxZQUFZLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUMzQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVAsTUFBTSxXQUFXLEdBQUc7WUFDbEIsa0JBQWtCLEVBQUUsRUFBRTtZQUV0QixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLFNBQVM7YUFDaEI7U0FDRixDQUFDO1FBRUYsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGVBQWUsSUFBSSxDQUFDLENBQUM7UUFFckQsb0VBQW9FO1FBQ3BFLElBQUksQ0FBQyxhQUFhLENBQUMseUJBQXlCLGVBQWUsRUFBRSxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLGlCQUFpQixDQUFDLENBQUM7UUFFekMsTUFBTSxRQUFRLEdBQ1osT0FBTyxDQUFDLFFBQVEsSUFBSSxrREFBa0QsQ0FBQztRQUN6RSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQztRQUVqRCxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ2QsSUFBSSxFQUFFLFFBQVE7WUFDZCxPQUFPLEVBQUUsV0FBVztZQUNwQixVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBUTtTQUNuRCxDQUFDLENBQUM7UUFFSCxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ2YsSUFBSSxFQUFFLFNBQVM7WUFDZixZQUFZLEVBQUUsT0FBTztZQUNyQixlQUFlLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBUTtZQUN2RCx1REFBdUQ7WUFDdkQsV0FBVyxFQUFFLFFBQVE7WUFDckIsMENBQTBDO1lBQzFDLHFCQUFxQixFQUFFO2dCQUNyQiw2QkFBNkI7Z0JBQzdCLEVBQUU7Z0JBQ0YsWUFBWTthQUNiLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNiLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWEsQ0FBQyxHQUFHLFVBQW9CO1FBQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSSxrQkFBa0IsQ0FBQyxLQUEwQjtRQUNsRCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFFbkMsS0FBSyxNQUFNLEtBQUssSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQWpGSCw4QkFrRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBHaXRIdWIgfSBmcm9tIFwiLi9naXRodWJcIjtcbmltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gXCIuLi9jb21wb25lbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBBdXRvTWVyZ2VPcHRpb25zIHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiBhcHByb3ZlZCBjb2RlIHJldmlld3MuXG4gICAqIEBkZWZhdWx0IDFcbiAgICovXG4gIHJlYWRvbmx5IGFwcHJvdmVkUmV2aWV3cz86IG51bWJlcjtcblxuICAvKipcbiAgICogTGlzdCBvZiBsYWJlbHMgdGhhdCB3aWxsIHByZXZlbnQgYXV0by1tZXJnaW5nLlxuICAgKiBAZGVmYXVsdCBbJ2RvLW5vdC1tZXJnZSddXG4gICAqL1xuICByZWFkb25seSBibG9ja2luZ0xhYmVscz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBtZXJnaWZ5IHJ1bGVcbiAgICogQGRlZmF1bHQgJ0F1dG9tYXRpYyBtZXJnZSBvbiBhcHByb3ZhbCBhbmQgc3VjY2Vzc2Z1bCBidWlsZCdcbiAgICovXG4gIHJlYWRvbmx5IHJ1bGVOYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBtZXJnaWZ5IHF1ZXVlXG4gICAqIEBkZWZhdWx0ICdkZWZhdWx0J1xuICAgKi9cbiAgcmVhZG9ubHkgcXVldWVOYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEF1dG9tYXRpY2FsbHkgbWVyZ2UgUHVsbCBSZXF1ZXN0cyB1c2luZyBNZXJnaWZ5XG4gKlxuICogPiBbIU5PVEVdXG4gKiA+IEdpdEh1YiBub3cgbmF0aXZlbHkgcHJvdmlkZXMgdGhlIHNhbWUgZmVhdHVyZXMsIHNvIHlvdSBkb24ndCBuZWVkIE1lcmdpZnlcbiAqID4gYW55bW9yZS4gU2VlIGBHaXRIdWJPcHRpb25zLm1lcmdlUXVldWVgIGFuZCBgTWVyZ2VRdWV1ZU9wdGlvbnMuYXV0b1F1ZXVlYC5cbiAqXG4gKiBJZiBgYnVpbGRKb2JgIGlzIHNwZWNpZmllZCwgdGhlIHNwZWNpZmllZCBHaXRIdWIgd29ya2Zsb3cgam9iIElEIGlzIHJlcXVpcmVkXG4gKiB0byBzdWNjZWVkIGluIG9yZGVyIGZvciB0aGUgUFIgdG8gYmUgbWVyZ2VkLlxuICpcbiAqIGBhcHByb3ZlZFJldmlld3NgIHNwZWNpZmllZCB0aGUgbnVtYmVyIG9mIGNvZGUgcmV2aWV3IGFwcHJvdmFscyByZXF1aXJlZCBmb3JcbiAqIHRoZSBQUiB0byBiZSBtZXJnZWQuXG4gKlxuICogQHNlZSBodHRwczovL21lcmdpZnkuY29tL1xuICovXG5leHBvcnQgY2xhc3MgQXV0b01lcmdlIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBsYXp5Q29uZGl0aW9ucyA9IG5ldyBBcnJheTxJQWRkQ29uZGl0aW9uc0xhdGVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKGdpdGh1YjogR2l0SHViLCBvcHRpb25zOiBBdXRvTWVyZ2VPcHRpb25zID0ge30pIHtcbiAgICBzdXBlcihnaXRodWIucHJvamVjdCk7XG5cbiAgICBjb25zdCBtZXJnaWZ5ID0gZ2l0aHViLm1lcmdpZnk7XG4gICAgaWYgKCFtZXJnaWZ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdXRvIG1lcmdpbmcgcmVxdWlyZXMgbWVyZ2lmeSB0byBiZSBlbmFibGVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IGJsb2NraW5nTGFiZWxzID0gb3B0aW9ucy5ibG9ja2luZ0xhYmVscyA/PyBbXCJkby1ub3QtbWVyZ2VcIl07XG4gICAgY29uc3QgYmxvY2tpbmdDb25kaXRpb24gPSBibG9ja2luZ0xhYmVscz8ubGVuZ3RoXG4gICAgICA/IFtgLWxhYmVsfj0oJHtibG9ja2luZ0xhYmVscy5qb2luKFwifFwiKX0pYF1cbiAgICAgIDogW107XG5cbiAgICBjb25zdCBtZXJnZUFjdGlvbiA9IHtcbiAgICAgIGRlbGV0ZV9oZWFkX2JyYW5jaDoge30sXG5cbiAgICAgIHF1ZXVlOiB7XG4gICAgICAgIG5hbWU6IFwiZGVmYXVsdFwiLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgYXBwcm92ZWRSZXZpZXdzID0gb3B0aW9ucy5hcHByb3ZlZFJldmlld3MgPz8gMTtcblxuICAgIC8vIGFkZCBpbml0aWFsIGNvbmRpdGlvbnMgKGFkZGl0aW9uYWwgY29uZGl0aW9ucyBjYW4gYmUgYWRkZWQgbGF0ZXIpXG4gICAgdGhpcy5hZGRDb25kaXRpb25zKGAjYXBwcm92ZWQtcmV2aWV3cy1ieT49JHthcHByb3ZlZFJldmlld3N9YCk7XG4gICAgdGhpcy5hZGRDb25kaXRpb25zKC4uLmJsb2NraW5nQ29uZGl0aW9uKTtcblxuICAgIGNvbnN0IHJ1bGVOYW1lID1cbiAgICAgIG9wdGlvbnMucnVsZU5hbWUgPz8gXCJBdXRvbWF0aWMgbWVyZ2Ugb24gYXBwcm92YWwgYW5kIHN1Y2Nlc3NmdWwgYnVpbGRcIjtcbiAgICBjb25zdCBxdWV1ZU5hbWUgPSBvcHRpb25zLnF1ZXVlTmFtZSA/PyBcImRlZmF1bHRcIjtcblxuICAgIG1lcmdpZnkuYWRkUnVsZSh7XG4gICAgICBuYW1lOiBydWxlTmFtZSxcbiAgICAgIGFjdGlvbnM6IG1lcmdlQWN0aW9uLFxuICAgICAgY29uZGl0aW9uczogKCgpID0+IHRoaXMucmVuZGVyQ29uZGl0aW9ucygpKSBhcyBhbnksXG4gICAgfSk7XG5cbiAgICBtZXJnaWZ5LmFkZFF1ZXVlKHtcbiAgICAgIG5hbWU6IHF1ZXVlTmFtZSxcbiAgICAgIHVwZGF0ZU1ldGhvZDogXCJtZXJnZVwiLFxuICAgICAgcXVldWVDb25kaXRpb25zOiAoKCkgPT4gdGhpcy5yZW5kZXJDb25kaXRpb25zKCkpIGFzIGFueSxcbiAgICAgIC8vIHNxdWFzaCBhbGwgY29tbWl0cyBpbnRvIGEgc2luZ2xlIGNvbW1pdCB3aGVuIG1lcmdpbmdcbiAgICAgIG1lcmdlTWV0aG9kOiBcInNxdWFzaFwiLFxuICAgICAgLy8gdXNlIFBSIHRpdGxlK2JvZHkgYXMgdGhlIGNvbW1pdCBtZXNzYWdlXG4gICAgICBjb21taXRNZXNzYWdlVGVtcGxhdGU6IFtcbiAgICAgICAgXCJ7eyB0aXRsZSB9fSAoI3t7IG51bWJlciB9fSlcIixcbiAgICAgICAgXCJcIixcbiAgICAgICAgXCJ7eyBib2R5IH19XCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2plY3QuYWRkUGFja2FnZUlnbm9yZShcIi8ubWVyZ2lmeS55bWxcIik7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBjb25kaXRpb25zIHRvIHRoZSBhdXRvIG1lcmdlIHJ1bGUuXG4gICAqIEBwYXJhbSBjb25kaXRpb25zIFRoZSBjb25kaXRpb25zIHRvIGFkZCAobWVyZ2lmeSBzeW50YXgpXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9ucyguLi5jb25kaXRpb25zOiBzdHJpbmdbXSkge1xuICAgIHRoaXMuYWRkQ29uZGl0aW9uc0xhdGVyKHsgcmVuZGVyOiAoKSA9PiBjb25kaXRpb25zIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgY29uZGl0aW9ucyB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgb25seSBkdXJpbmcgc3ludGhlc2lzLlxuICAgKiBAcGFyYW0gbGF0ZXIgVGhlIGxhdGVyXG4gICAqL1xuICBwdWJsaWMgYWRkQ29uZGl0aW9uc0xhdGVyKGxhdGVyOiBJQWRkQ29uZGl0aW9uc0xhdGVyKSB7XG4gICAgdGhpcy5sYXp5Q29uZGl0aW9ucy5wdXNoKGxhdGVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyQ29uZGl0aW9ucygpIHtcbiAgICBjb25zdCBvdXRwdXQgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBsYXRlciBvZiB0aGlzLmxhenlDb25kaXRpb25zKSB7XG4gICAgICBvdXRwdXQucHVzaCguLi5sYXRlci5yZW5kZXIoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElBZGRDb25kaXRpb25zTGF0ZXIge1xuICByZW5kZXIoKTogc3RyaW5nW107XG59XG4iXX0=