Read this in other languages: English, 日本語.
これは GitHub Actions
のリリースを自動化するための GitHub Actions
です。
タグを作成するとこのアクションは自動で以下を行います。
- ビルド実行
- リリース用ブランチ作成
- リリース用ブランチにタグを張り替え
- 同じタグ名 かつ 公開済みのリリースが存在する場合、再度公開 (タグを張り替えた場合、リリースが下書き状態になるため)
Details
例:.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@v6
name | description | default | required | e.g. |
---|---|---|---|---|
BUILD_COMMAND | ビルド用コマンド コマンドの詳細 |
yarn build:all |
||
CLEAN_TARGETS | リリース前に掃除するファイルやディレクトリ (カンマ区切り) 絶対パスや .. は使用できませんコマンドの詳細 |
.[!.]*,__tests__,docs,src,*.js,*.ts,*.json,*.lock,*.yml,*.yaml |
true | .[!.]*,*.txt |
PACKAGE_MANAGER | 依存関係のインストールに使用するパッケージマネージャーyarn.lock や package-lock.json がある場合は自動で使用するパッケージマネージャーを決定しますが、このオプションで強制することができます( npm または yarn ) |
yarn |
||
COMMIT_MESSAGE | コミット時に設定するメッセージ | feat: build for release |
true | feat: release |
COMMIT_NAME | コミット時に設定する名前 | github-actions[bot] |
true | |
COMMIT_EMAIL | コミット時に設定する名前 | 41898282+github-actions[bot]@users.noreply.github.com |
true | |
BRANCH_NAME | GitHub Actions 用のブランチ名 | gh-actions |
true | gh-actions/${MAJOR}/${MINOR}/${PATCH} |
BUILD_COMMAND_TARGET | ビルド用コマンド検索ターゲット | prepare, build, production, prod, package, pack |
compile |
|
ALLOW_MULTIPLE_BUILD_COMMANDS | 複数のビルドコマンド実行を許可するかどうか | true |
false |
|
CREATE_MAJOR_VERSION_TAG | メジャーバージョンタグ(例:v1)を作成するかどうか タグの詳細 |
true |
false |
|
CREATE_MINOR_VERSION_TAG | マイナーバージョンタグ(例:v1.2)を作成するかどうか タグの詳細 |
true |
false |
|
CREATE_PATCH_VERSION_TAG | パッチバージョンタグ(例:v1.2.3)を作成するかどうか タグの詳細 |
true |
false |
|
FETCH_DEPTH | 取得するコミット履歴の制限数 | 3 |
5 |
|
TEST_TAG_PREFIX | テスト用タグのプリフィックス | test/ |
||
CLEAN_TEST_TAG | テストタグを掃除するかどうか | false |
true |
|
ORIGINAL_TAG_PREFIX | 元のタグを残す際に付与するプリフィックス | original/ |
||
GITHUB_TOKEN | アクセストークン | ${{github.token}} |
true | ${{secrets.ACCESS_TOKEN}} |
prepare
、build
、production
、prod
、package
またはpack
が package.json の scripts に含まれる場合、ビルド用のコマンドとしてそれらを使用します。(BUILD_COMMAND_TARGET で変更可能です)npm run install
やyarn install
のようなインストール用コマンドが存在しない場合、インストール用コマンドが追加されます。
したがって、BUILD_COMMAND
が設定されていない かつ package.json に build
が存在する場合、以下のコマンドが実行されます。
yarn install
yarn build
yarn install --production
build
と pack
が含まれる場合は、以下のコマンドになります。
yarn install
yarn build
yarn pack
yarn install --production
GitHub Actions
の実行には「ビルドに使用するソース」や「テストファイル」、「テストの設定」などを必要としません。
そして GitHub Actions
は使用されるたびにダウンロードされるため、ファイルは少ないほうが良いです。
CLEAN_TARGETS
オプションはこの目的のために使用されます。
default: .[!.]*,__tests__,docs,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__ docs src
(action.yml は削除の対象ではありません)
このデフォルト値は「TypeScriptのActionテンプレート」や「JavaScriptのActionテンプレート」の使用を想定した値になっています。
https://github.com/actions/typescript-action
https://github.com/actions/javascript-action
ただし上記テンプレートにはセキュリティ上の問題などがあるため、以下の対応が必要です。
プルリクエストにビルドしたファイルが含まれる場合、悪意のあるコードが埋め込まれていてもレビューで見逃す可能性が高いため、.gitignore
を次のように修正する必要があります。
.gitignore
+ /dist
ncc
による処理は不要なため、コマンド及びパッケージを削除し 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"
}
または、私が作成したテンプレートを使用してください。
不要なファイルが削除されたGitHub Actions
の例は以下で確認できます。
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 (例:
v1.2.3
) - テストタグ (例:
test/v1.2.3
)
- semantic versioning tag (例:
GitHub Actions
をリリースするには、すべてのビルドファイルと node_modules
のような依存関係が必要ですが、通常はそれらをコミットしません。
したがってGitHub Actions
リリースする際には以下のような手順が必要です。
- ローカルの開発用ブランチで開発
- リリース用にビルド
node_modules
のような依存モジュールを含めて必要なソースをリリース用ブランチにコミット- タグを付与 (メジャー、マイナー、パッチバージョンの考慮が必要)
- GitHub にプッシュ
- リリースを作成
リリースの度にこれらの手順を実行するのはとても面倒です。
この GitHub Actions
を使用することで手順は単純になります。
- ローカルの開発用ブランチで開発
- リリースを作成 (タグを作成)
- 自動化された手順が完了するのを待つ
- リリース用にビルド
node_modules
のような依存モジュールを含めて必要なソースをリリース用ブランチにコミット- タグを付与 (メジャー、マイナー、パッチバージョンの考慮が必要)
- GitHub にプッシュ
タグ名は Semantic Versioning に従っている必要があります。
以下のタグが作成されます。
- 指定されたタグ名
- メジャーバージョンのタグ名 (指定されたタグ名から生成)
- 例:
v1
- 例:
- マイナーバージョンのタグ名 (指定されたタグ名から生成)
- 例:
v1.2
- 例:
- パッチバージョンのタグ名 (指定されたタグ名から生成)
- 例:
v1.2.3
- 例: