Skip to content

Commit

Permalink
Merge branch 'main' into chore/labels
Browse files Browse the repository at this point in the history
  • Loading branch information
hilmarf committed Nov 22, 2024
2 parents c49d893 + a065a76 commit 590b40d
Show file tree
Hide file tree
Showing 3 changed files with 120 additions and 28 deletions.
26 changes: 19 additions & 7 deletions .github/config/labeler.yml
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
# see https://github.com/actions/labeler?tab=readme-ov-file#match-object to configure correctly
kind/feature:
- head-branch: 'feature/*'
kind/fix:
- head-branch: 'fix/*'
kind/chore:
- head-branch: 'chore/*'
kind/dependency:
- any:
- head-branch: 'dependencies/*'
- head-branch: 'dependabot/*'
- changed-files:
- any-glob-to-any-file: ['go.mod', 'go.sum']
component/github-actions:
- any:
- changed-files:
- any-glob-to-any-file: ['.github/**']
- any-glob-to-any-file: ['.github/**']
area/documentation:
- any:
- changed-files:
- any-glob-to-any-file: ['docs/**', 'examples/**']
component/ocm-cli:
- any:
- changed-files:
- any-glob-to-any-file: ['components/ocmcli/**', 'cmds/ocm/**']
component/ocm-spec:
- any:
- changed-files:
- any-glob-to-any-file: ['resources/**']
kind/skip-release-notes:
- any:
- changed-files:
- any-glob-to-any-file: ['flake.lock', 'flake.nix']
105 changes: 101 additions & 4 deletions .github/workflows/pull-request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,104 @@ permissions:
issues: write

jobs:
branch-name-labeler:
conventional-commit-labeler:
name: Label PR based on Conventional Commit Specification
permissions:
contents: read
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v7
env:
TYPE_TO_LABEL: |
{
"feat":"kind/enhancement",
"fix":"fix",
"chore":"chore",
"docs":"kind/documentation",
"test":"kind/test",
"perf":"kind/performance"
}
SCOPE_TO_LABEL: |
{
"deps":"dependencies"
}
BREAKING_CHANGE_LABEL: "breaking"
with:
script: |
console.log("Verify that the PR title follows the Conventional Commit format");
// Parse mappings from environment variables
const typeToLabel = JSON.parse(process.env.TYPE_TO_LABEL);
const scopeToLabel = JSON.parse(process.env.SCOPE_TO_LABEL);
console.log("Type-to-Label Mapping:", typeToLabel);
console.log("Scope-to-Label Mapping:", scopeToLabel);
// Dynamically generate allowed types
const allowedTypes = Object.keys(typeToLabel).join('|');
console.log(`Allowed Types: ${allowedTypes}`);
const prTitle = context.payload.pull_request.title;
console.log(`PR Title: ${prTitle}`);
// We know this regex looks scary, but it's just to match the Conventional Commit format
// It parses out a Title into several named regex groups, which we can use to extract various semantic patterns:
// - type: The type of change (feat, fix, etc.)
// - scope: The scope of the change (optional and set in brackets)
// - breaking: A flag to indicate a breaking change (!)
// - subject: The subject of the change
// Example: feat(scope)!: add new feature
// ^^^^ ^^^^^ ^ ^^^^^^^^^^^^^^^
// type scope subject
const regex = new RegExp(
`^(((Initial commit)|(Merge [^\\r\\n]+(\\s)[^\\r\\n]+((\\s)((\\s)[^\\r\\n]+)+)*(\\s)?)|^((?<type>${allowedTypes})(\\((?<scope>[\\w\\-]+)\\))?(?<breaking>!?): (?<subject>[^\\r\\n]+((\\s)((\\s)[^\\r\\n]+)+)*))(\\s)?)$)`
);
console.log(`Regex: ${regex}`);
const match = prTitle.match(regex);
console.log(`Match: ${match != null}`);

if (match && match.groups) {
const { type, scope, breaking } = match.groups;

// Initialize labels array
const labels = [];

if (breaking) {
console.log("Adding breaking change label");
labels.push(process.env.BREAKING_CHANGE_LABEL);
}

// Add type-based label
if (type && typeToLabel[type]) {
labels.push(typeToLabel[type]);
} else {
console.log(`No label found for type: ${type}`);
}

// Add scope-based label if scope exists
if (scope && scopeToLabel[scope]) {
labels.push(scopeToLabel[scope]);
} else if (scope) {
console.log(`No label found for scope: ${scope}`);
}

if (labels.length > 0) {
console.log(`Adding labels: ${labels}`);
await github.rest.issues.addLabels({
owner: context.repo.owner,
repo: context.repo.repo,
issue_number: context.payload.pull_request.number,
labels: labels,
});
} else {
console.log("No labels to add.");
}
} else {
console.log("Invalid PR title format. Make sure you named the PR after the specification at https://www.conventionalcommits.org/en/v1.0.0/#specification. Exiting...");
process.exit(1);
}
labeler:
name: Label PR based on Config
permissions:
contents: read
Expand Down Expand Up @@ -54,14 +151,14 @@ jobs:
# github_api_url: 'api.github.com'
# files_to_ignore: ''
verify-labels:
needs: [branch-name-labeler, size-labeler]
needs: [labeler, size-labeler, conventional-commit-labeler]
name: verify labels
runs-on: ubuntu-latest
steps:
- name: PRs should have at least one qualifying label
uses: docker://agilepathway/pull-request-label-checker:latest
with:
one_of: kind/chore,kind/fix,kind/feature,kind/dependency,kind/documentation,kind/refactor,kind/skip-release-notes
one_of: kind/chore,kind/fix,kind/feature,kind/dependency,area/documentation,kind/refactor,kind/skip-release-notes
repo_token: ${{ secrets.GITHUB_TOKEN }}
semantic-pr-title:
name: ensure pr conforms to semantic commit style
Expand All @@ -73,4 +170,4 @@ jobs:
# We want this because we use squashing so all squashed commits should conform to our commit style
- uses: amannn/action-semantic-pull-request@v5
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
17 changes: 0 additions & 17 deletions RELEASE_PROCESS.md
Original file line number Diff line number Diff line change
Expand Up @@ -222,23 +222,6 @@ them through all release candidates manually.
(TODO: this needs improvement by allowing us to do "append-only" style release
notes, see [this issue](https://github.com/open-component-model/ocm/issues/1097) for details)

When a release is created, the release notes are copied to
the [./docs/releasenotes](./docs/releasenotes) folder in that branch
with a dedicated commit. If the release notes for that branch already exist in
the folder, the release notes are taken from the file
instead of the draft notes from GitHub. This means that you can also create a
Pull Request to the branch with the corresponding release notes
and it will be used for the release.
(TODO: Currently we have not decided if we want to permanently keep the notes
and thus need a PR to main to append them, or if we want to drop them in the
future. That's because they are currently needed to correctly manage notes
over multiple release candidates, see
[this issue](https://github.com/open-component-model/ocm/issues/1097)
for details.)

By default, this file is generated from the
appropriate draft release with the basic release name (e.g. `v0.1.0-rc.1.md`).

## What is part of a release?

During the build of a release, an OCM CTF (Common Transport Format Archive) is
Expand Down

0 comments on commit 590b40d

Please sign in to comment.