{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/lets-start-lerna-changelog-to-easy-publish/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"4ab74285-d664-5e27-8e10-464bd455c1a7","excerpt":"hothouseというpackage.jsonとlockfileを更新してPR出すツールを公開するときに、 「リリースノート頑張りたくないな」と思い、なるべく楽にそれなりのリリースノートを残せる方法を探った結果、 lerna-changelogというLerna…","html":"<p><a href=\"https://github.com/Leko/hothouse\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">hothouse</a>というpackage.jsonとlockfileを更新してPR出すツールを公開するときに、<br>\n「リリースノート頑張りたくないな」と思い、なるべく楽にそれなりのリリースノートを残せる方法を探った結果、<br>\n<a href=\"https://github.com/lerna/lerna-changelog\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">lerna-changelog</a>というLerna公式のツールが良さそうだったので、採用しました。</p>\n<p>hothouseではlerna-changelogで自動生成されたリリースノートを公開してます。<br>\n<a href=\"https://github.com/Leko/hothouse/releases\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://github.com/Leko/hothouse/releases</a><br>\n規模が大きくなったり、需要が高まったらしっかり書こうと思いながら、<br>\n<strong>何も書かないのは嫌だし、とは言えまだこの規模でリリース作業に苦労をしたくない</strong>。<br>\nそんな温度感にちょうどマッチしてくれるツールです。</p>\n<p>あまり使ってるリポジトリを見かけないので、紹介してみようと思います。</p>\n<!--more-->\n<h2 id=\"lerna-changelogとは\" style=\"position:relative;\"><a href=\"#lerna-changelog%E3%81%A8%E3%81%AF\" aria-label=\"lerna changelogとは permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>lerna-changelogとは</h2>\n<blockquote>\n<p>— <a href=\"https://github.com/lerna/lerna-changelog\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">lerna/lerna-changelog: PR-based changelog generator with monorepo support</a></p>\n</blockquote>\n<p>リポジトリのdescriptionからも分かる通り、GitHubのpull requestをベースにリリースノートを作成するツールです。<br>\n「PRベース」が他のツールと異なる点は、コミットメッセージやPRに命名規約を設けないことです。<br>\nPRにつけたラベルごとにグルーピングし、PR１つ≒リリースノートの１行としてリリースノートを生成します。</p>\n<p>GitHubのトークンさえ渡せば、最後に打ったタグからHEADまでに含まれるPRを自動で収集・リリースノート化してくれる点も非常にありがたいです。<br>\n使い方の流れとしては、</p>\n<ol>\n<li>PR出す（誰かから出される）</li>\n<li>PRに分類用のラベルを何か１つ以上つける</li>\n<li>マージする</li>\n<li>lerna-changelogを実行し、リリースノートを生成</li>\n</ol>\n<p>のようになります。<br>\n追加で必要なオペレーションはラベルつけるだけで、かつ私はラベルをつける癖がついているので、特に手間だと思っていません。<br>\nほとんど追加の手間なしに、リリースノートを生成できています。</p>\n<h2 id=\"セットアップ\" style=\"position:relative;\"><a href=\"#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97\" aria-label=\"セットアップ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>セットアップ</h2>\n<p>lerna-changelogを使うためのセットアップはざっくり2つあります。</p>\n<ol>\n<li>PR収集用のトークン生成（<a href=\"https://github.com/lerna/lerna-changelog#github-token\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ガイド</a>）</li>\n<li>PR分類用のラベルのマッピングを定義（<a href=\"https://github.com/lerna/lerna-changelog#configuration\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">ガイド</a>）</li>\n</ol>\n<p>ラベルのマッピングを設定し忘れていると、<strong>PRはあるはずなのにリリースノートが空</strong>という現象が発生します。リポジトリに合わせてしっかり設定しましょう。<br>\nhothouseではラベルのマッピングをこのように指定しています。</p>\n<p>\n<div class=\"gprgh-container\">\n  <div class=\"gprgh-filename-container\">\n    <a class=\"gprgh-filename\" href=\"https://github.com/Leko/hothouse/blob/3f7f51a7045be8d47c8ef1764094a99929715e77/package.json#L32-L40\">hothouse/package.json</a>\n  </div>\n  <span class=\"gprgh-meta\">\n    Lines 32 to 40 in <a class=\"gprgh-meta-sha\" href=\"https://github.com/Leko/hothouse/commit/3f7f51a7045be8d47c8ef1764094a99929715e77\">3f7f51a</a>\n  </span>\n</div>\n\n<div class=\"gatsby-highlight\" data-language=\"json\"><pre style=\"counter-reset: linenumber 31\" class=\"language-json line-numbers\"><code class=\"language-json\">  <span class=\"token property\">\"changelog\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token property\">\"labels\"</span><span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token property\">\"Type: Breaking Change\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Breaking Change\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Type: Feature\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Feature\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Type: Bug\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Bug\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Type: Maintenance\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Maintenance\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Type: Documentation\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Documentation\"</span><span class=\"token punctuation\">,</span>\n      <span class=\"token property\">\"Type: Refactoring\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"Refactoring\"</span>\n    <span class=\"token punctuation\">}</span></code><span aria-hidden=\"true\" class=\"line-numbers-rows\" style=\"white-space: normal; width: auto; left: 0;\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></pre></div></p>\n<p>なおラベルはデフォルトではなく、azuさんのこのツールを使用させてもらいました。</p>\n<blockquote>\n<p>— <a href=\"https://efcl.info/2017/05/17/github-label/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GitHubのラベルをいい感じにセットアップするツール | Web Scratch</a></p>\n</blockquote>\n<h2 id=\"ベンチマークとの対比\" style=\"position:relative;\"><a href=\"#%E3%83%99%E3%83%B3%E3%83%81%E3%83%9E%E3%83%BC%E3%82%AF%E3%81%A8%E3%81%AE%E5%AF%BE%E6%AF%94\" aria-label=\"ベンチマークとの対比 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ベンチマークとの対比</h2>\n<p>リリース系で個人的に代表的だと思っているのは、<a href=\"https://github.com/semantic-release/semantic-release\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">semantic-release</a>と<a href=\"https://github.com/conventional-changelog/conventional-changelog\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">conventional-changelog</a>あたりかなと思っています。<br>\nconventional-changelog形式でコミットしておくと、lerna publish時に<code>--conventional-commits</code>というオプションが使えるので、monorepoでの黄金パターンの１つなんだろうと思っています。</p>\n<p>コミットメッセージを縛るタイプはとても良く見るのですが、<br>\n長年使ってる<a href=\"https://gitmoji.carloscuesta.me/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gitmoji</a>がつい手癖で出てcommit —amendするの面倒なのと、<br>\n<strong>コミットメッセージの分類適切じゃない問題</strong>が絶対的にあると思っており。分類は基本的に人力かつルールベースなので確実じゃないor間違うので、あまり信頼できないなと思っています。<br>\n例えば<code>chore</code>って書かれてるのにbreaking changesだったりすることがあるので。</p>\n<p>一方lerna-changelogはPRにタグをつけるだけなので、コミットのたびに分類に頭を使う必要がなく、精神衛生がとても良いです。<br>\nただしPRの粒度を小さくしないと分類が難しいのはどちらも変わりませんし、分類が簡単になるわけでもありません。<br>\nただ、ラベルは後から簡単に付け消しできるので、マージした後には弄りにくいコミットメッセージよりは、ミスに優しいと思います。</p>\n<p>**そもそも、「これ見やすいか？」**と言われると、好みが分かれそうな気もします。<br>\nさらに私のPRのタイトルの書き方が下手なので、何が起こったかギリギリわかるかな、ぐらいだと思います。<br>\n中身は仕組みの問題ではなく、私の問題なので、書式としてはいい感じなんじゃないだろうか、と思っています。</p>\n<h2 id=\"より使いやすくする一手間\" style=\"position:relative;\"><a href=\"#%E3%82%88%E3%82%8A%E4%BD%BF%E3%81%84%E3%82%84%E3%81%99%E3%81%8F%E3%81%99%E3%82%8B%E4%B8%80%E6%89%8B%E9%96%93\" aria-label=\"より使いやすくする一手間 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>より使いやすくする一手間</h2>\n<p>hothouseでは、</p>\n<ul>\n<li>npmへのpublish</li>\n<li>Gitのタグ打ち</li>\n<li>GitHubへのタグpush</li>\n<li>リリースノートの生成</li>\n<li>GitHubのリリースの作成</li>\n</ul>\n<p>を全て一撃で倒すべく、こんなシェルを組んでます。\nほとんどの処理は<code>lerna publish</code>と<code>lerna-changelog</code>で自動化されており、それらをつなぎ合わせるちょっとした手間をシェルで埋めて使っています。</p>\n<p><a href=\"https://github.com/Leko/hothouse/blob/3f7f51a7045be8d47c8ef1764094a99929715e77/scripts/release\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">https://github.com/Leko/hothouse/blob/3f7f51a7045be8d47c8ef1764094a99929715e77/scripts/release</a></p>\n<p>リリース作業のハードルが下がると、リリースの頻度が上がり、結果的に早くバグ修正や機能追加が届けられるので、効果あると思います。<br>\n楽だし気に入っているので、問題が出るまではこのままのやり方で進めてみようと思います。</p>","timeToRead":6,"frontmatter":{"title":"lerna-changelogで始める頑張りすぎないリリースノート自動生成","tags":["npm","JavaScript","monorepo","Lerna"],"date":"July 17, 2018","featuredImage":null}}},"pageContext":{"slug":"/lets-start-lerna-changelog-to-easy-publish/","previous":{"fields":{"slug":"/what-about-hothouse/"},"frontmatter":{"title":"package.jsonを更新してPRを作成できるCLIツールhothouseを作った","tags":["npm","JavaScript"]}},"next":{"fields":{"slug":"/you-might-not-need-dotenv-in-source/"},"frontmatter":{"title":"プログラム内でdotenvを読み込むのをやめた話","tags":["Node.js","JavaScript"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}