From 23cd801837313785b2231d6d73e294bd6edf0feb Mon Sep 17 00:00:00 2001 From: Wagner Santos Date: Tue, 15 Oct 2019 10:07:40 -0300 Subject: [PATCH 1/5] feat: add ability to run commitlint on events that are not pull requests For any event that is not of type `pull_request`, we consider there will be a `GITHBU_SHA` defined and run lint against only this specific commit sha. This supports not only events of type `pull` but also other events that provide us a `GITHBU_SHA`, like `check_suite`. --- .github/workflows/test.yml | 11 +++++++++ package-lock.json | 48 +++++++++++++++++++++++--------------- package.json | 5 ++-- run.js | 48 +++++++++++++++++++++++++++++--------- 4 files changed, 80 insertions(+), 32 deletions(-) create mode 100644 .github/workflows/test.yml diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..1426d60 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,11 @@ +name: Test +on: [push] + +jobs: + commitlint: + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v1 + - uses: ./ diff --git a/package-lock.json b/package-lock.json index 0d8e277..b5defee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "commitlint-github-action", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -9,6 +9,11 @@ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.1.1.tgz", "integrity": "sha512-O5G6EmlzTVsng7VSpNtszIoQq6kOgMGNTFB/hmwKNNA4V71JyxImCIrL27vVHCt2Cb3ImkaCr6o27C2MV9Ylwg==" }, + "@actions/exec": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.1.tgz", + "integrity": "sha512-nvFkxwiicvpzNiCBF4wFBDfnBvi7xp/as7LE1hBxBxKG2L29+gkIPBiLKMVORL+Hg3JNf07AKRfl0V5djoypjQ==" + }, "@actions/github": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@actions/github/-/github-1.1.0.tgz", @@ -156,6 +161,20 @@ "@marionebl/sander": "0.6.1", "babel-runtime": "6.26.0", "git-raw-commits": "1.3.6" + }, + "dependencies": { + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "requires": { + "dargs": "4.1.0", + "lodash.template": "4.5.0", + "meow": "4.0.1", + "split2": "2.2.0", + "through2": "2.0.5" + } + } } }, "@commitlint/resolve-extends": { @@ -1322,31 +1341,23 @@ } }, "git-raw-commits": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", - "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.2.tgz", + "integrity": "sha512-HVvl6J3dx7CS9fWTtyZXA2ejhdq9p/GSU9EEVlJPb2pSgMuD7IWK3dERcUPsJj9SZrJJ6IIB+3Rsjx9FUDdE1Q==", "requires": { "dargs": "4.1.0", "lodash.template": "4.5.0", "meow": "4.0.1", "split2": "2.2.0", - "through2": "2.0.5" + "through2": "3.0.1" }, "dependencies": { - "meow": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", - "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "requires": { - "camelcase-keys": "4.2.0", - "decamelize-keys": "1.1.0", - "loud-rejection": "1.6.0", - "minimist": "1.2.0", - "minimist-options": "3.0.2", - "normalize-package-data": "2.5.0", - "read-pkg-up": "3.0.0", - "redent": "2.0.0", - "trim-newlines": "2.0.0" + "readable-stream": "2.3.6" } } } @@ -1793,7 +1804,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", - "dev": true, "requires": { "camelcase-keys": "4.2.0", "decamelize-keys": "1.1.0", diff --git a/package.json b/package.json index 3435d73..3a9f8f0 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "homepage": "https://github.com/wagoid/commitlint-github-action", "dependencies": { "@actions/core": "1.1.1", + "@actions/exec": "1.0.1", "@actions/github": "1.1.0", "@commitlint/config-angular": "8.2.0", "@commitlint/config-conventional": "7.6.0", @@ -24,9 +25,9 @@ "@commitlint/format": "8.2.0", "@commitlint/lint": "8.2.0", "@commitlint/load": "8.2.0", - "@commitlint/read": "8.2.0", "commitlint-config-jira": "1.0.9", - "conventional-changelog-lint-config-canonical": "1.0.0" + "conventional-changelog-lint-config-canonical": "1.0.0", + "git-raw-commits": "2.0.2" }, "devDependencies": { "conventional-changelog-cli": "2.0.23", diff --git a/run.js b/run.js index 48ba95a..4573bb7 100644 --- a/run.js +++ b/run.js @@ -1,13 +1,16 @@ -const { existsSync, readFileSync } = require('fs') +const { existsSync } = require('fs') const { resolve } = require('path') const core = require('@actions/core') const github = require('@actions/github') -const read = require('@commitlint/read') +const exec = require('@actions/exec') const lint = require('@commitlint/lint') const { format } = require('@commitlint/format') const load = require('@commitlint/load') +const gitRawCommits = require('git-raw-commits') -const githubToken = process.env.GITHUB_TOKEN +const pullRequestEvent = 'pull_request' + +const { GITHUB_TOKEN, GITHUB_EVENT_NAME, GITHUB_SHA } = process.env const configPath = resolve( process.env.GITHUB_WORKSPACE, @@ -15,7 +18,9 @@ const configPath = resolve( ) const getRangeFromPullRequest = async () => { - const octokit = new github.GitHub(githubToken) + if (GITHUB_EVENT_NAME !== pullRequestEvent) return [null, GITHUB_SHA] + + const octokit = new github.GitHub(GITHUB_TOKEN) const { owner, repo, number } = github.context.issue const { data: commits } = await octokit.pulls.listCommits({ owner, @@ -29,8 +34,30 @@ const getRangeFromPullRequest = async () => { return [from, to] } +function getHistoryCommits(from, to) { + const options = { + from, + to, + } + + if (!from) { + options.maxCount = 1 + } + + return new Promise((resolve, reject) => { + const data = [] + + gitRawCommits(options) + .on('data', chunk => data.push(chunk.toString('utf-8'))) + .on('error', reject) + .on('end', () => { + resolve(data) + }) + }) +} + const showLintResults = async ([from, to]) => { - const commits = await read({ from, to }) + const commits = await getHistoryCommits(from, to) const config = existsSync(configPath) ? await load({}, { file: configPath }) : {} @@ -46,18 +73,17 @@ const showLintResults = async ([from, to]) => { }, ) - if (formattedResults.length) { - process.stderr.write(formattedResults) - process.exit(1) + if (formattedResults) { + core.setFailed( + `You have commit messages with errors\n\n${formattedResults}`, + ) } else { console.log('Lint free! 🎉') } } const exitWithMessage = message => error => { - console.log(message) - console.error(error) - process.exit(1) + core.setFailed(`${message}\n${error}`) } const main = () => From 598e473cb441db3b8a81761f2d77f6182ce73993 Mon Sep 17 00:00:00 2001 From: Wagner Santos Date: Tue, 15 Oct 2019 10:19:36 -0300 Subject: [PATCH 2/5] feat: add firstParent input to ignore errors from your default branch --- README.md | 9 +++++++++ action.yml | 3 +++ run.js | 4 ++++ 3 files changed, 16 insertions(+) diff --git a/README.md b/README.md index cfad640..406e2ee 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,15 @@ jobs: The path to your commitlint config file. Default `commitlint.config.js`. +### `firstParent` + +When set to true, we follow only the first parent commit when seeing a merge commit. + +This helps to ignore errors in commits that were already present in your default branch (e.g. `master`) before adding conventional commit checks. +More info in [git-log docs](https://git-scm.com/docs/git-log#Documentation/git-log.txt---first-parent). + +Default `true` + ## About `extends` in your config file This is a [`Docker` action](https://github.com/actions/toolkit/blob/e2adf403d6d14a9ca7474976ccaca20f72ff8209/docs/action-types.md#why-would-i-choose-a-docker-action), and was made like this so that you can run it with minimum setup, regardless of your repo's environment. It comes packed with the most famous shared configurations that you can use in your commitlint config's `extends` field: diff --git a/action.yml b/action.yml index edfba44..90d2d10 100644 --- a/action.yml +++ b/action.yml @@ -5,6 +5,9 @@ inputs: configFile: description: 'commitlint config file' default: './commitlint.config.js' + firstParent: + description: 'when set to true, we follow only the first parent commit when seeing a merge commit. More info in git-log docs https://git-scm.com/docs/git-log#Documentation/git-log.txt---first-parent' + default: true runs: using: 'docker' image: 'docker://wagoid/commitlint-github-action:1.1.1' diff --git a/run.js b/run.js index 4573bb7..885786b 100644 --- a/run.js +++ b/run.js @@ -40,6 +40,10 @@ function getHistoryCommits(from, to) { to, } + if (core.getInput('firstParent') === 'true') { + options.firstParent = true + } + if (!from) { options.maxCount = 1 } From 2e19de5fb949e313552e3f8df2239d03b2ce0acd Mon Sep 17 00:00:00 2001 From: Wagner Santos Date: Tue, 15 Oct 2019 10:22:14 -0300 Subject: [PATCH 3/5] chore: removed not needed files from the Docker image --- .dockerignore | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..89b1663 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +node_modules +.commitlintrc.yml +commitlint.config.js +action.yml +.github +CHANGELOG.md From 02bab91ad946ae3722db6b73d0b5f5ab54a37775 Mon Sep 17 00:00:00 2001 From: Wagner Santos Date: Tue, 15 Oct 2019 11:00:31 -0300 Subject: [PATCH 4/5] test: build action docker image locally when running tests --- .github/workflows/commitlint.yml | 2 ++ .github/workflows/test.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/.github/workflows/commitlint.yml b/.github/workflows/commitlint.yml index 631cb69..e60fa4a 100644 --- a/.github/workflows/commitlint.yml +++ b/.github/workflows/commitlint.yml @@ -8,6 +8,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v1 + - run: sed -i -E "s/([']docker:.+)/Dockerfile/" ./action.yml - uses: ./ commitlint-with-yml-file: runs-on: ubuntu-latest @@ -15,6 +16,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v1 + - run: sed -i -E "s/([']docker:.+)/Dockerfile/" ./action.yml - uses: ./ with: configFile: './.commitlintrc.yml' diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1426d60..c882698 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,4 +8,5 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v1 + - run: sed -i -E "s/([']docker:.+)/Dockerfile/" ./action.yml - uses: ./ From dab1d7d5fda9697022413a069c63c52c0b412f7f Mon Sep 17 00:00:00 2001 From: Wagner Santos Date: Tue, 15 Oct 2019 11:32:39 -0300 Subject: [PATCH 5/5] chore(release): bump version --- CHANGELOG.md | 9 +++++++++ action.yml | 2 +- package.json | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 63f63b4..9e10d3a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,12 @@ + + +## [1.2.1](https://github.com/wagoid/commitlint-github-action/compare/v1.1.1...v1.2.0) (2019-10-15) + +### Features + +- add ability to run commitlint on events that are not pull requests ([23cd801](https://github.com/wagoid/commitlint-github-action/commit/23cd801)) +- add firstParent input to ignore errors from your default branch ([598e473](https://github.com/wagoid/commitlint-github-action/commit/598e473)) + ## [1.1.1](https://github.com/wagoid/commitlint-github-action/compare/v1.1.0...v1.1.1) (2019-10-08) diff --git a/action.yml b/action.yml index 90d2d10..df997aa 100644 --- a/action.yml +++ b/action.yml @@ -10,7 +10,7 @@ inputs: default: true runs: using: 'docker' - image: 'docker://wagoid/commitlint-github-action:1.1.1' + image: 'docker://wagoid/commitlint-github-action:1.2.0' branding: icon: 'check-square' color: 'blue' diff --git a/package.json b/package.json index 3a9f8f0..e51e975 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "commitlint-github-action", - "version": "1.1.1", + "version": "1.2.0", "description": "commitlint github action", "main": "index.js", "scripts": {