diff --git a/README.md b/README.md index 3b454c0..8cdae73 100644 --- a/README.md +++ b/README.md @@ -2,23 +2,30 @@ This action will read a `package.json` file and compare the `version` attribute to the project's known tags. If a corresponding tag does not exist, it will be created. +This tag works well in combination with: + +- [actions/create-release](https://github.com/actions/create-release) (Auto-release) +- [author/action-publish](https://github.com/author/action-publish) (Auto-publish JavaScript/Node modules) +- [author/action-rollback](https://github.com/author/action-rollback) (Auto-rollback releases on failures) +- [author/template-cross-runtime](https://github.com/author/template-cross-runtime) (a cross-runtime JavaScript repo template) + ## Usage -The following is an example `.github/main.workflow` that will execute when a `push` to the `master` branch occurs. +The following is an example `.github/workflows/main.yml` that will execute when a `push` to the `master` branch occurs. ```yaml -name: My Workflow +name: Create Tag on: push: branches: - - master + - master jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - uses: actions/checkout@v2 - uses: butlerlogic/action-autotag@stable with: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" @@ -29,8 +36,8 @@ To make this work, the workflow must have the checkout action _before_ the autot This **order** is important! ```yaml -- uses: actions/checkout@master -- uses: butlerlogic/action-autotag@1.0.0 +- uses: actions/checkout@v2 +- uses: butlerlogic/action-autotag@stable ``` > If the repository is not checked out first, the autotagger cannot find the package.json file. @@ -40,7 +47,7 @@ This **order** is important! The `GITHUB_TOKEN` must be passed in. Without this, it is not possible to create a new tag. Make sure the autotag action looks like the following example: ```yaml -- uses: butlerlogic/action-autotag@1.0.0 +- uses: butlerlogic/action-autotag@stable with: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" ``` @@ -64,7 +71,7 @@ There are several options to customize how the tag is created. 1. `tag_prefix` - By default, `package.json` uses [semantic versioning](https://semver.org/), such as `1.0.0`. A prefix can be used to add text before the tag name. For example, if `tag_prefx` is set to `v`, then the tag would be labeled as `v1.0.0`. + By default, `package.json` uses [semantic versioning](https://semver.org/), such as `1.0.0`. A prefix can be used to add text before the tag name. For example, if `tag_prefix` is set to `v`, then the tag would be labeled as `v1.0.0`. ```yaml - uses: butlerlogic/action-autotag@1.0.0 diff --git a/lib/main.js b/lib/main.js index 5036452..26bc899 100644 --- a/lib/main.js +++ b/lib/main.js @@ -1,13 +1,11 @@ -const github = require('@actions/github') const core = require('@actions/core') +const { GitHub, context } = require('@actions/github') const fs = require('fs') const path = require('path') const os = require('os') async function run() { try { - const { repo } = github.context - core.debug( ` Available environment variables:\n -> ${Object.keys(process.env) .map(i => i + ' :: ' + process.env[i]) @@ -23,6 +21,13 @@ async function run() { core.debug(` Working Directory: ${process.env.GITHUB_WORKSPACE}:\n${dir}`) + if (!process.env.hasOwnProperty('GITHUB_TOKEN')) { + if (!process.env.hasOwnProperty('INPUT_GITHUB_TOKEN')) { + core.setFailed('Invalid or missing GITHUB_TOKEN.') + return + } + } + const pkg_root = core.getInput('package_root', { required: false }) const pkgfile = path.join(process.env.GITHUB_WORKSPACE, pkg_root, 'package.json') if (!fs.existsSync(pkgfile)) { @@ -34,47 +39,22 @@ async function run() { core.setOutput('version', pkg.version) core.debug(` Detected version ${pkg.version}`) -// core.debug(` Available environment variables:\n -> ${Object.keys(process.env).map(i => i + ' :: ' + process.env[i]).join('\n -> ')}`) + // Get authenticated GitHub client (Ocktokit): https://github.com/actions/toolkit/tree/master/packages/github#usage + const github = new GitHub(process.env.GITHUB_TOKEN || process.env.INPUT_GITHUB_TOKEN) -// let version = "" + // Get owner and repo from context of payload that triggered the action + const { owner, repo } = context.repo -// if (!process.env.hasOwnProperty('INPUT_VERSION') || process.env.INPUT_VERSION.trim().length === 0) { -// let dir = fs.readdirSync(path.resolve(process.env.GITHUB_WORKSPACE), { withFileTypes: true }).map(entry => { -// return `${entry.isDirectory() ? '> ' : ' - '}${entry.name}` -// }).join('\n') - -// core.debug(` Working Directory: ${process.env.GITHUB_WORKSPACE}:\n${dir}`) - -// const pkg_root = core.getInput('package_root', { required: false }) -// let pkgfile = path.join(process.env.GITHUB_WORKSPACE, pkg_root, 'package.json') - -// if (!fs.existsSync(pkgfile)) { -// core.setFailed('package.json does not exist.') -// return -// } - -// let pkg = require(pkgfile) -// version = pkg.version -// } else { -// version = process.env.INPUT_VERSION.trim() -// } - -// core.setOutput('version', version) -// core.debug(` Detected version ${version}`) - - - if (!process.env.hasOwnProperty('INPUT_GITHUB_TOKEN') || process.env.INPUT_GITHUB_TOKEN.trim().length === 0) { - core.setFailed('Invalid or missing GITHUB_TOKEN.') - return - } - - // Check for existing tag - const git = new github.GitHub(process.env.INPUT_GITHUB_TOKEN) + // // Check for existing tag + // const git = new github.GitHub(process.env.INPUT_GITHUB_TOKEN || process.env.GITHUB_TOKEN) + // const owner = process.env.GITHUB_REPOSITORY.split('/').shift() + // const repo = process.env.GITHUB_REPOSITORY.split('/').pop() let tags try { - tags = await git.repos.listTags({ - ...repo, + tags = await github.repos.listTags({ + owner, + repo, per_page: 100, }) } catch (e) { @@ -83,16 +63,17 @@ async function run() { } } + const tagPrefix = core.getInput('tag_prefix', { required: false }) + const tagSuffix = core.getInput('tag_suffix', { required: false }) + const getTagName = version => { - const tagPrefix = core.getInput('tag_prefix', { required: false }) - const tagSuffix = core.getInput('tag_suffix', { required: false }) return `${tagPrefix}${version}${tagSuffix}` } // Check for existance of tag and abort (short circuit) if it already exists. for (let tag of tags.data) { if (tag.name === getTagName(pkg.version)) { - console.log(`"${tag.name.trim()}" tag already exists.` + os.EOL) + core.warning(`"${tag.name.trim()}" tag already exists.` + os.EOL) core.setOutput('tagname', '') return } @@ -106,8 +87,9 @@ async function run() { try { latestTag = tags.data.shift() - let changelog = await git.repos.compareCommits({ - ...repo, + let changelog = await github.repos.compareCommits({ + owner, + repo, base: latestTag.name, head: 'master', }) @@ -125,7 +107,7 @@ async function run() { ) .join('\n') } catch (e) { - console.log('Failed to generate changelog from commits: ' + e.message + os.EOL) + core.warning('Failed to generate changelog from commits: ' + e.message + os.EOL) tagMsg = tagName } } @@ -134,15 +116,16 @@ async function run() { try { tagMsg = tagMsg.trim().length > 0 ? tagMsg : `Version ${pkg.version}` - newTag = await git.git.createTag({ - ...repo, + newTag = await github.git.createTag({ + owner, + repo, tag: tagName, message: tagMsg, object: process.env.GITHUB_SHA, - type: 'commit', + type: 'commit' }) - console.log(`Created new tag: ${newTag.data.tag}` + os.EOL) + core.warning(`Created new tag: ${newTag.data.tag}`) } catch (e) { core.setFailed(e.message) return @@ -150,16 +133,18 @@ async function run() { let newReference try { - newReference = await git.git.createRef({ - ...repo, + newReference = await github.git.createRef({ + owner, + repo, ref: `refs/tags/${newTag.data.tag}`, sha: newTag.data.sha, }) - console.log(`Reference ${newReference.data.ref} available at ${newReference.data.url}` + os.EOL) + core.warning(`Reference ${newReference.data.ref} available at ${newReference.data.url}` + os.EOL) } catch (e) { core.warning({ - ...repo, + owner, + repo, ref: `refs/tags/${newTag.data.tag}`, sha: newTag.data.sha, }) @@ -174,6 +159,7 @@ async function run() { core.setOutput('tagsha', newTag.data.sha) core.setOutput('taguri', newReference.data.url) core.setOutput('tagmessage', tagMsg.trim()) + core.setOutput('tagref', newReference.data.ref) } } catch (error) { core.warning(error.message) @@ -181,6 +167,7 @@ async function run() { core.setOutput('tagsha', '') core.setOutput('taguri', '') core.setOutput('tagmessage', '') + core.setOutput('tagref', '') } }