diff --git a/.gitattributes b/.gitattributes index 743cd7bf8..8851706bc 100644 --- a/.gitattributes +++ b/.gitattributes @@ -11,6 +11,7 @@ /.github/workflows/build.yml linguist-generated /.github/workflows/codecov.yml linguist-generated /.github/workflows/integ.yml linguist-generated +/.github/workflows/issue-label-assign.yml linguist-generated /.github/workflows/pull-request-lint.yml linguist-generated /.github/workflows/release.yml linguist-generated /.github/workflows/upgrade.yml linguist-generated diff --git a/.github/workflows/issue-label-assign.yml b/.github/workflows/issue-label-assign.yml new file mode 100644 index 000000000..4268d20b4 --- /dev/null +++ b/.github/workflows/issue-label-assign.yml @@ -0,0 +1,49 @@ +# ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen". + +name: issue-label-assign +on: + pull_request_target: + types: + - opened + issues: + types: + - opened + - edited +jobs: + Triage Issues: + name: Triage Manager + runs-on: aws-cdk_ubuntu-latest_4-core + permissions: + issues: write + pull-requests: write + env: + AREA_PARAMS: '[{"area":"@aws-cdk/cli-lib-alpha","keywords":["cli","cli-lib","cli-lib-alpha"],"labels":["@aws-cdk/cli-lib-alpha"]},{"area":"@aws-cdk/cloud-assembly-schema","keywords":["cloud-assembly","schema"],"labels":["@aws-cdk/cloud-assembly-schema"]},{"area":"@aws-cdk/cloudformation-diff","keywords":["diff","cloudformation"],"labels":["@aws-cdk/cloudformation-diff"]},{"area":"@aws-cdk/toolkit-lib","keywords":["toolkit","programmtic toolkit","toolkit-lib"],"labels":["@aws-cdk/toolkit-lib"]},{"area":"aws-cdk","keywords":["aws-cdk","cli","cdk cli"],"labels":["aws-cdk"]},{"area":"cdk-assets","keywords":["assets","cdk-assets"],"labels":["cdk-assets"]}]' + AREA_AFFIXES: '{"prefixes":["@aws-cdk/"]}' + OSDS_DEVS: '{"assignees":["ashishdhingra","khushail","hunhsieh"]}' + steps: + - name: Triage Manager + uses: aws-github-ops/aws-issue-triage-manager@main + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + target: issues + excluded-expressions: "[CDK CLI Version|TypeScript|Java|Python|Go]" + included-labels: "[needs-triage]" + excluded-labels: "[p1|p2|p0|effort-small|effort-medium|effort-large|guidance]" + default-area: ${{ env.OSDS_DEVS }} + parameters: ${{ env.AREA_PARAMS }} + affixes: ${{ env.AREA_AFFIXES }} + Triage Pull Requests: + name: Triage Manager + runs-on: aws-cdk_ubuntu-latest_4-core + permissions: + issues: write + pull-requests: write + steps: + - name: Triage Manager + uses: aws-github-ops/aws-issue-triage-manager@main + with: + github-token: ${{ secrets.PROJEN_GITHUB_TOKEN }} + target: pull-requests + default-area: '{"reviewers":{"teamReviewers":["aws-cdk-owners"]}}' + parameters: '[{"area":"pullrequests","keywords":["pullrequestkeyword"]}]' + area-is-keyword: true diff --git a/.gitignore b/.gitignore index 2ecaf4ae4..b9c3303ae 100644 --- a/.gitignore +++ b/.gitignore @@ -49,5 +49,6 @@ jspm_packages/ !/.github/dependabot.yml !/.github/workflows/integ.yml !/.github/workflows/codecov.yml +!/.github/workflows/issue-label-assign.yml !/.projenrc.ts !/.github/workflows/release.yml diff --git a/.projen/files.json b/.projen/files.json index 3d48f9561..ed7690bd3 100644 --- a/.projen/files.json +++ b/.projen/files.json @@ -9,6 +9,7 @@ ".github/workflows/build.yml", ".github/workflows/codecov.yml", ".github/workflows/integ.yml", + ".github/workflows/issue-label-assign.yml", ".github/workflows/pull-request-lint.yml", ".github/workflows/release.yml", ".github/workflows/upgrade.yml", diff --git a/.projenrc.ts b/.projenrc.ts index 55a378085..9ddf8156d 100644 --- a/.projenrc.ts +++ b/.projenrc.ts @@ -6,6 +6,7 @@ import { AdcPublishing } from './projenrc/adc-publishing'; import { BundleCli } from './projenrc/bundle'; import { CodeCovWorkflow } from './projenrc/codecov'; import { ESLINT_RULES } from './projenrc/eslint'; +import { IssueLabeler } from './projenrc/issue-labeler'; import { JsiiBuild } from './projenrc/jsii'; import { RecordPublishingTimestamp } from './projenrc/record-publishing-timestamp'; import { S3DocsPublishing } from './projenrc/s3-docs-publishing'; @@ -1352,4 +1353,6 @@ new CodeCovWorkflow(repo, { packages: [cli.name], }); +new IssueLabeler(repo); + repo.synth(); diff --git a/projenrc/issue-labeler.ts b/projenrc/issue-labeler.ts new file mode 100644 index 000000000..66e8616d2 --- /dev/null +++ b/projenrc/issue-labeler.ts @@ -0,0 +1,114 @@ +import { Component, github } from 'projen'; +import { JobPermission } from 'projen/lib/github/workflows-model'; +import { TypeScriptProject } from 'projen/lib/typescript'; + +const OSDS_DEVS = ['ashishdhingra', 'khushail', 'hunhsieh']; +const AREA_AFFIXES = ['@aws-cdk/']; +const AREA_PARAMS = [ + { area: '@aws-cdk/cli-lib-alpha', keywords: ['cli', 'cli-lib', 'cli-lib-alpha'], labels: ['@aws-cdk/cli-lib-alpha'] }, + { area: '@aws-cdk/cloud-assembly-schema', keywords: ['cloud-assembly', 'schema'], labels: ['@aws-cdk/cloud-assembly-schema'] }, + { area: '@aws-cdk/cloudformation-diff', keywords: ['diff', 'cloudformation'], labels: ['@aws-cdk/cloudformation-diff'] }, + { area: '@aws-cdk/toolkit-lib', keywords: ['toolkit', 'programmtic toolkit', 'toolkit-lib'], labels: ['@aws-cdk/toolkit-lib'] }, + { area: 'aws-cdk', keywords: ['aws-cdk', 'cli', 'cdk cli'], labels: ['aws-cdk'] }, + { area: 'cdk-assets', keywords: ['assets', 'cdk-assets'], labels: ['cdk-assets'] }, +]; + +enum GitHubToken { + GITHUB_TOKEN = 'secrets.GITHUB_TOKEN', + PROJEN_GITHUB_TOKEN = 'secrets.PROJEN_GITHUB_TOKEN', +} + +/** + * See https://github.com/aws-github-ops/aws-issue-triage-manager + */ +interface TriageManagerOptions { + target: 'pull-requests' | 'issues' | 'both'; + excludedExpressions?: string[]; + includedLabels?: string[]; + excludedLabels?: string[]; + defaultArea?: string; + parameters?: string; + affixes?: string; + areaIsKeyword?: boolean; + /** + * Whether or not the env variables are needed for the job. + * Workflow-level env variables are not configurable via Projen + */ + needEnvs?: boolean; + /** + * @default GitHubToken.GITHUB_TOKEN + */ + githubToken?: GitHubToken; +} + +function stringifyList(list: string[]) { + return `[${list.join('|')}]`; +} + +function triageManagerJob(triageManagerOptions: TriageManagerOptions) { + return { + name: 'Triage Manager', + runsOn: ['aws-cdk_ubuntu-latest_4-core'], + permissions: { issues: JobPermission.WRITE, pullRequests: JobPermission.WRITE }, + steps: [ + { + name: 'Triage Manager', + uses: 'aws-github-ops/aws-issue-triage-manager@main', + with: { + 'github-token': `\${{ ${triageManagerOptions.githubToken ?? 'secrets.GITHUB_TOKEN'} }}`, + 'target': triageManagerOptions.target, + 'excluded-expressions': triageManagerOptions.excludedExpressions ? stringifyList(triageManagerOptions.excludedExpressions) : undefined, + 'included-labels': triageManagerOptions.includedLabels ? stringifyList(triageManagerOptions.includedLabels) : undefined, + 'excluded-labels': triageManagerOptions.excludedLabels ? stringifyList(triageManagerOptions.excludedLabels) : undefined, + 'default-area': triageManagerOptions.defaultArea, + 'parameters': triageManagerOptions.parameters, + 'affixes': triageManagerOptions.affixes, + 'area-is-keyword': triageManagerOptions.areaIsKeyword, + }, + }, + ], + ...(triageManagerOptions.needEnvs ? { + env: { + AREA_PARAMS: JSON.stringify(AREA_PARAMS), + AREA_AFFIXES: `{"prefixes":${JSON.stringify(AREA_AFFIXES)}}`, + OSDS_DEVS: `{"assignees":${JSON.stringify(OSDS_DEVS)}}`, + }, + } : {}), + }; +} + +export class IssueLabeler extends Component { + public readonly workflow: github.GithubWorkflow; + + constructor(repo: TypeScriptProject) { + super(repo); + + if (!repo.github) { + throw new Error('Given repository does not have a GitHub component'); + } + + this.workflow = repo.github.addWorkflow('issue-label-assign'); + this.workflow.on({ + pullRequestTarget: { types: ['opened'] }, + issues: { types: ['opened', 'edited'] }, + }); + + this.workflow.addJob('Triage Issues', triageManagerJob({ + target: 'issues', + excludedExpressions: ['CDK CLI Version', 'TypeScript', 'Java', 'Python', 'Go'], + includedLabels: ['needs-triage'], + excludedLabels: ['p1', 'p2', 'p0', 'effort-small', 'effort-medium', 'effort-large', 'guidance'], + defaultArea: '${{ env.OSDS_DEVS }}', + parameters: '${{ env.AREA_PARAMS }}', + affixes: '${{ env.AREA_AFFIXES }}', + needEnvs: true, + })); + this.workflow.addJob('Triage Pull Requests', triageManagerJob({ + target: 'pull-requests', + areaIsKeyword: true, + defaultArea: '{"reviewers":{"teamReviewers":["aws-cdk-owners"]}}', + parameters: '[{"area":"pullrequests","keywords":["pullrequestkeyword"]}]', + githubToken: GitHubToken.PROJEN_GITHUB_TOKEN, + })); + } +}