Skip to content

Latest commit

 

History

History
276 lines (232 loc) · 13.7 KB

README.ja.md

File metadata and controls

276 lines (232 loc) · 13.7 KB

Release GitHub Actions

CI Status codecov CodeFactor License: MIT

Read this in other languages: English, 日本語.

これは GitHub Actions のリリースを自動化するための GitHub Actions です。
タグを作成するとこのアクションは自動で以下を行います。

  1. ビルド実行
  2. リリース用ブランチ作成
  3. リリース用ブランチにタグを張り替え
  4. 同じタグ名 かつ 公開済みのリリースが存在する場合、再度公開 (タグを張り替えた場合、リリースが下書き状態になるため)

Table of Contents

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

対象イベントの詳細

CLI ツール

technote-space/release-github-actions-cli - GitHub

スクリーンショット

Release

オプション

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.lockpackage-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}}

Execute commands

ビルド

  • preparebuildproductionprodpackage または pack が package.json の scripts に含まれる場合、ビルド用のコマンドとしてそれらを使用します。(BUILD_COMMAND_TARGET で変更可能です)
  • npm run installyarn install のようなインストール用コマンドが存在しない場合、インストール用コマンドが追加されます。

したがって、BUILD_COMMAND が設定されていない かつ package.json に build が存在する場合、以下のコマンドが実行されます。

yarn install
yarn build
yarn install --production

buildpack が含まれる場合は、以下のコマンドになります。

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

ただし上記テンプレートにはセキュリティ上の問題などがあるため、以下の対応が必要です。

JavaScriptのActionテンプレート

プルリクエストにビルドしたファイルが含まれる場合、悪意のあるコードが埋め込まれていてもレビューで見逃す可能性が高いため、.gitignore を次のように修正する必要があります。

.gitignore

+ /dist

TypeScriptのActionテンプレート

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"
   }

または、私が作成したテンプレートを使用してください。

technote-space/gh-actions-template - GitHub

不要なファイルが削除されたGitHub Actionsの例は以下で確認できます。
https://github.com/technote-space/release-github-actions/tree/gh-actions

Action イベント詳細

対象イベント

eventName: action condition
push: * condition
release: published condition
create: * condition

condition

  • tags
    • semantic versioning tag (例:v1.2.3)
    • テストタグ (例:test/v1.2.3)

動機

GitHub Actionsをリリースするには、すべてのビルドファイルと node_modules のような依存関係が必要ですが、通常はそれらをコミットしません。
したがってGitHub Actionsリリースする際には以下のような手順が必要です。

  1. ローカルの開発用ブランチで開発
  2. リリース用にビルド
  3. node_modules のような依存モジュールを含めて必要なソースをリリース用ブランチにコミット
  4. タグを付与 (メジャー、マイナー、パッチバージョンの考慮が必要)
  5. GitHub にプッシュ
  6. リリースを作成

リリースの度にこれらの手順を実行するのはとても面倒です。

この GitHub Actions を使用することで手順は単純になります。

  1. ローカルの開発用ブランチで開発
  2. リリースを作成 (タグを作成)
  3. 自動化された手順が完了するのを待つ
    1. リリース用にビルド
    2. node_modules のような依存モジュールを含めて必要なソースをリリース用ブランチにコミット
    3. タグを付与 (メジャー、マイナー、パッチバージョンの考慮が必要)
    4. GitHub にプッシュ

補足

Tags

タグ名は Semantic Versioning に従っている必要があります。
以下のタグが作成されます。

  • 指定されたタグ名
  • メジャーバージョンのタグ名 (指定されたタグ名から生成)
    • 例:v1
  • マイナーバージョンのタグ名 (指定されたタグ名から生成)
    • 例:v1.2
  • パッチバージョンのタグ名 (指定されたタグ名から生成)
    • 例:v1.2.3

このアクションを使用しているアクションの例

Author

GitHub (Technote)
Blog