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 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 new file mode 100644 index 0000000..c882698 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,12 @@ +name: Test +on: [push] + +jobs: + commitlint: + runs-on: ubuntu-latest + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + steps: + - uses: actions/checkout@v1 + - run: sed -i -E "s/([']docker:.+)/Dockerfile/" ./action.yml + - uses: ./ 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/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..df997aa 100644 --- a/action.yml +++ b/action.yml @@ -5,9 +5,12 @@ 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' + image: 'docker://wagoid/commitlint-github-action:1.2.0' branding: icon: 'check-square' color: 'blue' 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..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": { @@ -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..885786b 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,34 @@ const getRangeFromPullRequest = async () => { return [from, to] } +function getHistoryCommits(from, to) { + const options = { + from, + to, + } + + if (core.getInput('firstParent') === 'true') { + options.firstParent = true + } + + 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 +77,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 = () =>