Read this in other languages: English, 日本語.
This is a GitHub Actions
that automates the release of GitHub Actions
.
Once you create a new tag, this action will automatically
- Run build
- Create branch for release
- Change tags to release branch
- If there is release which has same tag name and has been published, re-publish it (Because if the tag is changed, the release will be in a draft state).
Details
e.g. .github/workflows/release.yml
#on:
# push:
# tags:
# - "v*"
on: create
name: Release
jobs:
release:
name: Release GitHub Actions
runs-on: ubuntu-latest
steps:
- uses: technote-space/release-github-actions@v4
name | description | default | required | e.g. |
---|---|---|---|---|
BUILD_COMMAND | Build command More details of execute command |
yarn build:all |
||
CLEAN_TARGETS | Files or directories to clean before release (Comma separated) Absolute path and .. are not permitted to use.More details of execute command |
.[!.]*,__tests__,src,*.js,*.ts,*.json,*.lock,*.yml,*.yaml |
true | .[!.]*,*.txt |
PACKAGE_MANAGER | Package manager to use to install dependencies If there is yarn.lock or package-lock.json , the action automatically determines the package manager to use, but this option can be used to specify it explicitly.( npm or yarn ) |
yarn |
||
COMMIT_MESSAGE | Commit message | feat: build for release |
true | feat: release |
COMMIT_NAME | Commit name | github-actions[bot] |
true | |
COMMIT_EMAIL | Commit email | 41898282+github-actions[bot]@users.noreply.github.com |
true | |
BRANCH_NAME | Branch name for GitHub Actions release |
releases/${MAJOR} |
true | releases/${MINOR} , releases/${PATCH} |
BUILD_COMMAND_TARGET | Command for search build command | build, production, prod, package |
compile |
|
CREATE_MAJOR_VERSION_TAG | Whether to create major version tag (e.g. v1) Detail of tags |
true |
false |
|
CREATE_MINOR_VERSION_TAG | Whether to create minor version tag (e.g. v1.2) Detail of tags |
true |
false |
|
CREATE_PATCH_VERSION_TAG | Whether to create patch version tag (e.g. v1.2.3) Detail of tags |
true |
false |
|
FETCH_DEPTH | Limit fetching to the specified number of commits from the tip of each remote branch history | 3 |
5 |
|
TEST_TAG_PREFIX | Prefix for test tag | test/ |
||
CLEAN_TEST_TAG | Whether to clean test tag | false |
true |
|
ORIGINAL_TAG_PREFIX | Prefix to add when leaving the original tag | original/ |
||
GITHUB_TOKEN | Access token | ${{github.token}} |
true | ${{secrets.ACCESS_TOKEN}} |
- If package.json includes
build
,production
,prod
orpackage
in scripts, the command is used for build. (You can change this with BUILD_COMMAND_TARGET) - If command does not have install command like
npm run install
oryarn install
, install commands are added.
so if BUILD_COMMAND
is not provided and package.json has build
script,
the following commands are executed for build.
yarn install
yarn build
yarn install --production
To execute GitHub Actions
, src files used for build
, test files
, test settings
, etc. are not required.
And GitHub Actions
is downloaded every time when it is used, so fewer files are better.
CLEAN_TARGETS
option is used for this purpose.
default: .[!.]*,__tests__,src,*.js,*.ts,*.json,*.lock,*.yml,*.yaml
rm -rdf .[!.]*
rm -rdf *.js
rm -rdf *.ts
rm -rdf *.json
rm -rdf *.lock
rm -rdf *.yml
rm -rdf *.yaml
rm -rdf __tests__ src
(action.yml is not subject to deletion.)
The default setting assumes the use of Action template for TypeScript
or Action template for JavaScript
.
https://github.com/actions/typescript-action
https://github.com/actions/javascript-action
However, these templates have security issues etc, you must do the following.
If a pull request includes a built file, it is highly likely that even malicious code will be missed in a review, so you need to fix .gitignore
as follows:
.gitignore
+ /dist
Since processing by ncc
is unnecessary, delete the related commands and packages and modify action.yml
to use script built with tsc
.
action.yml
name: 'Your name here'
description: 'Provide a description here'
author: 'Your name or organization here'
inputs:
myInput: # change this
description: 'input description here'
default: 'default value if applicable'
runs:
using: 'node12'
- main: 'dist/index.js'
+ main: 'lib/main.js'
package.json
"scripts": {
"build": "tsc",
"format": "prettier --write **/*.ts",
"format-check": "prettier --check **/*.ts",
"lint": "eslint src/**/*.ts",
- "pack": "ncc build",
- "test": "jest",
- "all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
+ "test": "jest"
},
"devDependencies": {
"@types/jest": "^24.0.23",
"@types/node": "^12.7.12",
"@typescript-eslint/parser": "^2.8.0",
- "@zeit/ncc": "^0.20.5",
"eslint": "^5.16.0",
"eslint-plugin-github": "^2.0.0",
"eslint-plugin-jest": "^22.21.0",
"jest": "^24.9.0",
"jest-circus": "^24.9.0",
"js-yaml": "^3.13.1",
"prettier": "^1.19.1",
"ts-jest": "^24.2.0",
"typescript": "^3.6.4"
}
Or use the template I created.
You can see an example of GitHub Actions
with unnecessary files deleted below.
https://github.com/technote-space/release-github-actions/tree/gh-actions
eventName: action | condition |
---|---|
push: * | condition |
release: published | condition |
create: * | condition |
- tags
- semantic versioning tag (e.g.
v1.2.3
) - test tag (e.g.
test/v1.2.3
)
- semantic versioning tag (e.g.
Releasing GitHub Actions
needs all build files and dependencies like node_modules
, but are not usually committed.
So if you want to release GitHub Actions
, you have to do following steps.
- Develop locally on the branch for develop
- Build for release
- Commit all source code including dependencies like
node_modules
to branch for release - Add tags (consider major, minor and patch versions)
- Push to GitHub
- Publish release
It is very troublesome to do this steps for every release.
If you use this GitHub Actions
, the steps to do are simpler.
- Develop locally on the branch for develop
- Publish release (Create tag)
- Wait for the automated steps to finish
- Build for release
- Commit all source code including dependencies like
node_modules
to branch for release - Add tags (consider major, minor and patch versions)
- Push to GitHub
Tag name format must be Semantic Versioning.
The following tags will be created.
- tag name
- major tag name (generated by tag name)
- e.g.
v1
- e.g.
- minor tag name (generated by tag name)
- e.g.
v1.2
- e.g.
- patch tag name (generated by tag name)
- e.g.
v1.2.3
- e.g.