@xpertss/projen-types 0.0.0 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1083 -92
- package/API.md +7459 -4313
- package/README.md +103 -1
- package/lib/actions/action-build-workflow.d.ts +17 -0
- package/lib/actions/action-build-workflow.js +52 -0
- package/lib/actions/action-dogfood-workflow.d.ts +47 -0
- package/lib/actions/action-dogfood-workflow.js +84 -0
- package/lib/actions/action-sonar-workflow.d.ts +25 -0
- package/lib/actions/action-sonar-workflow.js +64 -0
- package/lib/actions/github-action-project.d.ts +60 -0
- package/lib/actions/github-action-project.js +155 -0
- package/lib/cdk/app-runtime-scaffold.js +1 -1
- package/lib/cdk/cdk-app-project.js +2 -4
- package/lib/cdk/cdk-infra-project.js +1 -1
- package/lib/cdk/cdk-typescript-base.js +16 -3
- package/lib/cdk/components/ecr-ecs-constructs.js +1 -1
- package/lib/cdk/components/edge-networking-constructs.js +1 -1
- package/lib/cdk/database-component.js +1 -1
- package/lib/cdk/options.d.ts +0 -2
- package/lib/cdk/options.js +1 -1
- package/lib/common/actions-allowlist-guard.d.ts +37 -0
- package/lib/common/actions-allowlist-guard.js +70 -0
- package/lib/common/internal-actions.d.ts +10 -0
- package/lib/common/internal-actions.js +33 -0
- package/lib/common/manual-deploy-workflow.d.ts +0 -2
- package/lib/common/manual-deploy-workflow.js +1 -12
- package/lib/common/projen-drift-check-workflow.d.ts +36 -0
- package/lib/common/projen-drift-check-workflow.js +73 -0
- package/lib/common/upgrade-workflow.js +6 -2
- package/lib/common/workflow-change-notice-workflow.d.ts +33 -0
- package/lib/common/workflow-change-notice-workflow.js +58 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +9 -1
- package/lib/java/components/cdk-deploy-hook.js +1 -1
- package/lib/java/components/code-index-workflow.js +1 -1
- package/lib/java/components/docker-publish.js +1 -1
- package/lib/java/components/flyway-migration.js +1 -1
- package/lib/java/components/github-packages-publish.js +1 -1
- package/lib/java/components/maven-central-publish.js +1 -1
- package/lib/java/java-app-project.js +1 -1
- package/lib/java/java-library-project.js +1 -1
- package/lib/java/java-maven-base.js +13 -4
- package/lib/java/java-service-project.js +1 -1
- package/package.json +1 -1
- package/release-publishing.md +125 -0
- package/lib/common/drift-check.d.ts +0 -8
- package/lib/common/drift-check.js +0 -18
- package/spec/npm-publishing-setup.md +0 -150
- package/spec/projen-cdk-spec.md +0 -80
- package/spec/projen-java-spec.md +0 -96
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Component, github } from 'projen';
|
|
2
|
+
/**
|
|
3
|
+
* PR-triggered check that rejects direct edits to projen-managed files.
|
|
4
|
+
*
|
|
5
|
+
* Re-runs the project's synth command on the PR head and fails if the
|
|
6
|
+
* regenerated output no longer matches what's committed - i.e. someone
|
|
7
|
+
* hand-edited a generated file (package.json / pom.xml /
|
|
8
|
+
* .github/workflows/*.yml / ...) instead of going through `.projenrc.ts`.
|
|
9
|
+
*
|
|
10
|
+
* Runs on `pull_request` so it genuinely executes the PR's own code (the
|
|
11
|
+
* only way to detect drift) - and therefore, by necessity, a PR author can
|
|
12
|
+
* disable it within their own PR. That residual exposure is bounded by
|
|
13
|
+
* `WorkflowChangeNoticeWorkflow` (Check 2), which is tamper-proof and flags
|
|
14
|
+
* any touch to `.github/workflows/**`. See the F003 spec's Security section.
|
|
15
|
+
*/
|
|
16
|
+
export interface ProjenDriftCheckWorkflowOptions {
|
|
17
|
+
/**
|
|
18
|
+
* The command that regenerates the project from `.projenrc.ts`.
|
|
19
|
+
* @default "npx projen"
|
|
20
|
+
*/
|
|
21
|
+
readonly projenCommand?: string;
|
|
22
|
+
/**
|
|
23
|
+
* GitHub secret holding a token with permission to comment on PRs, used
|
|
24
|
+
* for the best-effort drift report comment. The check still fails (and
|
|
25
|
+
* emits `::error::` annotations) without it, so fork PRs - which get no
|
|
26
|
+
* secrets - are only missing the extra comment.
|
|
27
|
+
* @default "PROJEN_GITHUB_TOKEN"
|
|
28
|
+
*/
|
|
29
|
+
readonly gheTokenSecret?: string;
|
|
30
|
+
/** @default "projen-drift-check" */
|
|
31
|
+
readonly workflowName?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class ProjenDriftCheckWorkflow extends Component {
|
|
34
|
+
readonly workflow: github.GithubWorkflow;
|
|
35
|
+
constructor(scope: github.GitHubProject, options?: ProjenDriftCheckWorkflowOptions);
|
|
36
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProjenDriftCheckWorkflow = void 0;
|
|
4
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
|
+
const projen_1 = require("projen");
|
|
6
|
+
class ProjenDriftCheckWorkflow extends projen_1.Component {
|
|
7
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.ProjenDriftCheckWorkflow", version: "0.0.2" };
|
|
8
|
+
workflow;
|
|
9
|
+
constructor(scope, options = {}) {
|
|
10
|
+
super(scope, 'ProjenDriftCheckWorkflow');
|
|
11
|
+
const gh = scope.github;
|
|
12
|
+
if (!gh) {
|
|
13
|
+
throw new Error('ProjenDriftCheckWorkflow requires GitHub integration to be enabled');
|
|
14
|
+
}
|
|
15
|
+
const projenCommand = options.projenCommand ?? 'npx projen';
|
|
16
|
+
const gheTokenSecret = options.gheTokenSecret ?? 'PROJEN_GITHUB_TOKEN';
|
|
17
|
+
this.workflow = new projen_1.github.GithubWorkflow(gh, options.workflowName ?? 'projen-drift-check');
|
|
18
|
+
this.workflow.on({ pullRequest: {} });
|
|
19
|
+
this.workflow.addJob('check', {
|
|
20
|
+
runsOn: ['ubuntu-latest'],
|
|
21
|
+
permissions: { contents: projen_1.github.workflows.JobPermission.READ },
|
|
22
|
+
env: { GH_TOKEN: `\${{ secrets.${gheTokenSecret} }}` },
|
|
23
|
+
steps: [
|
|
24
|
+
{
|
|
25
|
+
name: 'Checkout',
|
|
26
|
+
uses: 'actions/checkout@v4',
|
|
27
|
+
with: {
|
|
28
|
+
ref: '${{ github.event.pull_request.head.ref }}',
|
|
29
|
+
repository: '${{ github.event.pull_request.head.repo.full_name }}',
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'Setup Node',
|
|
34
|
+
uses: 'actions/setup-node@v4',
|
|
35
|
+
with: { 'node-version': 'lts/*' },
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Install dependencies',
|
|
39
|
+
run: 'npm ci',
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: 'Check for projen drift',
|
|
43
|
+
run: `set -euo pipefail
|
|
44
|
+
${projenCommand}
|
|
45
|
+
drifted="$(git diff --name-only)"
|
|
46
|
+
if [ -n "$drifted" ]; then
|
|
47
|
+
while IFS= read -r f; do
|
|
48
|
+
echo "::error file=$f::projen-managed file was edited directly; make the change in .projenrc.ts and re-run npx projen"
|
|
49
|
+
done <<< "$drifted"
|
|
50
|
+
if [ -n "$GH_TOKEN" ] && [ -n "$GITHUB_EVENT_PATH" ]; then
|
|
51
|
+
pr_number="$(jq -r ".pull_request.number // empty" "$GITHUB_EVENT_PATH" 2>/dev/null || true)"
|
|
52
|
+
if [ -n "$pr_number" ]; then
|
|
53
|
+
{
|
|
54
|
+
echo "❌ projen drift detected"
|
|
55
|
+
echo ""
|
|
56
|
+
echo "These files are managed by projen and were edited directly. Direct edits are silently overwritten by the next npx projen run, so they cannot be merged as-is:"
|
|
57
|
+
echo ""
|
|
58
|
+
while IFS= read -r f; do echo " - $f"; done <<< "$drifted"
|
|
59
|
+
echo ""
|
|
60
|
+
echo "To fix: revert the direct edits above, make the equivalent change in .projenrc.ts, then run npx projen and commit the regenerated output."
|
|
61
|
+
} | gh pr comment "$pr_number" --body-file - || echo "::warning::could not post PR comment (fork PR or missing token)"
|
|
62
|
+
fi
|
|
63
|
+
fi
|
|
64
|
+
exit 1
|
|
65
|
+
fi
|
|
66
|
+
`,
|
|
67
|
+
},
|
|
68
|
+
],
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
exports.ProjenDriftCheckWorkflow = ProjenDriftCheckWorkflow;
|
|
73
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVuLWRyaWZ0LWNoZWNrLXdvcmtmbG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1vbi9wcm9qZW4tZHJpZnQtY2hlY2std29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLG1DQUEyQztBQW9DM0MsTUFBYSx3QkFBeUIsU0FBUSxrQkFBUzs7SUFDckMsUUFBUSxDQUF3QjtJQUVoRCxZQUNFLEtBQTJCLEVBQzNCLFVBQTJDLEVBQUU7UUFFN0MsS0FBSyxDQUFDLEtBQUssRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDeEIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FDYixvRUFBb0UsQ0FDckUsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLFlBQVksQ0FBQztRQUM1RCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsY0FBYyxJQUFJLHFCQUFxQixDQUFDO1FBRXZFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxlQUFNLENBQUMsY0FBYyxDQUN2QyxFQUFFLEVBQ0YsT0FBTyxDQUFDLFlBQVksSUFBSSxvQkFBb0IsQ0FDN0MsQ0FBQztRQUNGLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO1lBQzVCLE1BQU0sRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUN6QixXQUFXLEVBQUUsRUFBRSxRQUFRLEVBQUUsZUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFO1lBQzlELEdBQUcsRUFBRSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsY0FBYyxLQUFLLEVBQUU7WUFDdEQsS0FBSyxFQUFFO2dCQUNMO29CQUNFLElBQUksRUFBRSxVQUFVO29CQUNoQixJQUFJLEVBQUUscUJBQXFCO29CQUMzQixJQUFJLEVBQUU7d0JBQ0osR0FBRyxFQUFFLDJDQUEyQzt3QkFDaEQsVUFBVSxFQUFFLHNEQUFzRDtxQkFDbkU7aUJBQ0Y7Z0JBQ0Q7b0JBQ0UsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLElBQUksRUFBRSx1QkFBdUI7b0JBQzdCLElBQUksRUFBRSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUU7aUJBQ2xDO2dCQUNEO29CQUNFLElBQUksRUFBRSxzQkFBc0I7b0JBQzVCLEdBQUcsRUFBRSxRQUFRO2lCQUNkO2dCQUNEO29CQUNFLElBQUksRUFBRSx3QkFBd0I7b0JBQzlCLEdBQUcsRUFBRTtFQUNiLGFBQWE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FzQmQ7aUJBQ1E7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBM0VILDREQTRFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcblxuLyoqXG4gKiBQUi10cmlnZ2VyZWQgY2hlY2sgdGhhdCByZWplY3RzIGRpcmVjdCBlZGl0cyB0byBwcm9qZW4tbWFuYWdlZCBmaWxlcy5cbiAqXG4gKiBSZS1ydW5zIHRoZSBwcm9qZWN0J3Mgc3ludGggY29tbWFuZCBvbiB0aGUgUFIgaGVhZCBhbmQgZmFpbHMgaWYgdGhlXG4gKiByZWdlbmVyYXRlZCBvdXRwdXQgbm8gbG9uZ2VyIG1hdGNoZXMgd2hhdCdzIGNvbW1pdHRlZCAtIGkuZS4gc29tZW9uZVxuICogaGFuZC1lZGl0ZWQgYSBnZW5lcmF0ZWQgZmlsZSAocGFja2FnZS5qc29uIC8gcG9tLnhtbCAvXG4gKiAuZ2l0aHViL3dvcmtmbG93cy8qLnltbCAvIC4uLikgaW5zdGVhZCBvZiBnb2luZyB0aHJvdWdoIGAucHJvamVucmMudHNgLlxuICpcbiAqIFJ1bnMgb24gYHB1bGxfcmVxdWVzdGAgc28gaXQgZ2VudWluZWx5IGV4ZWN1dGVzIHRoZSBQUidzIG93biBjb2RlICh0aGVcbiAqIG9ubHkgd2F5IHRvIGRldGVjdCBkcmlmdCkgLSBhbmQgdGhlcmVmb3JlLCBieSBuZWNlc3NpdHksIGEgUFIgYXV0aG9yIGNhblxuICogZGlzYWJsZSBpdCB3aXRoaW4gdGhlaXIgb3duIFBSLiBUaGF0IHJlc2lkdWFsIGV4cG9zdXJlIGlzIGJvdW5kZWQgYnlcbiAqIGBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93YCAoQ2hlY2sgMiksIHdoaWNoIGlzIHRhbXBlci1wcm9vZiBhbmQgZmxhZ3NcbiAqIGFueSB0b3VjaCB0byBgLmdpdGh1Yi93b3JrZmxvd3MvKipgLiBTZWUgdGhlIEYwMDMgc3BlYydzIFNlY3VyaXR5IHNlY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29tbWFuZCB0aGF0IHJlZ2VuZXJhdGVzIHRoZSBwcm9qZWN0IGZyb20gYC5wcm9qZW5yYy50c2AuXG4gICAqIEBkZWZhdWx0IFwibnB4IHByb2plblwiXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5Db21tYW5kPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHaXRIdWIgc2VjcmV0IGhvbGRpbmcgYSB0b2tlbiB3aXRoIHBlcm1pc3Npb24gdG8gY29tbWVudCBvbiBQUnMsIHVzZWRcbiAgICogZm9yIHRoZSBiZXN0LWVmZm9ydCBkcmlmdCByZXBvcnQgY29tbWVudC4gVGhlIGNoZWNrIHN0aWxsIGZhaWxzIChhbmRcbiAgICogZW1pdHMgYDo6ZXJyb3I6OmAgYW5ub3RhdGlvbnMpIHdpdGhvdXQgaXQsIHNvIGZvcmsgUFJzIC0gd2hpY2ggZ2V0IG5vXG4gICAqIHNlY3JldHMgLSBhcmUgb25seSBtaXNzaW5nIHRoZSBleHRyYSBjb21tZW50LlxuICAgKiBAZGVmYXVsdCBcIlBST0pFTl9HSVRIVUJfVE9LRU5cIlxuICAgKi9cbiAgcmVhZG9ubHkgZ2hlVG9rZW5TZWNyZXQ/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IFwicHJvamVuLWRyaWZ0LWNoZWNrXCIgKi9cbiAgcmVhZG9ubHkgd29ya2Zsb3dOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93OiBnaXRodWIuR2l0aHViV29ya2Zsb3c7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGdpdGh1Yi5HaXRIdWJQcm9qZWN0LFxuICAgIG9wdGlvbnM6IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvd09wdGlvbnMgPSB7fSxcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsICdQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3cnKTtcblxuICAgIGNvbnN0IGdoID0gc2NvcGUuZ2l0aHViO1xuICAgIGlmICghZ2gpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1Byb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24gdG8gYmUgZW5hYmxlZCcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2plbkNvbW1hbmQgPSBvcHRpb25zLnByb2plbkNvbW1hbmQgPz8gJ25weCBwcm9qZW4nO1xuICAgIGNvbnN0IGdoZVRva2VuU2VjcmV0ID0gb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyAnUFJPSkVOX0dJVEhVQl9UT0tFTic7XG5cbiAgICB0aGlzLndvcmtmbG93ID0gbmV3IGdpdGh1Yi5HaXRodWJXb3JrZmxvdyhcbiAgICAgIGdoLFxuICAgICAgb3B0aW9ucy53b3JrZmxvd05hbWUgPz8gJ3Byb2plbi1kcmlmdC1jaGVjaycsXG4gICAgKTtcbiAgICB0aGlzLndvcmtmbG93Lm9uKHsgcHVsbFJlcXVlc3Q6IHt9IH0pO1xuICAgIHRoaXMud29ya2Zsb3cuYWRkSm9iKCdjaGVjaycsIHtcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczogeyBjb250ZW50czogZ2l0aHViLndvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLlJFQUQgfSxcbiAgICAgIGVudjogeyBHSF9UT0tFTjogYFxcJHt7IHNlY3JldHMuJHtnaGVUb2tlblNlY3JldH0gfX1gIH0sXG4gICAgICBzdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICAgICAgICB1c2VzOiAnYWN0aW9ucy9jaGVja291dEB2NCcsXG4gICAgICAgICAgd2l0aDoge1xuICAgICAgICAgICAgcmVmOiAnJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QuaGVhZC5yZWYgfX0nLFxuICAgICAgICAgICAgcmVwb3NpdG9yeTogJyR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQucmVwby5mdWxsX25hbWUgfX0nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAnU2V0dXAgTm9kZScsXG4gICAgICAgICAgdXNlczogJ2FjdGlvbnMvc2V0dXAtbm9kZUB2NCcsXG4gICAgICAgICAgd2l0aDogeyAnbm9kZS12ZXJzaW9uJzogJ2x0cy8qJyB9LFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0luc3RhbGwgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICBydW46ICducG0gY2knLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0NoZWNrIGZvciBwcm9qZW4gZHJpZnQnLFxuICAgICAgICAgIHJ1bjogYHNldCAtZXVvIHBpcGVmYWlsXG4ke3Byb2plbkNvbW1hbmR9XG5kcmlmdGVkPVwiJChnaXQgZGlmZiAtLW5hbWUtb25seSlcIlxuaWYgWyAtbiBcIiRkcmlmdGVkXCIgXTsgdGhlblxuICB3aGlsZSBJRlM9IHJlYWQgLXIgZjsgZG9cbiAgICBlY2hvIFwiOjplcnJvciBmaWxlPSRmOjpwcm9qZW4tbWFuYWdlZCBmaWxlIHdhcyBlZGl0ZWQgZGlyZWN0bHk7IG1ha2UgdGhlIGNoYW5nZSBpbiAucHJvamVucmMudHMgYW5kIHJlLXJ1biBucHggcHJvamVuXCJcbiAgZG9uZSA8PDwgXCIkZHJpZnRlZFwiXG4gIGlmIFsgLW4gXCIkR0hfVE9LRU5cIiBdICYmIFsgLW4gXCIkR0lUSFVCX0VWRU5UX1BBVEhcIiBdOyB0aGVuXG4gICAgcHJfbnVtYmVyPVwiJChqcSAtciBcIi5wdWxsX3JlcXVlc3QubnVtYmVyIC8vIGVtcHR5XCIgXCIkR0lUSFVCX0VWRU5UX1BBVEhcIiAyPi9kZXYvbnVsbCB8fCB0cnVlKVwiXG4gICAgaWYgWyAtbiBcIiRwcl9udW1iZXJcIiBdOyB0aGVuXG4gICAgICB7XG4gICAgICAgIGVjaG8gXCLinYwgcHJvamVuIGRyaWZ0IGRldGVjdGVkXCJcbiAgICAgICAgZWNobyBcIlwiXG4gICAgICAgIGVjaG8gXCJUaGVzZSBmaWxlcyBhcmUgbWFuYWdlZCBieSBwcm9qZW4gYW5kIHdlcmUgZWRpdGVkIGRpcmVjdGx5LiBEaXJlY3QgZWRpdHMgYXJlIHNpbGVudGx5IG92ZXJ3cml0dGVuIGJ5IHRoZSBuZXh0IG5weCBwcm9qZW4gcnVuLCBzbyB0aGV5IGNhbm5vdCBiZSBtZXJnZWQgYXMtaXM6XCJcbiAgICAgICAgZWNobyBcIlwiXG4gICAgICAgIHdoaWxlIElGUz0gcmVhZCAtciBmOyBkbyBlY2hvIFwiICAtICRmXCI7IGRvbmUgPDw8IFwiJGRyaWZ0ZWRcIlxuICAgICAgICBlY2hvIFwiXCJcbiAgICAgICAgZWNobyBcIlRvIGZpeDogcmV2ZXJ0IHRoZSBkaXJlY3QgZWRpdHMgYWJvdmUsIG1ha2UgdGhlIGVxdWl2YWxlbnQgY2hhbmdlIGluIC5wcm9qZW5yYy50cywgdGhlbiBydW4gbnB4IHByb2plbiBhbmQgY29tbWl0IHRoZSByZWdlbmVyYXRlZCBvdXRwdXQuXCJcbiAgICAgIH0gfCBnaCBwciBjb21tZW50IFwiJHByX251bWJlclwiIC0tYm9keS1maWxlIC0gfHwgZWNobyBcIjo6d2FybmluZzo6Y291bGQgbm90IHBvc3QgUFIgY29tbWVudCAoZm9yayBQUiBvciBtaXNzaW5nIHRva2VuKVwiXG4gICAgZmlcbiAgZmlcbiAgZXhpdCAxXG5maVxuYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -19,7 +19,10 @@ class UpgradeWorkflow extends projen_1.Component {
|
|
|
19
19
|
schedule: [{ cron: options.schedule ?? constants_1.NIGHTLY_UPGRADE_SCHEDULE }],
|
|
20
20
|
workflowDispatch: {},
|
|
21
21
|
},
|
|
22
|
-
permissions: {
|
|
22
|
+
permissions: {
|
|
23
|
+
contents: projen_1.github.workflows.JobPermission.WRITE,
|
|
24
|
+
pullRequests: projen_1.github.workflows.JobPermission.WRITE,
|
|
25
|
+
},
|
|
23
26
|
postBuildSteps: [
|
|
24
27
|
{
|
|
25
28
|
name: 'Create Pull Request',
|
|
@@ -29,6 +32,7 @@ class UpgradeWorkflow extends projen_1.Component {
|
|
|
29
32
|
'branch': 'auto/upgrade-dependencies',
|
|
30
33
|
'title': 'chore: upgrade dependencies',
|
|
31
34
|
'labels': 'auto-approve,auto-merge',
|
|
35
|
+
'token': `\${{ secrets.${constants_1.DEFAULT_GHE_TOKEN_SECRET} }}`,
|
|
32
36
|
},
|
|
33
37
|
},
|
|
34
38
|
],
|
|
@@ -36,4 +40,4 @@ class UpgradeWorkflow extends projen_1.Component {
|
|
|
36
40
|
}
|
|
37
41
|
}
|
|
38
42
|
exports.UpgradeWorkflow = UpgradeWorkflow;
|
|
39
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBncmFkZS13b3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vdXBncmFkZS13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtQ0FBaUQ7QUFDakQsMkNBR3FCO0FBa0JyQixNQUFhLGVBQWdCLFNBQVEsa0JBQVM7SUFDNUIsUUFBUSxDQUFzQjtJQUU5QyxZQUFZLEtBQTJCLEVBQUUsT0FBK0I7UUFDdEUsS0FBSyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBRWhDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDeEIsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ1IsTUFBTSxJQUFJLEtBQUssQ0FDYiwyREFBMkQsQ0FDNUQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksZUFBTSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUU7WUFDMUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxZQUFZLElBQUksU0FBUztZQUN2QyxLQUFLLEVBQUUsU0FBUztZQUNoQixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUk7WUFDbEIsUUFBUSxFQUFFO2dCQUNSLFFBQVEsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksb0NBQXdCLEVBQUUsQ0FBQztnQkFDbEUsZ0JBQWdCLEVBQUUsRUFBRTthQUNyQjtZQUNELFdBQVcsRUFBRTtnQkFDWCxRQUFRLEVBQUUsZUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsS0FBSztnQkFDOUMsWUFBWSxFQUFFLGVBQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUs7YUFDbkQ7WUFDRCxjQUFjLEVBQUU7Z0JBQ2Q7b0JBQ0UsSUFBSSxFQUFFLHFCQUFxQjtvQkFDM0IsSUFBSSxFQUFFLG9DQUFvQztvQkFDMUMsSUFBSSxFQUFFO3dCQUNKLGdCQUFnQixFQUFFLDZCQUE2Qjt3QkFDL0MsUUFBUSxFQUFFLDJCQUEyQjt3QkFDckMsT0FBTyxFQUFFLDZCQUE2Qjt3QkFDdEMsUUFBUSxFQUFFLHlCQUF5Qjt3QkFDbkMsT0FBTyxFQUFFLGdCQUFnQixvQ0FBd0IsS0FBSztxQkFDdkQ7aUJBQ0Y7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQXhDRCwwQ0F3Q0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFRhc2ssIGdpdGh1YiB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQge1xuICBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gIE5JR0hUTFlfVVBHUkFERV9TQ0hFRFVMRSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG4vKipcbiAqIE5pZ2h0bHkgY3JvbiB3b3JrZmxvdyB0aGF0IG9wZW5zIGEgUFIgd2l0aCBkZXBlbmRlbmN5IHVwZ3JhZGVzLiBVc2VkIGJ5XG4gKiBub24tTm9kZSBwcm9qZWN0IHR5cGVzIChKYXZhKTsgVHlwZVNjcmlwdC9DREsgcHJvamVjdCB0eXBlcyBpbnN0ZWFkIGdldFxuICogdGhpcyBmb3IgZnJlZSBmcm9tIHByb2plbidzIGJ1aWx0LWluIGBkZXBzVXBncmFkZWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBncmFkZVdvcmtmbG93T3B0aW9ucyB7XG4gIC8qKiBUaGUgdGFzayB0aGF0IHBlcmZvcm1zIHRoZSB1cGdyYWRlIChlLmcuIGBtdm4gdmVyc2lvbnM6dXNlLWxhdGVzdC1yZWxlYXNlc2ApLiAqL1xuICByZWFkb25seSB0YXNrOiBUYXNrO1xuXG4gIC8qKiBAZGVmYXVsdCBcInVwZ3JhZGVcIiAqL1xuICByZWFkb25seSB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqIEBkZWZhdWx0IE5JR0hUTFlfVVBHUkFERV9TQ0hFRFVMRSAoMDM6MDAgVVRDKSAqL1xuICByZWFkb25seSBzY2hlZHVsZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIFVwZ3JhZGVXb3JrZmxvdyBleHRlbmRzIENvbXBvbmVudCB7XG4gIHB1YmxpYyByZWFkb25seSB3b3JrZmxvdzogZ2l0aHViLlRhc2tXb3JrZmxvdztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogZ2l0aHViLkdpdEh1YlByb2plY3QsIG9wdGlvbnM6IFVwZ3JhZGVXb3JrZmxvd09wdGlvbnMpIHtcbiAgICBzdXBlcihzY29wZSwgJ1VwZ3JhZGVXb3JrZmxvdycpO1xuXG4gICAgY29uc3QgZ2ggPSBzY29wZS5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVXBncmFkZVdvcmtmbG93IHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbiB0byBiZSBlbmFibGVkJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy53b3JrZmxvdyA9IG5ldyBnaXRodWIuVGFza1dvcmtmbG93KGdoLCB7XG4gICAgICBuYW1lOiBvcHRpb25zLndvcmtmbG93TmFtZSA/PyAndXBncmFkZScsXG4gICAgICBqb2JJZDogJ3VwZ3JhZGUnLFxuICAgICAgdGFzazogb3B0aW9ucy50YXNrLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgc2NoZWR1bGU6IFt7IGNyb246IG9wdGlvbnMuc2NoZWR1bGUgPz8gTklHSFRMWV9VUEdSQURFX1NDSEVEVUxFIH1dLFxuICAgICAgICB3b3JrZmxvd0Rpc3BhdGNoOiB7fSxcbiAgICAgIH0sXG4gICAgICBwZXJtaXNzaW9uczoge1xuICAgICAgICBjb250ZW50czogZ2l0aHViLndvcmtmbG93cy5Kb2JQZXJtaXNzaW9uLldSSVRFLFxuICAgICAgICBwdWxsUmVxdWVzdHM6IGdpdGh1Yi53b3JrZmxvd3MuSm9iUGVybWlzc2lvbi5XUklURSxcbiAgICAgIH0sXG4gICAgICBwb3N0QnVpbGRTdGVwczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ0NyZWF0ZSBQdWxsIFJlcXVlc3QnLFxuICAgICAgICAgIHVzZXM6ICdwZXRlci1ldmFucy9jcmVhdGUtcHVsbC1yZXF1ZXN0QHY3JyxcbiAgICAgICAgICB3aXRoOiB7XG4gICAgICAgICAgICAnY29tbWl0LW1lc3NhZ2UnOiAnY2hvcmU6IHVwZ3JhZGUgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICdicmFuY2gnOiAnYXV0by91cGdyYWRlLWRlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAndGl0bGUnOiAnY2hvcmU6IHVwZ3JhZGUgZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICdsYWJlbHMnOiAnYXV0by1hcHByb3ZlLGF1dG8tbWVyZ2UnLFxuICAgICAgICAgICAgJ3Rva2VuJzogYFxcJHt7IHNlY3JldHMuJHtERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVR9IH19YCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Component, github } from 'projen';
|
|
2
|
+
/**
|
|
3
|
+
* PR-triggered, tamper-proof notice that a PR touches GitHub Actions
|
|
4
|
+
* workflow or action files.
|
|
5
|
+
*
|
|
6
|
+
* Runs on `pull_request_target` (NOT `pull_request`) so it always executes
|
|
7
|
+
* the copy of this workflow committed on the base branch - a PR cannot edit
|
|
8
|
+
* this file to disable or weaken the notice. It checks out and executes
|
|
9
|
+
* nothing from the PR; it only lists the changed filenames via the GitHub
|
|
10
|
+
* API and posts a non-blocking NOTE. Because `pull_request_target` runs with
|
|
11
|
+
* the base repo's normal token even for fork-originated PRs, the comment
|
|
12
|
+
* posts reliably with no degraded fallback.
|
|
13
|
+
*
|
|
14
|
+
* This check NEVER fails the build - it is purely informational (reviewer
|
|
15
|
+
* attention). It is the tamper-proof backstop that bounds Check 1's
|
|
16
|
+
* (`ProjenDriftCheckWorkflow`) residual exposure. See the F003 spec's
|
|
17
|
+
* Security section.
|
|
18
|
+
*/
|
|
19
|
+
export interface WorkflowChangeNoticeWorkflowOptions {
|
|
20
|
+
/**
|
|
21
|
+
* Glob patterns (bash `[[ string == pattern ]]` semantics, where `*` also
|
|
22
|
+
* matches `/`) that trigger the notice when a changed PR file matches any
|
|
23
|
+
* of them.
|
|
24
|
+
* @default [".github/workflows/**", ".github/actions/**"]
|
|
25
|
+
*/
|
|
26
|
+
readonly watchPaths?: string[];
|
|
27
|
+
/** @default "workflow-change-notice" */
|
|
28
|
+
readonly workflowName?: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class WorkflowChangeNoticeWorkflow extends Component {
|
|
31
|
+
readonly workflow: github.GithubWorkflow;
|
|
32
|
+
constructor(scope: github.GitHubProject, options?: WorkflowChangeNoticeWorkflowOptions);
|
|
33
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkflowChangeNoticeWorkflow = void 0;
|
|
4
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
|
+
const projen_1 = require("projen");
|
|
6
|
+
class WorkflowChangeNoticeWorkflow extends projen_1.Component {
|
|
7
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.WorkflowChangeNoticeWorkflow", version: "0.0.2" };
|
|
8
|
+
workflow;
|
|
9
|
+
constructor(scope, options = {}) {
|
|
10
|
+
super(scope, 'WorkflowChangeNoticeWorkflow');
|
|
11
|
+
const gh = scope.github;
|
|
12
|
+
if (!gh) {
|
|
13
|
+
throw new Error('WorkflowChangeNoticeWorkflow requires GitHub integration to be enabled');
|
|
14
|
+
}
|
|
15
|
+
const watchPaths = options.watchPaths ?? [
|
|
16
|
+
'.github/workflows/**',
|
|
17
|
+
'.github/actions/**',
|
|
18
|
+
];
|
|
19
|
+
this.workflow = new projen_1.github.GithubWorkflow(gh, options.workflowName ?? 'workflow-change-notice');
|
|
20
|
+
this.workflow.on({ pullRequestTarget: {} });
|
|
21
|
+
this.workflow.addJob('check', {
|
|
22
|
+
runsOn: ['ubuntu-latest'],
|
|
23
|
+
permissions: { pullRequests: projen_1.github.workflows.JobPermission.WRITE },
|
|
24
|
+
env: {
|
|
25
|
+
GH_TOKEN: '${{ github.token }}',
|
|
26
|
+
WATCH_PATHS: watchPaths.join(' '),
|
|
27
|
+
},
|
|
28
|
+
steps: [
|
|
29
|
+
{
|
|
30
|
+
name: 'Check for workflow/action changes',
|
|
31
|
+
run: `set -uo pipefail
|
|
32
|
+
changed="$(gh api --paginate "repos/\${GITHUB_REPOSITORY}/pulls/\${{ github.event.number }}/files" --jq '.[].filename')"
|
|
33
|
+
if [ -z "$changed" ]; then exit 0; fi
|
|
34
|
+
matches=""
|
|
35
|
+
while IFS= read -r path; do
|
|
36
|
+
for p in $WATCH_PATHS; do
|
|
37
|
+
if [[ "$path" == $p ]]; then
|
|
38
|
+
matches="$matches$path
|
|
39
|
+
"
|
|
40
|
+
break
|
|
41
|
+
fi
|
|
42
|
+
done
|
|
43
|
+
done <<< "$changed"
|
|
44
|
+
if [ -n "$matches" ]; then
|
|
45
|
+
{
|
|
46
|
+
echo "⚠️ NOTE for reviewers: this PR modifies GitHub Actions workflow or action files. Please review these changes carefully - they can alter or bypass standard build, test, and deployment checks:"
|
|
47
|
+
echo ""
|
|
48
|
+
printf "%s" "$matches" | sed "s/^/ - /"
|
|
49
|
+
} | gh pr comment "\${{ github.event.number }}" --body-file -
|
|
50
|
+
fi
|
|
51
|
+
`,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
exports.WorkflowChangeNoticeWorkflow = WorkflowChangeNoticeWorkflow;
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctY2hhbmdlLW5vdGljZS13b3JrZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21tb24vd29ya2Zsb3ctY2hhbmdlLW5vdGljZS13b3JrZmxvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsbUNBQTJDO0FBZ0MzQyxNQUFhLDRCQUE2QixTQUFRLGtCQUFTOztJQUN6QyxRQUFRLENBQXdCO0lBRWhELFlBQ0UsS0FBMkIsRUFDM0IsVUFBK0MsRUFBRTtRQUVqRCxLQUFLLENBQUMsS0FBSyxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFFN0MsTUFBTSxFQUFFLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUN4QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUNiLHdFQUF3RSxDQUN6RSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUk7WUFDdkMsc0JBQXNCO1lBQ3RCLG9CQUFvQjtTQUNyQixDQUFDO1FBRUYsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLGVBQU0sQ0FBQyxjQUFjLENBQ3ZDLEVBQUUsRUFDRixPQUFPLENBQUMsWUFBWSxJQUFJLHdCQUF3QixDQUNqRCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxpQkFBaUIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUM1QixNQUFNLEVBQUUsQ0FBQyxlQUFlLENBQUM7WUFDekIsV0FBVyxFQUFFLEVBQUUsWUFBWSxFQUFFLGVBQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRTtZQUNuRSxHQUFHLEVBQUU7Z0JBQ0gsUUFBUSxFQUFFLHFCQUFxQjtnQkFDL0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO2FBQ2xDO1lBQ0QsS0FBSyxFQUFFO2dCQUNMO29CQUNFLElBQUksRUFBRSxtQ0FBbUM7b0JBQ3pDLEdBQUcsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQmQ7aUJBQ1E7YUFDRjtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBNURILG9FQTZEQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgZ2l0aHViIH0gZnJvbSAncHJvamVuJztcblxuLyoqXG4gKiBQUi10cmlnZ2VyZWQsIHRhbXBlci1wcm9vZiBub3RpY2UgdGhhdCBhIFBSIHRvdWNoZXMgR2l0SHViIEFjdGlvbnNcbiAqIHdvcmtmbG93IG9yIGFjdGlvbiBmaWxlcy5cbiAqXG4gKiBSdW5zIG9uIGBwdWxsX3JlcXVlc3RfdGFyZ2V0YCAoTk9UIGBwdWxsX3JlcXVlc3RgKSBzbyBpdCBhbHdheXMgZXhlY3V0ZXNcbiAqIHRoZSBjb3B5IG9mIHRoaXMgd29ya2Zsb3cgY29tbWl0dGVkIG9uIHRoZSBiYXNlIGJyYW5jaCAtIGEgUFIgY2Fubm90IGVkaXRcbiAqIHRoaXMgZmlsZSB0byBkaXNhYmxlIG9yIHdlYWtlbiB0aGUgbm90aWNlLiBJdCBjaGVja3Mgb3V0IGFuZCBleGVjdXRlc1xuICogbm90aGluZyBmcm9tIHRoZSBQUjsgaXQgb25seSBsaXN0cyB0aGUgY2hhbmdlZCBmaWxlbmFtZXMgdmlhIHRoZSBHaXRIdWJcbiAqIEFQSSBhbmQgcG9zdHMgYSBub24tYmxvY2tpbmcgTk9URS4gQmVjYXVzZSBgcHVsbF9yZXF1ZXN0X3RhcmdldGAgcnVucyB3aXRoXG4gKiB0aGUgYmFzZSByZXBvJ3Mgbm9ybWFsIHRva2VuIGV2ZW4gZm9yIGZvcmstb3JpZ2luYXRlZCBQUnMsIHRoZSBjb21tZW50XG4gKiBwb3N0cyByZWxpYWJseSB3aXRoIG5vIGRlZ3JhZGVkIGZhbGxiYWNrLlxuICpcbiAqIFRoaXMgY2hlY2sgTkVWRVIgZmFpbHMgdGhlIGJ1aWxkIC0gaXQgaXMgcHVyZWx5IGluZm9ybWF0aW9uYWwgKHJldmlld2VyXG4gKiBhdHRlbnRpb24pLiBJdCBpcyB0aGUgdGFtcGVyLXByb29mIGJhY2tzdG9wIHRoYXQgYm91bmRzIENoZWNrIDEnc1xuICogKGBQcm9qZW5EcmlmdENoZWNrV29ya2Zsb3dgKSByZXNpZHVhbCBleHBvc3VyZS4gU2VlIHRoZSBGMDAzIHNwZWMnc1xuICogU2VjdXJpdHkgc2VjdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBHbG9iIHBhdHRlcm5zIChiYXNoIGBbWyBzdHJpbmcgPT0gcGF0dGVybiBdXWAgc2VtYW50aWNzLCB3aGVyZSBgKmAgYWxzb1xuICAgKiBtYXRjaGVzIGAvYCkgdGhhdCB0cmlnZ2VyIHRoZSBub3RpY2Ugd2hlbiBhIGNoYW5nZWQgUFIgZmlsZSBtYXRjaGVzIGFueVxuICAgKiBvZiB0aGVtLlxuICAgKiBAZGVmYXVsdCBbXCIuZ2l0aHViL3dvcmtmbG93cy8qKlwiLCBcIi5naXRodWIvYWN0aW9ucy8qKlwiXVxuICAgKi9cbiAgcmVhZG9ubHkgd2F0Y2hQYXRocz86IHN0cmluZ1tdO1xuXG4gIC8qKiBAZGVmYXVsdCBcIndvcmtmbG93LWNoYW5nZS1ub3RpY2VcIiAqL1xuICByZWFkb25seSB3b3JrZmxvd05hbWU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93IGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHVibGljIHJlYWRvbmx5IHdvcmtmbG93OiBnaXRodWIuR2l0aHViV29ya2Zsb3c7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGdpdGh1Yi5HaXRIdWJQcm9qZWN0LFxuICAgIG9wdGlvbnM6IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3dPcHRpb25zID0ge30sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCAnV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdycpO1xuXG4gICAgY29uc3QgZ2ggPSBzY29wZS5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnV29ya2Zsb3dDaGFuZ2VOb3RpY2VXb3JrZmxvdyByZXF1aXJlcyBHaXRIdWIgaW50ZWdyYXRpb24gdG8gYmUgZW5hYmxlZCcsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHdhdGNoUGF0aHMgPSBvcHRpb25zLndhdGNoUGF0aHMgPz8gW1xuICAgICAgJy5naXRodWIvd29ya2Zsb3dzLyoqJyxcbiAgICAgICcuZ2l0aHViL2FjdGlvbnMvKionLFxuICAgIF07XG5cbiAgICB0aGlzLndvcmtmbG93ID0gbmV3IGdpdGh1Yi5HaXRodWJXb3JrZmxvdyhcbiAgICAgIGdoLFxuICAgICAgb3B0aW9ucy53b3JrZmxvd05hbWUgPz8gJ3dvcmtmbG93LWNoYW5nZS1ub3RpY2UnLFxuICAgICk7XG4gICAgdGhpcy53b3JrZmxvdy5vbih7IHB1bGxSZXF1ZXN0VGFyZ2V0OiB7fSB9KTtcbiAgICB0aGlzLndvcmtmbG93LmFkZEpvYignY2hlY2snLCB7XG4gICAgICBydW5zT246IFsndWJ1bnR1LWxhdGVzdCddLFxuICAgICAgcGVybWlzc2lvbnM6IHsgcHVsbFJlcXVlc3RzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uV1JJVEUgfSxcbiAgICAgIGVudjoge1xuICAgICAgICBHSF9UT0tFTjogJyR7eyBnaXRodWIudG9rZW4gfX0nLFxuICAgICAgICBXQVRDSF9QQVRIUzogd2F0Y2hQYXRocy5qb2luKCcgJyksXG4gICAgICB9LFxuICAgICAgc3RlcHM6IFtcbiAgICAgICAge1xuICAgICAgICAgIG5hbWU6ICdDaGVjayBmb3Igd29ya2Zsb3cvYWN0aW9uIGNoYW5nZXMnLFxuICAgICAgICAgIHJ1bjogYHNldCAtdW8gcGlwZWZhaWxcbmNoYW5nZWQ9XCIkKGdoIGFwaSAtLXBhZ2luYXRlIFwicmVwb3MvXFwke0dJVEhVQl9SRVBPU0lUT1JZfS9wdWxscy9cXCR7eyBnaXRodWIuZXZlbnQubnVtYmVyIH19L2ZpbGVzXCIgLS1qcSAnLltdLmZpbGVuYW1lJylcIlxuaWYgWyAteiBcIiRjaGFuZ2VkXCIgXTsgdGhlbiBleGl0IDA7IGZpXG5tYXRjaGVzPVwiXCJcbndoaWxlIElGUz0gcmVhZCAtciBwYXRoOyBkb1xuICBmb3IgcCBpbiAkV0FUQ0hfUEFUSFM7IGRvXG4gICAgaWYgW1sgXCIkcGF0aFwiID09ICRwIF1dOyB0aGVuXG4gICAgICBtYXRjaGVzPVwiJG1hdGNoZXMkcGF0aFxuXCJcbiAgICAgIGJyZWFrXG4gICAgZmlcbiAgZG9uZVxuZG9uZSA8PDwgXCIkY2hhbmdlZFwiXG5pZiBbIC1uIFwiJG1hdGNoZXNcIiBdOyB0aGVuXG4gIHtcbiAgICBlY2hvIFwi4pqg77iPIE5PVEUgZm9yIHJldmlld2VyczogdGhpcyBQUiBtb2RpZmllcyBHaXRIdWIgQWN0aW9ucyB3b3JrZmxvdyBvciBhY3Rpb24gZmlsZXMuIFBsZWFzZSByZXZpZXcgdGhlc2UgY2hhbmdlcyBjYXJlZnVsbHkgLSB0aGV5IGNhbiBhbHRlciBvciBieXBhc3Mgc3RhbmRhcmQgYnVpbGQsIHRlc3QsIGFuZCBkZXBsb3ltZW50IGNoZWNrczpcIlxuICAgIGVjaG8gXCJcIlxuICAgIHByaW50ZiBcIiVzXCIgXCIkbWF0Y2hlc1wiIHwgc2VkIFwicy9eLyAgLSAvXCJcbiAgfSB8IGdoIHByIGNvbW1lbnQgXCJcXCR7eyBnaXRodWIuZXZlbnQubnVtYmVyIH19XCIgLS1ib2R5LWZpbGUgLVxuZmlcbmAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
package/lib/index.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
export * from './common/environment-options';
|
|
2
|
+
export * from './common/projen-drift-check-workflow';
|
|
3
|
+
export * from './common/workflow-change-notice-workflow';
|
|
4
|
+
export * from './common/internal-actions';
|
|
5
|
+
export * from './common/actions-allowlist-guard';
|
|
2
6
|
export * from './cdk/options';
|
|
3
7
|
export * from './cdk/cdk-typescript-base';
|
|
4
8
|
export * from './cdk/cdk-infra-project';
|
|
@@ -18,3 +22,7 @@ export * from './java/components/github-packages-publish';
|
|
|
18
22
|
export * from './java/components/flyway-migration';
|
|
19
23
|
export * from './java/components/cdk-deploy-hook';
|
|
20
24
|
export * from './java/components/code-index-workflow';
|
|
25
|
+
export * from './actions/github-action-project';
|
|
26
|
+
export * from './actions/action-build-workflow';
|
|
27
|
+
export * from './actions/action-dogfood-workflow';
|
|
28
|
+
export * from './actions/action-sonar-workflow';
|
package/lib/index.js
CHANGED
|
@@ -15,6 +15,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./common/environment-options"), exports);
|
|
18
|
+
__exportStar(require("./common/projen-drift-check-workflow"), exports);
|
|
19
|
+
__exportStar(require("./common/workflow-change-notice-workflow"), exports);
|
|
20
|
+
__exportStar(require("./common/internal-actions"), exports);
|
|
21
|
+
__exportStar(require("./common/actions-allowlist-guard"), exports);
|
|
18
22
|
__exportStar(require("./cdk/options"), exports);
|
|
19
23
|
__exportStar(require("./cdk/cdk-typescript-base"), exports);
|
|
20
24
|
__exportStar(require("./cdk/cdk-infra-project"), exports);
|
|
@@ -34,4 +38,8 @@ __exportStar(require("./java/components/github-packages-publish"), exports);
|
|
|
34
38
|
__exportStar(require("./java/components/flyway-migration"), exports);
|
|
35
39
|
__exportStar(require("./java/components/cdk-deploy-hook"), exports);
|
|
36
40
|
__exportStar(require("./java/components/code-index-workflow"), exports);
|
|
37
|
-
|
|
41
|
+
__exportStar(require("./actions/github-action-project"), exports);
|
|
42
|
+
__exportStar(require("./actions/action-build-workflow"), exports);
|
|
43
|
+
__exportStar(require("./actions/action-dogfood-workflow"), exports);
|
|
44
|
+
__exportStar(require("./actions/action-sonar-workflow"), exports);
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtEQUE2QztBQUM3Qyx1RUFBcUQ7QUFDckQsMkVBQXlEO0FBQ3pELDREQUEwQztBQUMxQyxtRUFBaUQ7QUFFakQsZ0RBQThCO0FBQzlCLDREQUEwQztBQUMxQywwREFBd0M7QUFDeEMsd0RBQXNDO0FBQ3RDLHNFQUFvRDtBQUNwRCw4RUFBNEQ7QUFDNUQsNkRBQTJDO0FBQzNDLDJEQUF5QztBQUV6QyxpREFBK0I7QUFDL0IseURBQXVDO0FBQ3ZDLDhEQUE0QztBQUM1Qyw4REFBNEM7QUFDNUMsMERBQXdDO0FBQ3hDLDBFQUF3RDtBQUN4RCxtRUFBaUQ7QUFDakQsNEVBQTBEO0FBQzFELHFFQUFtRDtBQUNuRCxvRUFBa0Q7QUFDbEQsd0VBQXNEO0FBRXRELGtFQUFnRDtBQUNoRCxrRUFBZ0Q7QUFDaEQsb0VBQWtEO0FBQ2xELGtFQUFnRCIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29tbW9uL2Vudmlyb25tZW50LW9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vcHJvamVuLWRyaWZ0LWNoZWNrLXdvcmtmbG93JztcbmV4cG9ydCAqIGZyb20gJy4vY29tbW9uL3dvcmtmbG93LWNoYW5nZS1ub3RpY2Utd29ya2Zsb3cnO1xuZXhwb3J0ICogZnJvbSAnLi9jb21tb24vaW50ZXJuYWwtYWN0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbW1vbi9hY3Rpb25zLWFsbG93bGlzdC1ndWFyZCc7XG5cbmV4cG9ydCAqIGZyb20gJy4vY2RrL29wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jZGsvY2RrLXR5cGVzY3JpcHQtYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2Nkay9jZGstaW5mcmEtcHJvamVjdCc7XG5leHBvcnQgKiBmcm9tICcuL2Nkay9jZGstYXBwLXByb2plY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9jZGsvY29tcG9uZW50cy9lY3ItZWNzLWNvbnN0cnVjdHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jZGsvY29tcG9uZW50cy9lZGdlLW5ldHdvcmtpbmctY29uc3RydWN0cyc7XG5leHBvcnQgKiBmcm9tICcuL2Nkay9hcHAtcnVudGltZS1zY2FmZm9sZCc7XG5leHBvcnQgKiBmcm9tICcuL2Nkay9kYXRhYmFzZS1jb21wb25lbnQnO1xuXG5leHBvcnQgKiBmcm9tICcuL2phdmEvb3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2phdmEvamF2YS1tYXZlbi1iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vamF2YS9qYXZhLWxpYnJhcnktcHJvamVjdCc7XG5leHBvcnQgKiBmcm9tICcuL2phdmEvamF2YS1zZXJ2aWNlLXByb2plY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9qYXZhL2phdmEtYXBwLXByb2plY3QnO1xuZXhwb3J0ICogZnJvbSAnLi9qYXZhL2NvbXBvbmVudHMvbWF2ZW4tY2VudHJhbC1wdWJsaXNoJztcbmV4cG9ydCAqIGZyb20gJy4vamF2YS9jb21wb25lbnRzL2RvY2tlci1wdWJsaXNoJztcbmV4cG9ydCAqIGZyb20gJy4vamF2YS9jb21wb25lbnRzL2dpdGh1Yi1wYWNrYWdlcy1wdWJsaXNoJztcbmV4cG9ydCAqIGZyb20gJy4vamF2YS9jb21wb25lbnRzL2ZseXdheS1taWdyYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9qYXZhL2NvbXBvbmVudHMvY2RrLWRlcGxveS1ob29rJztcbmV4cG9ydCAqIGZyb20gJy4vamF2YS9jb21wb25lbnRzL2NvZGUtaW5kZXgtd29ya2Zsb3cnO1xuXG5leHBvcnQgKiBmcm9tICcuL2FjdGlvbnMvZ2l0aHViLWFjdGlvbi1wcm9qZWN0JztcbmV4cG9ydCAqIGZyb20gJy4vYWN0aW9ucy9hY3Rpb24tYnVpbGQtd29ya2Zsb3cnO1xuZXhwb3J0ICogZnJvbSAnLi9hY3Rpb25zL2FjdGlvbi1kb2dmb29kLXdvcmtmbG93JztcbmV4cG9ydCAqIGZyb20gJy4vYWN0aW9ucy9hY3Rpb24tc29uYXItd29ya2Zsb3cnO1xuXG4iXX0=
|
|
@@ -11,7 +11,7 @@ const manual_deploy_workflow_1 = require("../../common/manual-deploy-workflow");
|
|
|
11
11
|
* deploys - see the CDK spec's open question about sharing this contract.
|
|
12
12
|
*/
|
|
13
13
|
class CdkDeployHook extends projen_1.Component {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkDeployHook", version: "0.0.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CdkDeployHook", version: "0.0.2" };
|
|
15
15
|
constructor(project, environments, options = {}) {
|
|
16
16
|
super(project, 'CdkDeployHook');
|
|
17
17
|
if (!options.targetRepo) {
|
|
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
6
|
/** Generates a code index and publishes it to `.cai/` on checkin. */
|
|
7
7
|
class CodeIndexWorkflow extends projen_1.Component {
|
|
8
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CodeIndexWorkflow", version: "0.0.
|
|
8
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.CodeIndexWorkflow", version: "0.0.2" };
|
|
9
9
|
constructor(project) {
|
|
10
10
|
super(project, 'CodeIndexWorkflow');
|
|
11
11
|
const gh = project.github;
|
|
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
6
|
/** On-demand build+push of a Docker image, defaulting to Docker Hub. */
|
|
7
7
|
class DockerPublish extends projen_1.Component {
|
|
8
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.DockerPublish", version: "0.0.
|
|
8
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.DockerPublish", version: "0.0.2" };
|
|
9
9
|
constructor(project, options = {}) {
|
|
10
10
|
super(project, 'DockerPublish');
|
|
11
11
|
const gh = project.github;
|
|
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
6
|
/** Adds Flyway config/dependencies + a migrations directory for DB migrations. */
|
|
7
7
|
class FlywayMigration extends projen_1.Component {
|
|
8
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.FlywayMigration", version: "0.0.
|
|
8
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.FlywayMigration", version: "0.0.2" };
|
|
9
9
|
constructor(project) {
|
|
10
10
|
super(project, 'FlywayMigration');
|
|
11
11
|
project.pom.addPlugin('org.flywaydb/flyway-maven-plugin@^10');
|
|
@@ -5,7 +5,7 @@ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
6
|
/** On-demand publish to GitHub Packages. */
|
|
7
7
|
class GitHubPackagesPublish extends projen_1.Component {
|
|
8
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubPackagesPublish", version: "0.0.
|
|
8
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.GitHubPackagesPublish", version: "0.0.2" };
|
|
9
9
|
constructor(project, options = {}) {
|
|
10
10
|
super(project, 'GitHubPackagesPublish');
|
|
11
11
|
const gh = project.github;
|
|
@@ -8,7 +8,7 @@ const projen_1 = require("projen");
|
|
|
8
8
|
* or OIDC trusted publishing.
|
|
9
9
|
*/
|
|
10
10
|
class MavenCentralPublish extends projen_1.Component {
|
|
11
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.MavenCentralPublish", version: "0.0.
|
|
11
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.MavenCentralPublish", version: "0.0.2" };
|
|
12
12
|
constructor(project, options = {}) {
|
|
13
13
|
super(project, 'MavenCentralPublish');
|
|
14
14
|
const gh = project.github;
|
|
@@ -9,7 +9,7 @@ const java_maven_base_1 = require("./java-maven-base");
|
|
|
9
9
|
* explicitly excludes Maven Central, Docker, and CDK deploy hooks.
|
|
10
10
|
*/
|
|
11
11
|
class JavaAppProject extends java_maven_base_1.JavaMavenProject {
|
|
12
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaAppProject", version: "0.0.
|
|
12
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaAppProject", version: "0.0.2" };
|
|
13
13
|
constructor(options) {
|
|
14
14
|
super(options);
|
|
15
15
|
new github_packages_publish_1.GitHubPackagesPublish(this, {
|
|
@@ -7,7 +7,7 @@ const maven_central_publish_1 = require("./components/maven-central-publish");
|
|
|
7
7
|
const java_maven_base_1 = require("./java-maven-base");
|
|
8
8
|
/** Reusable Java library, published to Maven Central. */
|
|
9
9
|
class JavaLibraryProject extends java_maven_base_1.JavaMavenProject {
|
|
10
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaLibraryProject", version: "0.0.
|
|
10
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaLibraryProject", version: "0.0.2" };
|
|
11
11
|
constructor(options) {
|
|
12
12
|
super(options);
|
|
13
13
|
new maven_central_publish_1.MavenCentralPublish(this, { mavenCentralOidc: options.mavenCentralOidc });
|
|
@@ -3,9 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.JavaMavenProject = void 0;
|
|
4
4
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
5
5
|
const projen_1 = require("projen");
|
|
6
|
+
const actions_allowlist_guard_1 = require("../common/actions-allowlist-guard");
|
|
6
7
|
const constants_1 = require("../common/constants");
|
|
7
|
-
const
|
|
8
|
+
const internal_actions_1 = require("../common/internal-actions");
|
|
9
|
+
const projen_drift_check_workflow_1 = require("../common/projen-drift-check-workflow");
|
|
8
10
|
const upgrade_workflow_1 = require("../common/upgrade-workflow");
|
|
11
|
+
const workflow_change_notice_workflow_1 = require("../common/workflow-change-notice-workflow");
|
|
9
12
|
/**
|
|
10
13
|
* Shared Maven build skeleton for all three Java project types: standard
|
|
11
14
|
* `pom.xml`/directory layout (via `java.JavaProject`), a PR-triggered
|
|
@@ -13,7 +16,7 @@ const upgrade_workflow_1 = require("../common/upgrade-workflow");
|
|
|
13
16
|
* nightly dependency-upgrade workflow.
|
|
14
17
|
*/
|
|
15
18
|
class JavaMavenProject extends projen_1.java.JavaProject {
|
|
16
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaMavenProject", version: "0.0.
|
|
19
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaMavenProject", version: "0.0.2" };
|
|
17
20
|
upgradeTask;
|
|
18
21
|
buildVerifyWorkflow;
|
|
19
22
|
constructor(options) {
|
|
@@ -30,7 +33,13 @@ class JavaMavenProject extends projen_1.java.JavaProject {
|
|
|
30
33
|
if (!gh) {
|
|
31
34
|
throw new Error('JavaMavenProject requires GitHub integration');
|
|
32
35
|
}
|
|
33
|
-
|
|
36
|
+
(0, internal_actions_1.applyInternalActionOverrides)(gh);
|
|
37
|
+
new projen_drift_check_workflow_1.ProjenDriftCheckWorkflow(this, {
|
|
38
|
+
gheTokenSecret: options.gheTokenSecret ?? constants_1.DEFAULT_GHE_TOKEN_SECRET,
|
|
39
|
+
});
|
|
40
|
+
new workflow_change_notice_workflow_1.WorkflowChangeNoticeWorkflow(this);
|
|
41
|
+
new actions_allowlist_guard_1.ActionsAllowlistGuard(this);
|
|
42
|
+
const postBuildSteps = [];
|
|
34
43
|
if (options.sonarProjectKey) {
|
|
35
44
|
postBuildSteps.push({
|
|
36
45
|
name: 'SonarQube scan',
|
|
@@ -53,4 +62,4 @@ class JavaMavenProject extends projen_1.java.JavaProject {
|
|
|
53
62
|
}
|
|
54
63
|
}
|
|
55
64
|
exports.JavaMavenProject = JavaMavenProject;
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiamF2YS1tYXZlbi1iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2phdmEvamF2YS1tYXZlbi1iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxtQ0FBNEM7QUFFNUMsK0VBQTBFO0FBQzFFLG1EQUErRDtBQUMvRCxpRUFBMEU7QUFDMUUsdUZBQWlGO0FBQ2pGLGlFQUE2RDtBQUM3RCwrRkFBeUY7QUFJekY7Ozs7O0dBS0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLGFBQUksQ0FBQyxXQUFXOztJQUNwQyxXQUFXLENBQU87SUFDbEIsbUJBQW1CLENBQXNCO0lBRXpELFlBQVksT0FBZ0M7UUFDMUMsS0FBSyxDQUFDO1lBQ0osSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztZQUN4QixVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7WUFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLElBQUksT0FBTztZQUNuQyxpQkFBaUIsRUFBRSxlQUFNLENBQUMsaUJBQWlCLENBQUMsdUJBQXVCLENBQUM7Z0JBQ2xFLE1BQU0sRUFBRSxPQUFPLENBQUMsY0FBYyxJQUFJLG9DQUF3QjthQUMzRCxDQUFDO1NBQ0gsQ0FBQyxDQUFDO1FBRUgsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2QixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUVELElBQUEsK0NBQTRCLEVBQUMsRUFBRSxDQUFDLENBQUM7UUFFakMsSUFBSSxzREFBd0IsQ0FBQyxJQUFJLEVBQUU7WUFDakMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxjQUFjLElBQUksb0NBQXdCO1NBQ25FLENBQUMsQ0FBQztRQUNILElBQUksOERBQTRCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSwrQ0FBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoQyxNQUFNLGNBQWMsR0FBK0IsRUFBRSxDQUFDO1FBQ3RELElBQUksT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzVCLGNBQWMsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xCLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLEdBQUcsRUFBRSx5Q0FBeUMsT0FBTyxDQUFDLGVBQWUsRUFBRTtnQkFDdkUsR0FBRyxFQUFFLEVBQUUsV0FBVyxFQUFFLDRCQUE0QixFQUFFO2FBQ25ELENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxlQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRTtZQUNyRCxJQUFJLEVBQUUsT0FBTztZQUNiLEtBQUssRUFBRSxPQUFPO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3BCLFFBQVEsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFO1lBQ25ELFdBQVcsRUFBRSxFQUFFLFFBQVEsRUFBRSxlQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUU7WUFDOUQsY0FBYztTQUNmLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDekMsSUFBSSxFQUFFLGdFQUFnRTtTQUN2RSxDQUFDLENBQUM7UUFDSCxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7O0FBbERILDRDQW1EQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRhc2ssIGdpdGh1YiwgamF2YSB9IGZyb20gJ3Byb2plbic7XG5pbXBvcnQgeyBDb21tb25KYXZhT3B0aW9ucyB9IGZyb20gJy4vb3B0aW9ucyc7XG5pbXBvcnQgeyBBY3Rpb25zQWxsb3dsaXN0R3VhcmQgfSBmcm9tICcuLi9jb21tb24vYWN0aW9ucy1hbGxvd2xpc3QtZ3VhcmQnO1xuaW1wb3J0IHsgREVGQVVMVF9HSEVfVE9LRU5fU0VDUkVUIH0gZnJvbSAnLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBhcHBseUludGVybmFsQWN0aW9uT3ZlcnJpZGVzIH0gZnJvbSAnLi4vY29tbW9uL2ludGVybmFsLWFjdGlvbnMnO1xuaW1wb3J0IHsgUHJvamVuRHJpZnRDaGVja1dvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3Byb2plbi1kcmlmdC1jaGVjay13b3JrZmxvdyc7XG5pbXBvcnQgeyBVcGdyYWRlV29ya2Zsb3cgfSBmcm9tICcuLi9jb21tb24vdXBncmFkZS13b3JrZmxvdyc7XG5pbXBvcnQgeyBXb3JrZmxvd0NoYW5nZU5vdGljZVdvcmtmbG93IH0gZnJvbSAnLi4vY29tbW9uL3dvcmtmbG93LWNoYW5nZS1ub3RpY2Utd29ya2Zsb3cnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEphdmFNYXZlblByb2plY3RPcHRpb25zIGV4dGVuZHMgQ29tbW9uSmF2YU9wdGlvbnMge31cblxuLyoqXG4gKiBTaGFyZWQgTWF2ZW4gYnVpbGQgc2tlbGV0b24gZm9yIGFsbCB0aHJlZSBKYXZhIHByb2plY3QgdHlwZXM6IHN0YW5kYXJkXG4gKiBgcG9tLnhtbGAvZGlyZWN0b3J5IGxheW91dCAodmlhIGBqYXZhLkphdmFQcm9qZWN0YCksIGEgUFItdHJpZ2dlcmVkXG4gKiBidWlsZCt0ZXN0KCtTb25hclF1YmUpIHdvcmtmbG93IHRoYXQgaGFyZC1mYWlscyBvbiBwcm9qZW4gZHJpZnQsIGFuZCBhXG4gKiBuaWdodGx5IGRlcGVuZGVuY3ktdXBncmFkZSB3b3JrZmxvdy5cbiAqL1xuZXhwb3J0IGNsYXNzIEphdmFNYXZlblByb2plY3QgZXh0ZW5kcyBqYXZhLkphdmFQcm9qZWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHVwZ3JhZGVUYXNrOiBUYXNrO1xuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRWZXJpZnlXb3JrZmxvdzogZ2l0aHViLlRhc2tXb3JrZmxvdztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBKYXZhTWF2ZW5Qcm9qZWN0T3B0aW9ucykge1xuICAgIHN1cGVyKHtcbiAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSxcbiAgICAgIGdyb3VwSWQ6IG9wdGlvbnMuZ3JvdXBJZCxcbiAgICAgIGFydGlmYWN0SWQ6IG9wdGlvbnMuYXJ0aWZhY3RJZCxcbiAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbiA/PyAnMC4xLjAnLFxuICAgICAgcHJvamVuQ3JlZGVudGlhbHM6IGdpdGh1Yi5HaXRodWJDcmVkZW50aWFscy5mcm9tUGVyc29uYWxBY2Nlc3NUb2tlbih7XG4gICAgICAgIHNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGdoID0gdGhpcy5naXRodWI7XG4gICAgaWYgKCFnaCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdKYXZhTWF2ZW5Qcm9qZWN0IHJlcXVpcmVzIEdpdEh1YiBpbnRlZ3JhdGlvbicpO1xuICAgIH1cblxuICAgIGFwcGx5SW50ZXJuYWxBY3Rpb25PdmVycmlkZXMoZ2gpO1xuXG4gICAgbmV3IFByb2plbkRyaWZ0Q2hlY2tXb3JrZmxvdyh0aGlzLCB7XG4gICAgICBnaGVUb2tlblNlY3JldDogb3B0aW9ucy5naGVUb2tlblNlY3JldCA/PyBERUZBVUxUX0dIRV9UT0tFTl9TRUNSRVQsXG4gICAgfSk7XG4gICAgbmV3IFdvcmtmbG93Q2hhbmdlTm90aWNlV29ya2Zsb3codGhpcyk7XG4gICAgbmV3IEFjdGlvbnNBbGxvd2xpc3RHdWFyZCh0aGlzKTtcblxuICAgIGNvbnN0IHBvc3RCdWlsZFN0ZXBzOiBnaXRodWIud29ya2Zsb3dzLkpvYlN0ZXBbXSA9IFtdO1xuICAgIGlmIChvcHRpb25zLnNvbmFyUHJvamVjdEtleSkge1xuICAgICAgcG9zdEJ1aWxkU3RlcHMucHVzaCh7XG4gICAgICAgIG5hbWU6ICdTb25hclF1YmUgc2NhbicsXG4gICAgICAgIHJ1bjogYG12biAtQiBzb25hcjpzb25hciAtRHNvbmFyLnByb2plY3RLZXk9JHtvcHRpb25zLnNvbmFyUHJvamVjdEtleX1gLFxuICAgICAgICBlbnY6IHsgU09OQVJfVE9LRU46ICcke3sgc2VjcmV0cy5TT05BUl9UT0tFTiB9fScgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbGRWZXJpZnlXb3JrZmxvdyA9IG5ldyBnaXRodWIuVGFza1dvcmtmbG93KGdoLCB7XG4gICAgICBuYW1lOiAnYnVpbGQnLFxuICAgICAgam9iSWQ6ICdidWlsZCcsXG4gICAgICB0YXNrOiB0aGlzLmJ1aWxkVGFzayxcbiAgICAgIHRyaWdnZXJzOiB7IHB1bGxSZXF1ZXN0OiB7fSwgd29ya2Zsb3dEaXNwYXRjaDoge30gfSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IGNvbnRlbnRzOiBnaXRodWIud29ya2Zsb3dzLkpvYlBlcm1pc3Npb24uUkVBRCB9LFxuICAgICAgcG9zdEJ1aWxkU3RlcHMsXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZ3JhZGVUYXNrID0gdGhpcy5hZGRUYXNrKCd1cGdyYWRlJywge1xuICAgICAgZXhlYzogJ212biAtQiB2ZXJzaW9uczp1c2UtbGF0ZXN0LXJlbGVhc2VzIHZlcnNpb25zOnVwZGF0ZS1wcm9wZXJ0aWVzJyxcbiAgICB9KTtcbiAgICBuZXcgVXBncmFkZVdvcmtmbG93KHRoaXMsIHsgdGFzazogdGhpcy51cGdyYWRlVGFzayB9KTtcbiAgfVxufVxuIl19
|
|
@@ -11,7 +11,7 @@ const java_maven_base_1 = require("./java-maven-base");
|
|
|
11
11
|
* Central); publish and deploy are both manual-dispatch, not on every merge.
|
|
12
12
|
*/
|
|
13
13
|
class JavaServiceProject extends java_maven_base_1.JavaMavenProject {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaServiceProject", version: "0.0.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@xpertss/projen-types.JavaServiceProject", version: "0.0.2" };
|
|
15
15
|
constructor(options) {
|
|
16
16
|
super(options);
|
|
17
17
|
this.pom.addDependency('org.springframework.boot/spring-boot-starter-web@^3');
|
package/package.json
CHANGED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# Release & Commit Methodology — `xpertss/projen` (`@xpertss/projen-types`)
|
|
2
|
+
|
|
3
|
+
## Scope
|
|
4
|
+
|
|
5
|
+
This document defines how to trigger a release of `@xpertss/projen-types` and the commit discipline required for a release to happen. It applies to the `release` workflow (`.github/workflows/release.yml`, generated by projen from `.projenrc.ts`).
|
|
6
|
+
|
|
7
|
+
**A release happens when a run of the `release` workflow finds at least one releasable commit since the last release tag** — a commit whose subject is typed `feat:` or `fix:` (see §2). Runs are started by any push to `main` (or manually, §1). A run whose window contains no `feat:`/`fix:` commits is a **green no-op** that publishes nothing — `docs:`, `ci:`, `chore:`, and other commits never release on their own.
|
|
8
|
+
|
|
9
|
+
Key words "MUST", "MUST NOT", "SHOULD" are to be interpreted as described in RFC 2119.
|
|
10
|
+
|
|
11
|
+
## 1. Triggering a release
|
|
12
|
+
|
|
13
|
+
- **Any push to `main`** starts the `release` workflow — direct push or merged PR. The run publishes only if the window since the last release tag contains a releasable commit (below); otherwise it is a no-op.
|
|
14
|
+
- The workflow can also be started manually: GitHub → **Actions** → `release` → **Run workflow** (optional `dry_run = true` runs everything except the actual `npm publish`) — useful for re-running after a failed build or to confirm a no-op window.
|
|
15
|
+
- At start of the run, the toolchain lists the **releasable commits** between the last release tag (`vX.Y.Z`) and `HEAD`: all non-merge commits whose subject matches `feat:` or `fix:` (with an optional scope and an optional `!`, e.g. `feat(parser)!: ...`).
|
|
16
|
+
- **≥ 1 releasable commit** → the run bumps the version, builds, and publishes to npm and GitHub Releases.
|
|
17
|
+
- **0 releasable commits** (e.g. only `docs:`, `ci:`, `chore:`, or unprefixed commits in the window) → the run is a **no-op**: green, no tag, no npm publish, no GitHub release. This is expected behavior, not an error.
|
|
18
|
+
|
|
19
|
+
## 2. Commit message rules
|
|
20
|
+
|
|
21
|
+
### 2.1 Format
|
|
22
|
+
|
|
23
|
+
Commit messages MUST use the [Conventional Commits](https://www.conventionalcommits.org/) format. Only the **first line (subject)** is parsed for the type, in the form:
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
type(scope)!: description
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
- `type` — lower-case; `feat` or `fix` makes the commit releasable (see §1).
|
|
30
|
+
- `scope` — optional, free-form (e.g. `fix(parser): ...`).
|
|
31
|
+
- `!` — optional breaking-change marker, see §2.3.
|
|
32
|
+
- `description` — imperative mood preferred ("add", not "added"/"adds").
|
|
33
|
+
|
|
34
|
+
### 2.2 Releasable types and the version bump
|
|
35
|
+
|
|
36
|
+
Only `feat:` and `fix:` commits are releasable. When a release run does release, the bump level for the window is:
|
|
37
|
+
|
|
38
|
+
| Window since last tag | Bump level | Example `0.1.0` → |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| Breaking change present (§2.3) | **major** | `1.0.0` |
|
|
41
|
+
| Else any `feat:` commit | **minor** | `0.2.0` |
|
|
42
|
+
| Else (only `fix:` commits) | **patch** | `0.1.1` |
|
|
43
|
+
|
|
44
|
+
Within one window, the highest level wins.
|
|
45
|
+
|
|
46
|
+
**All commits since the last tag are included in the release**, not only the releasable ones — `docs:`, `ci:`, `chore:`, and other commits appear in the generated release notes (under an "Other" heading) and are part of the released content. They simply do not, on their own, cause a release to happen.
|
|
47
|
+
|
|
48
|
+
### 2.3 Breaking changes
|
|
49
|
+
|
|
50
|
+
A change that is incompatible with existing consumers MUST be marked explicitly, one of:
|
|
51
|
+
|
|
52
|
+
- `!` directly before the colon: `feat!: drop legacy option`
|
|
53
|
+
- or a `BREAKING CHANGE:` paragraph in the commit **body** (the body, not the subject).
|
|
54
|
+
|
|
55
|
+
Because the releasable-commits check (§1) only inspects commit **subjects**, a breaking change MUST be carried by a `feat:`/`fix:` commit. A `BREAKING CHANGE:` note on any other commit type (e.g. `refactor:`) will never be released.
|
|
56
|
+
|
|
57
|
+
### 2.4 Examples
|
|
58
|
+
|
|
59
|
+
| Message | Effect |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `feat: add Java project scaffold` | releasable; minor bump |
|
|
62
|
+
| `fix: correct dependency range in .projenrc.ts` | releasable; patch bump |
|
|
63
|
+
| `feat!: remove deprecated option X` | releasable; major bump |
|
|
64
|
+
| `fix!: change default of option Y` | releasable; major bump |
|
|
65
|
+
| `docs: update publishing guide` | **not releasable** — no release unless the window also has a `feat:`/`fix:` |
|
|
66
|
+
| `ci: pin node version` | **not releasable** — no release unless the window also has a `feat:`/`fix:` |
|
|
67
|
+
| `Updated the README` (no prefix) | **not releasable** |
|
|
68
|
+
| `chore(release): 0.0.1` (auto-generated) | never counted — filtered out of the window |
|
|
69
|
+
|
|
70
|
+
## 3. What a release run does
|
|
71
|
+
|
|
72
|
+
Per run, in order:
|
|
73
|
+
|
|
74
|
+
1. The `release` job runs `npx projen release` = `rm -fr dist` → **bump** (resolve latest tag → list releasable commits → if none, stop as no-op; if any, set the new version in `package.json`, write the changelog to `dist/changelog.md`) → **build** (jsii) → **unbump** → `git diff` must be clean. A build failure aborts the run before anything is published.
|
|
75
|
+
2. Gates: `tag_exists` (is the computed release tag already on origin?) and `latest_commit == github.sha` (did someone push a newer commit mid-run?).
|
|
76
|
+
3. If gated through, `Publish to npm` and `Publish to GitHub Releases` run in parallel:
|
|
77
|
+
- **npm:** `publib-npm` with `NPM_TRUSTED_PUBLISHER=true` (OIDC, no token; see `spec/npm-publishing-setup.md`). A version that is already on the registry is reported as `SKIPPING: already published` — green, not an error.
|
|
78
|
+
- **GitHub:** `gh release create vX.Y.Z --target <sha>` with the generated changelog as body; this also creates/pushes the `vX.Y.Z` tag.
|
|
79
|
+
4. The `chore(release): vX.Y.Z` commit (author `github-actions[bot]`) lands on `main`.
|
|
80
|
+
|
|
81
|
+
## 4. Rules
|
|
82
|
+
|
|
83
|
+
### MUST
|
|
84
|
+
|
|
85
|
+
- Type commits `feat:` or `fix:` when the change should be part of a release.
|
|
86
|
+
- Mark breaking changes with `!` or a `BREAKING CHANGE:` **body** paragraph, on a `feat:`/`fix:` commit (§2.3).
|
|
87
|
+
- Treat a push to `main` whose window contains `feat:`/`fix:` commits as an imminent release — review accordingly.
|
|
88
|
+
- Verify after each release: `npm view @xpertss/projen-types version` and the GitHub **Releases** page.
|
|
89
|
+
|
|
90
|
+
### MUST NOT
|
|
91
|
+
|
|
92
|
+
- Push a `feat:`/`fix:` commit to `main` unless you are ready to publish — the run it triggers will release.
|
|
93
|
+
- Edit `package.json` `version` by hand, or add a `version` field to `.projenrc.ts` — the release toolchain owns version numbers.
|
|
94
|
+
- Move, rename, or rewrite release tags (`vX.Y.Z`) on `main` — the tag is the version baseline.
|
|
95
|
+
- Force-push `main` — it desyncs the tag baseline from history.
|
|
96
|
+
- Edit `.github/workflows/release.yml` directly — edit `.projenrc.ts` and run `npx projen`. In particular, renaming the workflow file or changing the `release_npm` job would orphan the npm **trusted publisher** configuration (see `spec/npm-publishing-setup.md`, step 3).
|
|
97
|
+
|
|
98
|
+
### SHOULD
|
|
99
|
+
|
|
100
|
+
- Use **squash merge** for PRs and make the *squash title* the conventional message — it replaces all underlying commit subjects and therefore decides whether the merged change is releasable.
|
|
101
|
+
- Use the imperative mood in the subject; one logical change per commit; subject ≤ 72 chars.
|
|
102
|
+
- Keep a releasable (`feat:`/`fix:`) commit in the window whenever you intend a release to include a given set of changes; otherwise bundle the changes into a `feat:`/`fix:` PR.
|
|
103
|
+
|
|
104
|
+
## 5. Edge cases and known behaviors
|
|
105
|
+
|
|
106
|
+
| Situation | Outcome |
|
|
107
|
+
|---|---|
|
|
108
|
+
| Push to `main` with `feat:`/`fix:` commits in the window | release run — minor / patch / major per §2.2 |
|
|
109
|
+
| Push or manual run whose window has only non-releasable commits (`docs:`, `ci:`, …) | no-op run — green, nothing published |
|
|
110
|
+
| Window contains `feat:` (no breaking) | minor bump (highest level wins) |
|
|
111
|
+
| Breaking change marked per §2.3 on a `feat:`/`fix:` commit | major bump |
|
|
112
|
+
| Run with no commits since the last release tag (e.g. re-run of the same HEAD) | no-op run |
|
|
113
|
+
| Run for an already-published tag | `tag_exists` gate skips publishing |
|
|
114
|
+
| Version already on npm (e.g. published manually beforehand) | `publib-npm` prints `SKIPPING: already published`, run is green |
|
|
115
|
+
| Two runs in rapid succession | concurrency group serializes; the second run's `latest_commit` gate handles drift |
|
|
116
|
+
| Build fails | run aborts, no tag, no publish — fix and trigger again |
|
|
117
|
+
| `chore(release):` is the latest commit | excluded from the window — no double release |
|
|
118
|
+
|
|
119
|
+
## References
|
|
120
|
+
|
|
121
|
+
- Workflow: `.github/workflows/release.yml` (projen-generated; source of truth is `.projenrc.ts`)
|
|
122
|
+
- Releasable-commits gate: `bump:releasable-commits` task (`.projen/tasks.json`) — `git log --no-merges --oneline $LATEST_TAG..HEAD -E --grep '^(feat|fix){1}(\(...\))?(!)?:...'`
|
|
123
|
+
- Bump engine: `commit-and-tag-version@12` (task `bump`, `.projen/tasks.json`), projen builtins `release/resolve-latest-tag`, `release/suggest-version-bump`, `release/apply-version-bump`
|
|
124
|
+
- Publishing credentials (OIDC trusted publisher, bootstrap, 2FA): `spec/npm-publishing-setup.md`
|
|
125
|
+
- Conventional Commits: https://www.conventionalcommits.org/
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { github } from 'projen';
|
|
2
|
-
/**
|
|
3
|
-
* Steps that re-run projen and fail the job if the generated output no
|
|
4
|
-
* longer matches what's committed - i.e. someone hand-edited a projen
|
|
5
|
-
* managed file (package.json/pom.xml/.github/workflows/*.yml/...) without
|
|
6
|
-
* going through .projenrc.
|
|
7
|
-
*/
|
|
8
|
-
export declare function driftCheckSteps(projenCommand?: string): github.workflows.JobStep[];
|