<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1887782251735454807</id><updated>2026-10-15T09:20:01.102+09:00</updated><category term="cpp"/><category term="CI"/><category term="testing framework"/><category term="iutest"/><category term="備忘録"/><category term="Jenkins"/><category term="Visual Studio"/><category term="雑記"/><category term="trial"/><category term="GitHub Actions"/><category term="未解決"/><category term="静的解析"/><category term="GitHub"/><category term="Docker"/><category term="Travis CI"/><category term="git"/><category term="python"/><category term="AdventCalendar"/><category term="groovy"/><category term="AppVeyor"/><category term="Windows"/><category term="勉強会"/><category term="CircleCI"/><category term="RPA"/><category term="技術書典"/><category term="Wandbox"/><category term="Dockerhub"/><category term="c"/><category term="gtest"/><category term="Integromat"/><category term="clang"/><category term="Azure Pipelines"/><category term="Re:VIEW"/><category term="SCM"/><category term="Wercker"/><category term="cppcheck"/><category term="サービス連携"/><category term="Codefresh"/><category term="Re:VIEW Starter"/><category term="Shippable"/><category term="arduino"/><category term="執筆"/><category term="gcc"/><category term="本"/><category term="Codeship"/><category term="Semaphore CI"/><category term="Slack"/><category term="Twilio"/><category term="Zapier"/><category term="boost"/><category term="reveal.js"/><category term="自動化"/><category term="Bitrise"/><category term="Markdown"/><category term="autoit"/><category term="guitest"/><category term="ruby"/><category term="shell"/><category term="コードメトリクス"/><category term="形態素解析"/><category term="Blogger"/><category term="CEDEC"/><category term="Coverity"/><category term="Online Compiler"/><category term="Re:VIEW Retrovert"/><category term="Rocro"/><category term="Unity"/><category term="Win32"/><category term="bat"/><category term="c#"/><category term="coverage"/><category term="gh"/><category term="Cirrus CI"/><category term="Drone"/><category term="Google Docs"/><category term="Make formerly Integromat"/><category term="PHP"/><category term="PowerShell"/><category term="TDD"/><category term="chrome"/><category term="cygwin"/><category term="docker-compose"/><category term="gae"/><category term="macOS"/><category term="可視化"/><category term="AI"/><category term="Airtest"/><category term="Buddy"/><category term="CircleCIJP"/><category term="Codacy"/><category term="EditorConfig"/><category term="GitLab CI"/><category term="Glosbe"/><category term="JFrog Pipelines"/><category term="NaCl"/><category term="OSDN"/><category term="Scrutinizer"/><category term="SideCI"/><category term="VSCode"/><category term="Visual Studio Code"/><category term="Zenn"/><category term="ansible"/><category term="bug"/><category term="bugspots"/><category term="cmd"/><category term="doxygen"/><category term="iPaaS"/><category term="エイプリルフール"/><category term="カンバン"/><category term="AdSense"/><category term="Android"/><category term="Apple"/><category term="CEDEC2019"/><category term="CEDEC2021"/><category term="CEDEC2022"/><category term="CMake"/><category term="CUE"/><category term="Cafe"/><category term="CentOS"/><category term="CodeReview"/><category term="Dagger"/><category term="Google Home"/><category term="IFTTT"/><category term="JFrog"/><category term="Jinja2"/><category term="MSBuild"/><category term="Microsoft MVP"/><category term="OSS"/><category term="OpenSTF"/><category term="Peakflow"/><category term="Razorops"/><category term="SRE"/><category term="Sider"/><category term="SourceTree"/><category term="TeamCity"/><category term="Ubuntu"/><category term="VirtualBox"/><category term="Vita"/><category term="WPA"/><category term="Wekan"/><category term="Whiteboard"/><category term="cuelang"/><category term="drawing"/><category term="gem"/><category term="golang"/><category term="jquery"/><category term="reviewdog"/><category term="ruboty"/><category term="zapcc"/><category term="キャリアパス"/><category term="ゲーム開発者のためのSRE"/><category term="コーディング規約"/><category term="スマートスピーカー"/><category term="タスク管理"/><title type='text'>ブログズミ</title><subtitle type='html'>プログラムの話を中心にゆるーく投稿</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>606</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-564814538301110507</id><published>2026-10-15T09:20:01.102+09:00</published><updated>2026-10-15T09:20:01.102+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gh"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>GitHub Actions Self-hosted runner で Jenkins のオフラインノードを表現する</title><content type='html'>&lt;p&gt;GitHub Actions で常駐型の self-hosted runner を運用していると困ることがあります。&lt;br /&gt;その1つがランナーのオフラインが気軽にできないというところです。&lt;br /&gt;Jenkins であればオフラインノードとすることで、新しいジョブを受け付けなくなり、実行中のジョブの完了を待って、マシンのメンテナンスなどが可能でした。そして、オンラインに戻せばすぐにジョブが実行可能になります。&lt;br /&gt;一方、GitHub Actions は管理画面にランナーの Remove はありますが、オフラインにすることはできません。self-hosted runner マシンでサービス停止すればオフラインになり、サービス再開すれば元に戻ります。しかし、これはそのマシン上での操作が必要であること、そしてジョブの完了を待つような安全なオフライン化ができません。&lt;br /&gt;&lt;br /&gt;ジョブが実行されていない状態を作るために、以前は無限ループするジョブを用意して、それを該当マシンのランナー上で実行し、そのジョブが実行中にメンテナンスをするという方法を取っていました。&lt;br /&gt;この方法であれば、実質的にオフライン状態にできます。&lt;br /&gt;&lt;br /&gt;しかし、この方法にも問題があります。それはこのジョブが実行されるまでに、先にキューイングされているジョブの完了を待つ必要があるというところです。&lt;br /&gt;GitHub Actions でのジョブが実行される順序は決まっているわけではないですが、先に条件を満たしたジョブからランナーの割り当てが基本的にされていると思います。&lt;br /&gt;そうすると、オフライン状態にしたいと思っても、すぐにはならないですし、いつオフライン状態になるのかもわからないので、メンテナーとしては面倒くさいわけです。&lt;br /&gt;（通知入れてもいいですが、本質はそこではない）&lt;br /&gt;理想は、すぐにオフライン状態になり、今実行中のものだけ実行完了を待ちたいです。&lt;/p&gt;&lt;p&gt;そこで作ったのが &lt;b&gt;gh runner-kit cordon&lt;/b&gt; コマンドです。&lt;br /&gt;&lt;a href=&quot;https://github.com/srz-zumix/gh-runner-kit&quot;&gt;https://github.com/srz-zumix/gh-runner-kit&lt;/a&gt;&lt;br /&gt;このコマンドがその理想的なオフライン状態を作ってくれます。&lt;br /&gt;もとに戻すときは uncordon コマンドを使ってください。&lt;br /&gt;ランナーは --id か --name で指定します。--label でラベル指定も可能で、これはそのラベルにマッチするランナーすべてをオフラインしてくれるので、便利です。&lt;/p&gt;&lt;p&gt;気になる仕組みですが、至って単純です。&lt;br /&gt;GitHub Actions にランナーグループというものがあります。&lt;br /&gt;このランナーグループではそのグループに所属するランナーが、どのリポジトリで利用可能なのか設定することが可能です。通常は All repository にしていることが多いでしょう。もしくは、特定のリポジトリのみに許可、除外するという使い方をしているところもあるかもしれません。&lt;br /&gt;おわかりですね。どのリポジトリも許可しない、利用不可能なランナーグループを別途作成し、そのランナーグループにオフラインにしたいランナーを移動させることで、理想的なオフライン状態を作っています。&lt;br /&gt;実は、グループの作成・移動は GitHub の管理ページからもできるので CLI でなくてもできます。なので、ぱっと試したい方はそちらでやってみてもよいかと思います。&lt;br /&gt;CLI ではそれらの操作をまとめてやってくれるのと、もともとのグループを覚えているので元に戻すという操作を確実に実施してくれます。&lt;br /&gt;&lt;br /&gt;以上です。このツールで GitHub Actions の self-hosted runner を運用されている方が少しでも楽になれば幸いです。&lt;br /&gt;では。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/564814538301110507/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2026/10/github-actions-self-hosted-runner.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/564814538301110507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/564814538301110507'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2026/10/github-actions-self-hosted-runner.html' title='GitHub Actions Self-hosted runner で Jenkins のオフラインノードを表現する'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-175450640613836583</id><published>2026-09-28T09:36:01.948+09:00</published><updated>2026-09-28T09:36:01.948+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="cpp"/><category scheme="http://www.blogger.com/atom/ns#" term="本"/><title type='text'>「C++でつくる ゲーム、対戦AI、CG、オーディオ、電子工作、競プロ、CI/CD、言語仕様」の CI/CD の章を書きました</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;「&lt;a href=&quot;https://link.amazon/B09iK2jrE&quot; target=&quot;_blank&quot;&gt;C++でつくる ゲーム、対戦AI、CG、オーディオ、電子工作、競プロ、CI/CD、言語仕様&lt;/a&gt;」&lt;br /&gt;いよいよ明日 9/29(火) に発売です。私はお先に著者献本をいただきました。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbphUQDXrod2X0c7wa5Znm6OWuq3EkQlP_rC8FSK1Dgow9GDVxkjh4vswmbXFWyjTJw6fF-7HEUT-CzWyARfoK2W0PizRWtj1ZAcUMzzIe-4ssaatZInqXq_7Qu_XGc-ZcL5wSGD80ww5ko0-uDjuwFBubeNWE3l0s7daxmptwu_hl3SyuKjSs-InMKjE/s3448/DSC_1459~2.JPG&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;3448&quot; data-original-width=&quot;2951&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbphUQDXrod2X0c7wa5Znm6OWuq3EkQlP_rC8FSK1Dgow9GDVxkjh4vswmbXFWyjTJw6fF-7HEUT-CzWyARfoK2W0PizRWtj1ZAcUMzzIe-4ssaatZInqXq_7Qu_XGc-ZcL5wSGD80ww5ko0-uDjuwFBubeNWE3l0s7daxmptwu_hl3SyuKjSs-InMKjE/w274-h320/DSC_1459~2.JPG&quot; width=&quot;274&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;さて、私が書いたところというと、お察しの通り CI/CD の章です。&lt;br /&gt;C++でつくる CI/CD ？まさか CI/CD そのものを作っちゃうのか？&lt;br /&gt;と思われた方も多いのではないでしょうか。&lt;br /&gt;&lt;br /&gt;安心？してください。内容としては、これから C++ を始める方に向けて、GitHub Actions で C++ 開発環境を整えていく、何かを作るときのビルドやテスト、通知やデプロイまでなど一通りの流れを説明しております。&lt;div&gt;この章は他の章の補助的な感じになるのかなという気がしています。&lt;br /&gt;いろんなトピックがある本書なので、なにか作ってみようと思ったときに読んで頂けると嬉しいなと思っています。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;自分は最近仕事で C++ を使う機会がすっかりなくなってしまったのですが、以前 C++ を使っていたよーという方も楽しんでいただけると思いますので、是非！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/175450640613836583/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2026/09/c-aicgcicd-cicd.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/175450640613836583'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/175450640613836583'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2026/09/c-aicgcicd-cicd.html' title='「C++でつくる ゲーム、対戦AI、CG、オーディオ、電子工作、競プロ、CI/CD、言語仕様」の CI/CD の章を書きました'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhbphUQDXrod2X0c7wa5Znm6OWuq3EkQlP_rC8FSK1Dgow9GDVxkjh4vswmbXFWyjTJw6fF-7HEUT-CzWyARfoK2W0PizRWtj1ZAcUMzzIe-4ssaatZInqXq_7Qu_XGc-ZcL5wSGD80ww5ko0-uDjuwFBubeNWE3l0s7daxmptwu_hl3SyuKjSs-InMKjE/s72-w274-h320-c/DSC_1459~2.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-1464188676106464191</id><published>2026-09-08T10:31:55.558+09:00</published><updated>2026-09-08T10:32:19.463+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Microsoft MVP"/><title type='text'>Microsoft MVP 初受賞しました</title><content type='html'>&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjejkbsz9tR2azh8WuDwPEXbapQFGSG30BDaNPi475uOdYG2kDfM4l9imz4Tml-4B11jYoZbxEnkzXarf9qNHUDv1K6Y0xow41UD71uZWTQSNcsy5JS6SusWUEGkEAB4OdCm-_5KaXILFSYq1DQSlj0IbGB4OyUK9rnpdJSlP83KAnojj9JsbACHsGVoXA/s3000/MVP_Digital_RGB_31_badge_full_color_blue.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1125&quot; data-original-width=&quot;3000&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjejkbsz9tR2azh8WuDwPEXbapQFGSG30BDaNPi475uOdYG2kDfM4l9imz4Tml-4B11jYoZbxEnkzXarf9qNHUDv1K6Y0xow41UD71uZWTQSNcsy5JS6SusWUEGkEAB4OdCm-_5KaXILFSYq1DQSlj0IbGB4OyUK9rnpdJSlP83KAnojj9JsbACHsGVoXA/w640-h240/MVP_Digital_RGB_31_badge_full_color_blue.jpg&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a href=&quot;https://mvp.microsoft.com/ja-JP/mvp/profile/997b9e2c-862e-4c60-b458-3d2876c440b3&quot;&gt;Microsoft MVP&lt;/a&gt;&amp;nbsp;受賞しました！&lt;br /&gt;昔から気になってたんですが、御縁があって推薦していただき、受賞することができました。&lt;br /&gt;&lt;br /&gt;最近は登壇する機会が増えたり、OSS 開発も活発になったり、外向けの活動をすることが多くなったのですが、MVP を継続できるようにさらに頑張りたいと思います！&lt;br /&gt;&lt;p&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/1464188676106464191/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2026/09/microsoft-mvp.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1464188676106464191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1464188676106464191'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2026/09/microsoft-mvp.html' title='Microsoft MVP 初受賞しました'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjejkbsz9tR2azh8WuDwPEXbapQFGSG30BDaNPi475uOdYG2kDfM4l9imz4Tml-4B11jYoZbxEnkzXarf9qNHUDv1K6Y0xow41UD71uZWTQSNcsy5JS6SusWUEGkEAB4OdCm-_5KaXILFSYq1DQSlj0IbGB4OyUK9rnpdJSlP83KAnojj9JsbACHsGVoXA/s72-w640-h240-c/MVP_Digital_RGB_31_badge_full_color_blue.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-1432564572044713198</id><published>2026-08-31T11:10:17.078+09:00</published><updated>2026-08-31T11:10:17.078+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gh"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>【GitHub Actions】シークレットを別のリポジトリに migrate するツールを作った</title><content type='html'>&lt;p&gt;みなさん、GitHub Actions のシークレットの管理ってどうしてますか？&lt;br /&gt;設定された内容をどこか別の管理場所で保存している場合もあると思いますが、設定するだけで何もしてない場合も多いのではないでしょうか。&lt;br /&gt;&lt;br /&gt;登録されたシークレットの中身は基本的に閲覧することはできません。シークレットの操作は gh secret コマンドから行なうことも可能ですが、当然これらも delete / list / set サブコマンドしかなく、get はできません。&lt;br /&gt;GitHub Actions に詳しい人なら、中身を確認する方法はわかるのではないかと思いますが、面倒ではあります。&lt;/p&gt;&lt;p&gt;ただ、シークレットの中身を閲覧できなくても、困ることはほとんどないでしょう。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/srz-zumix/gh-secret-kit&quot; target=&quot;_blank&quot;&gt;https://github.com/srz-zumix/gh-secret-kit&lt;/a&gt;&lt;br /&gt;今回「シークレットを別のリポジトリに migrate するツール」の紹介をするわけですが、なぜこれが必要になったのか、から説明します。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;なぜこれが必要か&lt;/h5&gt;
&lt;p&gt;&lt;/p&gt;&lt;p&gt;きっかけはとあるリポジトリのホスト移動が必要になったことです。&lt;br /&gt;このようなケースは GitHub の公式ツールでサポートされており、 &lt;a href=&quot;https://github.com/github/gh-gei&quot; target=&quot;_blank&quot;&gt;gh-gei&lt;/a&gt; を使うことで migrate することができます。&lt;br /&gt;&lt;a href=&quot;https://docs.github.com/en/migrations/using-github-enterprise-importer/migrating-between-github-products/about-migrations-between-github-products&quot; target=&quot;_blank&quot;&gt;About migrations between GitHub products with GitHub Enterprise Importer - GitHub Docs&lt;/a&gt;&lt;/p&gt;&lt;p&gt;しかしながら、サポートされている移行対象のデータは限定的です。&lt;br /&gt;プルリクエストなどは移行できますが、Rulesets や Teams など結構よく使う機能も移行対象外になっています。&lt;br /&gt;当然、シークレットも移行できません。&lt;br /&gt;&lt;br /&gt;Rulesets や Teams などは設定を閲覧することができますし、API で取得・設定することも可能なため、それらを移行するのは（手動でも自動でも）難しくはないでしょう。AI に依頼すれば直接やったり、スクリプトを書いたりしてくれる気がします。&lt;br /&gt;しかし、シークレットは簡単には閲覧することができず、リポジトリや Organization に設定されたシークレットを1つ1つ手動で再設定するのは、とても面倒です。&lt;br /&gt;Organization の移動が大量にある場合は考えたくないですね。&lt;/p&gt;&lt;p&gt;でも、シークレットの中身を知る方法がないわけではありません。GitHub Actions のジョブの中では中身を使っているわけですから。&lt;br /&gt;シークレットの移行が自動でできる可能性は 0 ではない。ということで作成をしました。&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;使い方&lt;/h5&gt;
&lt;p&gt;使い方は&lt;a href=&quot;https://github.com/srz-zumix/gh-secret-kit/blob/main/docs/migrate.ja.md&quot; target=&quot;_blank&quot;&gt;ドキュメント&lt;/a&gt;にまとめてあるので、そちらを参照してください。&lt;br /&gt;また、Skills も用意してあります。&lt;br /&gt;gh-secret-kit をインストールしたのち、gh secret-kit skills install することでインストールできます。&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;仕組み&lt;/h5&gt;
&lt;div&gt;さて、仕組みですが基本は単純です。&lt;br /&gt;移行元で実行されたジョブの中から移行先にシークレットを設定します。&lt;/div&gt;&lt;div&gt;ジョブからはシークレットの内容を知ることができるわけですから、これは実現可能ですよね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;しかし、対象のシークレットはワークフローに静的に記載されている必要があります。&lt;br /&gt;なので、シークレットをリストアップしてワークフローを生成し、その生成したワークフローを push してそれを実行します。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ワークフローを実行する方法はいくつかありますが、デフォルトブランチにワークフローが必要なものと、トピックブランチにあれば良いものので大きく分けられます。&lt;br /&gt;今回 GitHub のリポジトリ移行という目的があるので、デフォルトブランチを書き換えるのは避けたいです。CLI からワークフローを実行するのであれば workflow_dispatch が都合が良いのですが、これはデフォルトブランチにワークフローが必要なため、今回は pull_request イベントの labeled アクティビティで発火させるようにしています。&lt;br /&gt;なぜ labeled なのかというと、任意のタイミングでコミットに紐づかずに再実行可能にしたかったからです。&lt;br /&gt;（ちなみに、デフォルトブランチを変更することなく、workflow_dispatch を実行する方法はあるのですが、実装当時に知らなかったのでこのやり方になっています）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これで CLI からシークレット移行ワークフローを実行させることができるようになります。&lt;br /&gt;&lt;br /&gt;ここで問題になるのがアクセス権限です。&lt;br /&gt;移行元のアクセス権限は問題ないと思いますが、移行元に「移行先のシークレット設定が可能なシークレット」が存在しているとは考えにくいです。&lt;br /&gt;このために設定するという手段もあると思います。gh-secret-kit では、どのシークレットを使うか指定できるようになっているので、そのケースにも対応はしています。&lt;br /&gt;しかし、そのシークレットも移行対象となり移行先で消す必要が出てきます。（まぁ、そのための除外オプションもあるのですが）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;そうではなく、移行担当者は移行元・移行先どちらの admin 権限を持っているはずなので、担当者の環境でジョブを実行し、担当者の gh auth token を使えば、移行に必要な権限を確実に得ることができるわけです。&lt;br /&gt;&lt;br /&gt;GitHub Actions は Self-hoted runner として、好きな環境でランナーを起動することが可能です。ScaleSet API を使って CLI 実行者のローカルマシンでランナーを立ち上げ、専用のランナーラベルを指定してワークフローを実行します。&lt;br /&gt;これにより、既存のランナーを使うことなく移行が可能になるため、開発に影響を与えずに移行が可能になりました。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;h5 class=&quot;subhead&quot;&gt;さいごに&lt;/h5&gt;
&lt;div&gt;gh-secret-kit は Organization / Repository / Environments のシークレットを移行することが可能ですが、Agents / Codespaces / Dependabot のシークレットには対応していません。&lt;br /&gt;Agents と Codespaces は対応できなくもないかも？しれないですが、Dependabot は無理なような気がしています。もしアイディアあれば教えてください。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;あと、このブログを書いてて実はもっと簡単な手順で対応も可能な気がしてきたので、試してみようかなと思います。&lt;br /&gt;&lt;br /&gt;これを使う機会はそうそうない気がしますが、誰かの役に立てば幸いです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/1432564572044713198/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2026/08/github-actions-migrate.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1432564572044713198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1432564572044713198'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2026/08/github-actions-migrate.html' title='【GitHub Actions】シークレットを別のリポジトリに migrate するツールを作った'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-6046850778415792274</id><published>2026-06-09T09:39:43.167+09:00</published><updated>2026-06-09T09:40:24.207+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>ディレクトリごとに Git config/credential を切り替える方法</title><content type='html'>Git の設定をディレクトリごとに切り替えたいことってありますよね？&lt;br /&gt;user の切り替えは git config の IncludeIf を使えば簡単にできます。&lt;br /&gt;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;[includeIf &quot;gitdir:~/mydir/&quot;]
    path = ~/.gitconfig_me
&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;.gitconfig_me の中身はこんな感じです&lt;br /&gt;&lt;br /&gt;
  
&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;[user]
	name = srz_zumix
	email = メアド
&lt;/pre&gt;
&lt;/div&gt;   
    
    &lt;br /&gt;&lt;/div&gt;&lt;div&gt;ただ、これだけだと認証情報が切り替わってくれないです。&lt;br /&gt;既知の事例だと以下のような例が見つかります。&lt;/div&gt;&lt;div&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;IncludeIf で credential helper を切り替えてそれぞれヘルパーを呼び出す&lt;/li&gt;&lt;li&gt;~/.ssh/config にホストエイリアスを作成して使い分ける&lt;/li&gt;&lt;li&gt;direnv などで環境変数を切り替えて対応する&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;使いやすい方法で良いと思いますが、今回は user 設定に追従して欲しいと思ったので専用の gh extension を作成しました。&lt;br /&gt;&lt;a href=&quot;https://github.com/srz-zumix/gh-git-user-credential&quot;&gt;https://github.com/srz-zumix/gh-git-user-credential&lt;/a&gt;&lt;br /&gt;仕組みとしては git config user.name を取得して、その名前指定で gh auth token を取得し、GH_TOKEN や GH_ENTERPRISE_TOKEN に export して gh auth git-credential を呼び出しています。&lt;br /&gt;credential helper をこの拡張に変更すれば user に応じて credential が切り替わるようになります。セットアップ方法は README を確認してください。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに、現在は Git&amp;nbsp;v2.36.0 で&amp;nbsp;&lt;a href=&quot;https://git-scm.com/docs/git-config#Documentation/git-config.txt-hasconfigremoteurl&quot;&gt;hasconfig:remote.*.url&lt;/a&gt;&amp;nbsp;のように hasconfig で git config の値に応じて設定を切り替えできるようになりました。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;
      
&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;[includeIf &quot;hasconfig:remote.*.url:https://github.com/srz-zumix/**&quot;]
  path = ~/.gitconfig_me
&lt;/pre&gt;
&lt;/div&gt;   

&lt;div&gt;この方法を使えばディレクトリごとに切り替えではなく、GitHub の Organization （組織）ごとに切り替えもできますね。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;以上です。では&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/6046850778415792274/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2026/06/git-configcredential.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/6046850778415792274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/6046850778415792274'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2026/06/git-configcredential.html' title='ディレクトリごとに Git config/credential を切り替える方法'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-7998233148153901739</id><published>2026-01-17T19:23:00.001+09:00</published><updated>2026-01-17T19:23:29.469+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Re:VIEW"/><category scheme="http://www.blogger.com/atom/ns#" term="Re:VIEW Retrovert"/><title type='text'>review-retrovert を更新しました</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://github.com/srz-zumix/review-retrovert&quot; target=&quot;_blank&quot;&gt;https://github.com/srz-zumix/review-retrovert&lt;/a&gt;&lt;br /&gt;review-retrovert は Re:VIEW Starter で作られたプロジェクトを Re:VIEW のプロジェクトに変換するツールです。&lt;br /&gt;昔、執筆したときに作って使ったものなんですが、コメントいただきまして不具合修正しました。コメントありがとうございました！！&lt;br /&gt;&lt;a href=&quot;https://srz-zumix.blogspot.com/2020/09/review-starterreview-starter-review.html?showComment=1766322318872#c9139258129104742884&quot; target=&quot;_blank&quot;&gt;https://srz-zumix.blogspot.com/2020/09/review-starterreview-starter-review.html?showComment=1766322318872#c9139258129104742884&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;変更点としては Ruby 3.1 以降への対応が主です。&lt;br /&gt;また、過去の Re:VIEW で使えるように各バージョンごとに docker image も用意するようにしました。&lt;br /&gt;&lt;a href=&quot;https://hub.docker.com/repository/docker/srzzumix/review-retrovert/tags&quot; target=&quot;_blank&quot;&gt;https://hub.docker.com/repository/docker/srzzumix/review-retrovert/tags&lt;/a&gt;&lt;/p&gt;&lt;p&gt;最近、技術書典には参加してませんが、また機会があればやってみたいですね。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/7998233148153901739/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2026/01/review-retrovert.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/7998233148153901739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/7998233148153901739'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2026/01/review-retrovert.html' title='review-retrovert を更新しました'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-5941695865476283987</id><published>2025-12-31T23:56:00.006+09:00</published><updated>2025-12-31T23:57:32.017+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="gh"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><title type='text'>gh-activity-report と NotebookLM で2025年の活動をふりかえる</title><content type='html'>&lt;p&gt;さて、2025年もあとわずかですね。&lt;br /&gt;今年の GitHub での活動を &lt;a href=&quot;https://github.com/srz-zumix/gh-activity-report&quot; target=&quot;_blank&quot;&gt;gh-activity-report&lt;/a&gt; と NotebookLM でふりかえります。&lt;br /&gt;この組み合わせでのふりかえりは過去にもブログ投稿をしてますので、詳細はそちらへ&lt;br /&gt;「&lt;a href=&quot;https://srz-zumix.blogspot.com/2025/06/github-search-notebooklm.html&quot; target=&quot;_blank&quot;&gt;GitHub Search と NotebookLM で自分の活動を振り返る&lt;/a&gt;」&lt;/p&gt;&lt;p&gt;今回は年間のふりかえりなので gh-activity-report と NotebookLM の使い方も若干やり方もアップデートされました。&lt;br /&gt;まず、拡張機能には楽に期間が指定できるように --year オプションと --fy オプションを追加しています。&lt;br /&gt;次に NotebookLM の「レポートを作成」から「ブログ投稿」を今回使ってみました。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfkWanKywJv_80msYH8zAAhxm_8gSBEEGA1AgGNTdH0DAoLx6RyfN-R2KYgq-UlMZLCb36AF94K15t0XdElnsQ21M73IEQ2M39oQpnLJDRvylc6-xrA30GJhPNe5AAlM6uz9MoqwBa4TDxnxNSdn2gsZMJs4xIdRwb8sDtJkyQRj6ROr1WNsorsSNINVY/s1790/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2022.46.56.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1054&quot; data-original-width=&quot;1790&quot; height=&quot;376&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfkWanKywJv_80msYH8zAAhxm_8gSBEEGA1AgGNTdH0DAoLx6RyfN-R2KYgq-UlMZLCb36AF94K15t0XdElnsQ21M73IEQ2M39oQpnLJDRvylc6-xrA30GJhPNe5AAlM6uz9MoqwBa4TDxnxNSdn2gsZMJs4xIdRwb8sDtJkyQRj6ROr1WNsorsSNINVY/w640-h376/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2022.46.56.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;出来上がったブログレポートは末尾にコピペしました。（ちょっと長いです）&lt;br /&gt;ちょっと、いや、かなり盛りすぎかなと思いますが、ウソではないかなと思うのでそのまま掲載してます。&lt;br /&gt;まぁ実際に自分のブログにはそのまま使えないですが、観点を得る目的だったらアリかも？と思いました。最近はブログでアウトプットをせず、GitHub で欲しいものを開発してるって感じなので、１リポジトリだけをソースにしてブログ書かせてみるのは、ブログ書くきっかけを作れるかも。&lt;br /&gt;&lt;br /&gt;「ブログ投稿」はさておき、自分なりにもふりかえってみます。&lt;br /&gt;NotebookLM の要約の最後のまとめだとこんな感じでした。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUI8KSk1E14nhnrO9YCdmxSSCScNJa41pdYVPKwf7FYuLPfiiw5f7lxAyYaQCnizcqbZ2CS7QW50FjEK3Mx304XwiXcjHlSDf6yvCekMLhdE_uwIrQaiLsQSX576hU5tbWk0BQoC4fAZMBp-jJ861rGzbmw6jJsxrW6oxX8FBA98kfFFXGsUbR0nCRXQ0/s1192/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2023.16.49.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;188&quot; data-original-width=&quot;1192&quot; height=&quot;100&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUI8KSk1E14nhnrO9YCdmxSSCScNJa41pdYVPKwf7FYuLPfiiw5f7lxAyYaQCnizcqbZ2CS7QW50FjEK3Mx304XwiXcjHlSDf6yvCekMLhdE_uwIrQaiLsQSX576hU5tbWk0BQoC4fAZMBp-jJ861rGzbmw6jJsxrW6oxX8FBA98kfFFXGsUbR0nCRXQ0/w640-h100/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2023.16.49.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;まとめとしてはあってるかなと思います。&lt;br /&gt;最近よく使っているプログラミング言語は Go ですね。gh extension を書く場合の定番だからという理由で使い始めたんですが、コーディングエージェントとも相性が良いのかなと最近感じています。エージェントに依頼するとパッケージからドキュメントを読んだり、必要な機能を検索したりして、だいたいのことはやってくれます。自分は C++ で育ってきたのですが、それらだと難しそうだなと感じます。※最近（20以降）の C++ 事情を知らないですが&lt;br /&gt;&lt;br /&gt;GitHub Actions のアクション開発を最近はよくやってたんですが、最近のテーマはローカルでも同じことができることとしています。Jenkins のときもジョブに直接書くな、スクリプトは別ファイルにしろと言われて来ましたが、GitHub Actions でも同じだと強く感じています。&lt;br /&gt;GitHub Actions で GitHub に関することを扱うのであれば、gh extension として機能開発をしてアクションとしてはそれを呼び出すだけという構成が個人的な答えだと思っています。&lt;br /&gt;そのへんの話は秋頃に勉強会でお話させてもらったのでよければ参考にしてください。&lt;br /&gt;「&lt;a href=&quot;https://www.docswell.com/s/DeNA_Tech/5QXJPN-2025-10-24-164631&quot; target=&quot;_blank&quot;&gt;gh-extension と aqua で作る GitHub Actions アクション&lt;/a&gt;」&lt;br /&gt;&lt;br /&gt;開発体験向上としてこのへんに注力しているのは、AI とうまく付き合っていくためとも思っています。&lt;br /&gt;&lt;span class=&quot;pale&quot;&gt;（セキュリティに関しては aqua 任せなんで自分はほとんど何もしてないかな）&lt;/span&gt;&lt;br /&gt;AI Ready という考えを意識してたりします。このへんは来年書けたら書きたい。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;さて、いよいよ時間がなくなってきましたので、ここらへんでおわりたいと思います。&lt;br /&gt;&lt;b&gt;2025年もありがとうございました。2026年もよろしくお願いします！&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;
&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;h1&gt;ある開発者のGitHub年間活動全ログを分析して見えた、生産性を爆発させる5つの習慣&lt;/h1&gt;&lt;h2&gt;1. 導入：生産性の高い開発者の頭の中とは？&lt;/h2&gt;&lt;p&gt;優れた開発者は、一体どのように1年間を過ごしているのでしょうか？その圧倒的なアウトプット、その生産性の源泉は何なのでしょうか？私たちはしばしば完成されたソフトウェアや華々しいリリースに目を奪われがちですが、その裏側にある日々の地道な活動こそが、真の価値を生み出すエンジンなのかもしれません。&lt;/p&gt;&lt;p&gt;本記事では、一人の多作な開発者（&lt;code&gt;srz-zumix&lt;/code&gt;氏）の2025年におけるGitHubアクティビティログを徹底的に分析しました。すると、そこからは驚くほど一貫した、そして誰もが参考にできるであろう5つの「習慣」が浮かび上がってきました。&lt;/p&gt;&lt;p&gt;この分析が、あなたの開発プロセスを見つめ直し、改善するための具体的なヒントになることを願っています。さあ、生産性の高い開発者の頭の中を覗いてみましょう。&lt;/p&gt;&lt;h2&gt;2. 習慣1：徹底的な自動化—特に自分自身のワークフローを狙い撃て&lt;/h2&gt;&lt;p&gt;&lt;code&gt;srz-zumix&lt;/code&gt;氏の活動ログを見て、まず目に飛び込んでくるのは、開発ツールや自動化に関連するリポジトリの多さです。これは単なる趣味のツール作りではありません。日々節約される数分が年間では数週間の生産的な時間に変わることを理解した、意識的な「投資判断」なのです。&lt;/p&gt;&lt;p&gt;彼が解決しようとしているのは、自分自身のワークフローに潜む「痛み」です。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;gh-activity-report&lt;/code&gt;: 四半期や年次のコントリビューション概要をまとめるという、退屈で手作業になりがちなプロセスを自動化します。&lt;/li&gt;&lt;li&gt;&lt;code&gt;labeler-action&lt;/code&gt;: 新規に作成されたプルリクエストを手動で確認し、タグ付けするというトリアージ作業を不要にします。&lt;/li&gt;&lt;li&gt;&lt;code&gt;post-run-action&lt;/code&gt;: GitHub Actionsのジョブ完了後に行うべき後処理やクリーンアップ作業を自動化します。&lt;/li&gt;&lt;li&gt;&lt;code&gt;aqua-installer-cache&lt;/code&gt;: ツールインストーラーのキャッシュを賢く管理し、CI/CDの実行時間を短縮します。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;ここから得られる教訓は明確です。「&lt;b&gt;最も身近な課題、つまり自分自身の非効率な作業を解決するツールを作ることが、結果的に大きな生産性の向上に繋がる&lt;/b&gt;」ということです。他人のための壮大なツールを作る前に、まずは自分の足元にある非効率を解消する。その投資は、複利効果で将来の自分に大きなリターンをもたらすのです。&lt;/p&gt;&lt;h2&gt;3. 習慣2：再利用可能な「キット」を作り、開発を加速させよ&lt;/h2&gt;&lt;p&gt;&lt;code&gt;srz-zumix&lt;/code&gt;氏の活動は、単に個別のツールを場当たり的に作っているわけではありません。そこには明確なアーキテクチャ戦略が見て取れます。その戦略の証拠は、&lt;code&gt;go-gh-extension&lt;/code&gt;というリポジトリを中心としたエコシステムにあります。&lt;/p&gt;&lt;p&gt;このリポジトリは、GitHub CLI拡張機能を作成するための共通ライブラリとして機能しており、他の多くのツールがこの基盤の上に構築されています。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;gh-label-kit&lt;/code&gt;: ラベル管理ツール&lt;/li&gt;&lt;li&gt;&lt;code&gt;gh-team-kit&lt;/code&gt;: チーム管理ツール&lt;/li&gt;&lt;li&gt;&lt;code&gt;gh-rule-kit&lt;/code&gt;: リポジトリのルールセット管理ツール&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;これが単なる主張ではなく、体系的な戦略であることは、ログを見れば明らかです。2025年12月初旬の活動は、その見事な証拠を示しています。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;12月02日&lt;/b&gt;: まず基盤となる&lt;code&gt;go-gh-extension&lt;/code&gt;に「Guardrails」という機能が追加されます（PR #67）。&lt;/li&gt;&lt;li&gt;&lt;b&gt;12月03日&lt;/b&gt;: 翌日、その機能を活用する形で&lt;code&gt;gh-team-kit&lt;/code&gt;に「Guardrail」が実装されます（PR #85）。&lt;/li&gt;&lt;li&gt;&lt;b&gt;12月04日&lt;/b&gt;: さらにその翌日、&lt;code&gt;gh-rule-kit&lt;/code&gt;にも同様の「guardrail」機能が実装されました（PR #17）。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;この一連の流れは、共通基盤に加えた一つの改善が、システム全体に効率的に波及していく様子を完璧に示しています。まず汎用的な土台を作り込み、その上に目的に特化した「キット」を組み立てるアプローチは、一貫性の担保、開発速度の向上、メンテナンス性の劇的な改善という、計り知れない利益をもたらします。「車輪の再発明」を避け、再利用可能なコンポーネントを意識的に作る。この「キット化」の発想は、あらゆるプロジェクトに応用できる強力な武器となるでしょう。&lt;/p&gt;&lt;h2&gt;4. 習慣3：貢献のループを回せ—エコシステムへの還元が自身を成長させる&lt;/h2&gt;&lt;p&gt;&lt;code&gt;srz-zumix&lt;/code&gt;氏の活動は、彼自身のプロジェクトだけに留まりません。ログには、著名なオープンソースプロジェクトへの具体的で価値ある貢献が数多く記録されています。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;rhysd/actionlint&lt;/code&gt;: 無数の開発者が利用するこの静的解析ツールに対し、パーサーでYAMLのアンカーとエイリアスをサポートする機能を追加しました（PR #568）。&lt;/li&gt;&lt;li&gt;&lt;code&gt;DeNA/setup-job-workspace-action&lt;/code&gt;: ワークスペース設定をより柔軟にするため、&lt;code&gt;repository-name&lt;/code&gt;オプションを追加しました（PR #251）。&lt;/li&gt;&lt;li&gt;&lt;code&gt;actions/labeler&lt;/code&gt;: GitHub公式のラベラーに対し、プルリクエストのレスポンスからブランチ名を取得する機能改善を提案しました（PR #873）。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;自分が日々使っているツールを、単なる消費者として利用するだけでなく、改善点を見つけては自らコードを書き、コミュニティに還元していく。しかし、これは単なる利他的な行為ではありません。多くの開発者が利用する外部プロジェクトに貢献することで、自分とは異なる設計思想やコーディングスタイルに触れ、新たな知見を獲得できます。これは、より広い視点を得て自身の技術力を高めるための、極めて効果的な自己投資と言えるでしょう。&lt;/p&gt;&lt;p&gt;&lt;b&gt;ツールを作る→使う→改善して貢献する→新たな知見を得て、また次のツール作りに活かす。&lt;/b&gt;&lt;/p&gt;&lt;p&gt;この貢献のループこそが、開発者を継続的に成長させるのです。&lt;/p&gt;&lt;h2&gt;5. 習慣4：小さな改善を即座に反映させる、高速なイテレーション&lt;/h2&gt;&lt;p&gt;活動ログを時系列で追っていくと、あるリポジトリでの変更が、間髪入れずに別のリポジトリで利用されるという、極めて短いフィードバックループが繰り返し現れます。これは一度きりの偶然ではなく、彼の開発スタイルに組み込まれた意図的なパターンです。&lt;/p&gt;&lt;p&gt;例えば、2025年11月24日の活動を見てみましょう。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;16:04&lt;/b&gt;: &lt;code&gt;gh-label-kit&lt;/code&gt;リポジトリで、バージョンを&lt;code&gt;0.12.0&lt;/code&gt;から&lt;code&gt;0.12.1&lt;/code&gt;に上げるプルリクエスト（#76）がマージされます。&lt;/li&gt;&lt;li&gt;&lt;b&gt;16:13&lt;/b&gt;: そのわずか9分後、&lt;code&gt;labeler-action&lt;/code&gt;リポジトリで、たった今リリースされたばかりの&lt;code&gt;gh-label-kit v0.12.1&lt;/code&gt;を利用するためのプルリクエスト（#30）がマージされています。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;この「作って、すぐに使う（ドッグフーディング）」という高速なイテレーションは、&lt;code&gt;srz-zumix&lt;/code&gt;氏の開発スタイルの核心の一つです。このパターンはログ全体で散見され、例えば&lt;code&gt;gh-label-kit&lt;/code&gt; v0.9.0への更新（PR #58）が即座に&lt;code&gt;labeler-action&lt;/code&gt;で利用される（PR #23）といった例も確認できます。&lt;/p&gt;&lt;p&gt;ライブラリに加えた改善が、実際のアプリケーションでどのように機能するかを即座に検証することで、ツールの品質は急速に向上し、机上の空論ではない、実践的な改善が促されるのです。&lt;/p&gt;&lt;h2&gt;6. 習慣5：継続こそが最強の機能である&lt;/h2&gt;&lt;p&gt;最後に、そして最も重要な習慣は「継続」です。&lt;code&gt;srz-zumix&lt;/code&gt;氏の活動は、年間を通じてほぼ途切れることがありません。その象徴的なコミットが、2025年の大晦日、12月31日に行われています。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;[srz-zumix/gh-activity-report]: 91 - add --year option&lt;/code&gt; (2025-12-31T13:23:22Z)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;年の瀬も押し迫ったこの日に、自身の活動レポートツールに新しいオプションを追加しているのです。この一つの事実が、彼の開発に対する一貫性と情熱を何よりも雄弁に物語っています。&lt;/p&gt;&lt;p&gt;また、活動内容も派手な新機能開発だけではありません。「Bump version」「update packages」「Fix typo」「Update README.md」といったプルリクエストが数多く見られます。これは、バージョンアップ、パッケージ更新、リファクタリング、ドキュメント修正といった地道なメンテナンス作業が、活動の大部分を占めていることを示しています。&lt;/p&gt;&lt;p&gt;イノベーションは、ある日突然のひらめきから生まれるのではなく、日々の地道な積み重ねと、絶え間ない改善活動の中から生まれる。このログは、開発者にとっての普遍的な真理を改めて教えてくれます。&lt;/p&gt;&lt;h2&gt;7. 結論：あなたの次の「自動化」は？&lt;/h2&gt;&lt;p&gt;今回、一人の開発者の年間活動ログから、生産性を飛躍させる5つの習慣を抽出しました。これらは独立した習慣ではなく、相互に連携する一つのシステムとして機能しています。&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;自動化&lt;/b&gt;は日々の手間をなくし、深い思考のための時間を捻出します。&lt;/li&gt;&lt;li&gt;その時間で、開発を加速させる&lt;b&gt;再利用可能&lt;/b&gt;な「キット」を戦略的に構築します。&lt;/li&gt;&lt;li&gt;高速な&lt;b&gt;イテレーション&lt;/b&gt;でキットを実戦投入し、即座に品質を向上させます。&lt;/li&gt;&lt;li&gt;得られた知見をエコシステムへの&lt;b&gt;貢献&lt;/b&gt;に繋げ、自身を成長させるループを回します。&lt;/li&gt;&lt;li&gt;そして、これら全てを支えるのが、日々の地道な&lt;b&gt;継続&lt;/b&gt;という最強のエンジンです。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;これらの習慣は、決して特別な才能を必要とするものではありません。意識とアプローチ次第で、誰でも今日から取り入れることができるはずです。&lt;/p&gt;&lt;p&gt;さて、この開発者の活動ログから、あなたが次に取り組むべき「自分だけの小さな自動化ツール」のアイデアは浮かびましたか？&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;※ 習慣3：たしかに自分の OSS 以外にもコントリビュートしていますが、マージまでやりきってるのはそこまでないかなと思います。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/5941695865476283987/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2025/12/gh-activity-report-notebooklm-2025.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5941695865476283987'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5941695865476283987'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2025/12/gh-activity-report-notebooklm-2025.html' title='gh-activity-report と NotebookLM で2025年の活動をふりかえる'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjfkWanKywJv_80msYH8zAAhxm_8gSBEEGA1AgGNTdH0DAoLx6RyfN-R2KYgq-UlMZLCb36AF94K15t0XdElnsQ21M73IEQ2M39oQpnLJDRvylc6-xrA30GJhPNe5AAlM6uz9MoqwBa4TDxnxNSdn2gsZMJs4xIdRwb8sDtJkyQRj6ROr1WNsorsSNINVY/s72-w640-h376-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2022.46.56.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-397028002095695578</id><published>2025-12-31T20:38:00.001+09:00</published><updated>2025-12-31T20:38:40.137+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="雑記"/><title type='text'>2025年も残りわずか！</title><content type='html'>&lt;p&gt;みなさん。こんばんは。&lt;br /&gt;2025年も残り4時間を切りました。私は今から 2026 年までにふりかえり記事を書き切ることを今年最後の目標としました。この投稿とは別で書きます。&lt;br /&gt;&lt;br /&gt;さて、目標記事の方は個人の GitHub の活動をふりかえる記事にしたいと思いますので、こちらでは簡単にその他どんなことがあったのかふりかえります。&lt;br /&gt;（さっさと目標の方を書くべきですが、他のことも今年のうちに書いておきたいので…）&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h5 class=&quot;subhead&quot;&gt;CEDEC2025運営委員をやりました！&lt;/h5&gt;
&lt;p&gt;まず始めに 2025 年はなんといっても CEDEC ですね。&lt;br /&gt;念願だった運営委員をやりました！&lt;a href=&quot;https://cedec.cesa.or.jp/2025/committee/&quot; target=&quot;_blank&quot;&gt;CEDEC2025&lt;/a&gt; のサイトにもちゃんと載ってますね。感無量。ちなみに、ふりかえりは社内向けに結構ちゃんと書いて、社内勉強会でも発表したんですが、ここでは簡単に（公開予定ありません）&lt;br /&gt;&lt;br /&gt;やはり、運営委員側になって見えたもの、感じたものがあり、とてもたくさんのインプットを得られ、さらに自分自身の成長や変化に繋がったかなと思います。&lt;br /&gt;自分が CEDEC に始めて参加したのは、たぶん 2011 か 2012 かな。&lt;br /&gt;初登壇したのが 2015。最近も登壇しまして、トータルで5セッションになりました。いろんな意味で CEDEC は私を成長させてくれたなと思います。転職してからしばらく視線が社内に向いていたのですが、最近また外に向き始めていたので非常に良いタイミングだったと思います。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://cedec.cesa.or.jp/2026/&quot; target=&quot;_blank&quot;&gt;CEDEC2026&lt;/a&gt;&amp;nbsp;のサイトもオープンしてますね。公募も年明けから開始されるようなので、是非みなさんも応募していただければと思います。&lt;br /&gt;自分も登壇者として、また新しいチャレンジができたらなーと思っています。&lt;/p&gt;
&lt;h5 class=&quot;subhead&quot;&gt;ブログの再開&lt;/h5&gt;
&lt;p&gt;次はこのブログの再開ですね。再開したと言っても以前のような週1更新ではなく、不定期ではありますが…&lt;br /&gt;まぁ、ほぼ2年お休みしていた状態からなので良しとしましょう。&lt;br /&gt;CEDEC 運営委員になったから再開したわけではなく、若手のやる気に感化されたんですよね。&lt;br /&gt;あとは AI によってやる気になったおじさんの一人って感じですね。&lt;br /&gt;まだまだオレも若いぞということです。&lt;br /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;h5 class=&quot;subhead&quot;&gt;GitHub&lt;/h5&gt;
&lt;p&gt;最後に GitHub の活動を。これも AI パワーによって commit が増えた気がします。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikNcN7lmnL8NThcUVEKI7mW0aLBUuTdVdFzPYG9eixgqVHOcn9UO1wIghP1cWeXlFz4NSrONNUPQLChUoNBxgNKsWpK3ab-UYhXnCGDPwk6B1ve0GRauzTm0PkBLIKVGpHiW-V6-kMOTNwVrzsRV70rCpfjWH-kOHG9Ab2xcsxoPajXL3XqIaBA2lCWIY/s1850/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2020.01.23.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;440&quot; data-original-width=&quot;1850&quot; height=&quot;152&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikNcN7lmnL8NThcUVEKI7mW0aLBUuTdVdFzPYG9eixgqVHOcn9UO1wIghP1cWeXlFz4NSrONNUPQLChUoNBxgNKsWpK3ab-UYhXnCGDPwk6B1ve0GRauzTm0PkBLIKVGpHiW-V6-kMOTNwVrzsRV70rCpfjWH-kOHG9Ab2xcsxoPajXL3XqIaBA2lCWIY/w640-h152/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2020.01.23.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZxiA3KvdnPvaPTGjDLdHZbFWzOY9MbiT1ZaJ1b2qdFKABvS9Seg-h1w54yrLhpqEkQ6pcpV-SE-uK59MblhrkqKtCjePK-nFx70esfLV_wN_7LRuwKZJ8s1oPm7ZJTWlzIr6eZak42sXkBgD4Zi3autJK5nCwxYkWKpvNsjhZerX5PN9oQkeUiG7_nIc/s1850/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2020.01.33.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;440&quot; data-original-width=&quot;1850&quot; height=&quot;152&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZxiA3KvdnPvaPTGjDLdHZbFWzOY9MbiT1ZaJ1b2qdFKABvS9Seg-h1w54yrLhpqEkQ6pcpV-SE-uK59MblhrkqKtCjePK-nFx70esfLV_wN_7LRuwKZJ8s1oPm7ZJTWlzIr6eZak42sXkBgD4Zi3autJK5nCwxYkWKpvNsjhZerX5PN9oQkeUiG7_nIc/w640-h152/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2020.01.33.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;（もっと増えたかな？と思ってたけどそれほどでもなかった…去年の自分エライ）&lt;br /&gt;感覚としは、あまり詳しくないものでも取っ掛かりになるものをすぐに得られるようになったことで、こういうのあると便利かも！からとりあえずやってみるが増えた気がします。&lt;br /&gt;今までもできなくもなかったとは思うんですが、詳しくないと調べ方もわからなかったり、言語やツールのセオリーとかもわからなかったりで、最初の一歩が重かった。&lt;br /&gt;それが大分軽くなりましたね。&lt;p&gt;&lt;/p&gt;&lt;p&gt;あと、今まで出勤時にはスマホでゲームだったのですが、今はスマホでコーディングエージェントに指示して OSS 開発をしています。（あ、基本リモートなので出社はほとんどしてないんですけどね）時間（スピードやタイミング）的にも OSS 開発がしやすいなったと感じますね。&lt;br /&gt;どんな活動があったかは、このあと別の記事でふりかえろうと思います。&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;最後に&lt;/h5&gt;
&lt;p&gt;2026年は今年よりも記事書けたらなーと思ってます。&lt;br /&gt;それでは、良いお年を。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/397028002095695578/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2025/12/2025.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/397028002095695578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/397028002095695578'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2025/12/2025.html' title='2025年も残りわずか！'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikNcN7lmnL8NThcUVEKI7mW0aLBUuTdVdFzPYG9eixgqVHOcn9UO1wIghP1cWeXlFz4NSrONNUPQLChUoNBxgNKsWpK3ab-UYhXnCGDPwk6B1ve0GRauzTm0PkBLIKVGpHiW-V6-kMOTNwVrzsRV70rCpfjWH-kOHG9Ab2xcsxoPajXL3XqIaBA2lCWIY/s72-w640-h152-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-12-31%2020.01.23.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-6371674322901758869</id><published>2025-09-10T10:58:00.001+09:00</published><updated>2025-09-10T10:58:35.969+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>【GitHub Actions】export-ignore でアクションのサイズを小さくする小技</title><content type='html'>&lt;p&gt;こんにちは。皆さん GitHub Actions のアクション作ってますか？&lt;br /&gt;では、&lt;a href=&quot;https://docs.github.com/en/actions/reference/workflows-and-actions/contexts#github-context&quot; target=&quot;_blank&quot;&gt;${{ github.action_path }}&lt;/a&gt; はご存知でしょうか？&amp;nbsp;&lt;br /&gt;github.action_path は composite action の実行中に有効なプロパティで、アクションのリポジトリに含まれているファイルにアクセスするときに便利なやつです。&lt;br /&gt;&lt;br /&gt;例えば、私が先日リリースした &lt;a href=&quot;https://github.com/srz-zumix/labeler-action&quot; target=&quot;_blank&quot;&gt;srz-zumix/labeler-action&lt;/a&gt; ではリポジトリにおいてある aqua の設定を使ってツールのインストールを行っています。&lt;br /&gt;「&lt;a href=&quot;https://srz-zumix.blogspot.com/2025/09/github-actionsactionslabeler.html&quot; target=&quot;_blank&quot;&gt;ブログズミ: 【GitHub Actions】actions/labeler 互換で on.pull_request 以外でも使えるアクション srz-zumix/labeler-action を作りました&lt;/a&gt;」&lt;br /&gt;ソースコード的にはこのあたりです。&lt;br /&gt;&lt;a href=&quot;https://github.com/srz-zumix/labeler-action/blob/main/action.yml#L43&quot;&gt;https://github.com/srz-zumix/labeler-action/blob/main/action.yml#L43&lt;/a&gt;&lt;/p&gt;&lt;p&gt;実はこのアクションを作ったときに github.action_path に .git ディレクトリがないことに気づきました。てっきり checkout されていると思っていたのですが、実際には git archive されているようでした。&lt;br /&gt;&lt;br /&gt;あまり使う機会はないかもしれませんが、git archive はリポジトリの内容だけを保存できる機能で、GitHub 上だと「Download ZIP」にあたります。&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhz9buwV-RPz7keUJAUcMlniA5xk29ZtyW2LvQIPeJvSfXkVFPQz9R3B_Xhj83bKgcESdgi5Mbc99zLwk6VSVe5ld74OV_a9i6BCMMGqGUmxrNVRfAgHKycysYVra4duI7MFzbkxhGRl9q-Vz1kNB_LnU6qp_ztF4ok2o6DV6eVE9GGVZcyDJYOAm9EBM4&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1304&quot; data-original-width=&quot;1868&quot; height=&quot;446&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhz9buwV-RPz7keUJAUcMlniA5xk29ZtyW2LvQIPeJvSfXkVFPQz9R3B_Xhj83bKgcESdgi5Mbc99zLwk6VSVe5ld74OV_a9i6BCMMGqGUmxrNVRfAgHKycysYVra4duI7MFzbkxhGRl9q-Vz1kNB_LnU6qp_ztF4ok2o6DV6eVE9GGVZcyDJYOAm9EBM4=w640-h446&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ところで、.gitattributes の export-ignore はご存知でしょうか？&amp;nbsp;&lt;a href=&quot;https://git-scm.com/book/ja/v2/Git-%E3%81%AE%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%9E%E3%82%A4%E3%82%BA-Git-%E3%81%AE%E5%B1%9E%E6%80%A7#_export_ignore&quot; target=&quot;_blank&quot;&gt;Git - Git の属性 (export-ignore)&lt;/a&gt;&lt;br /&gt;これは archive に特定のパスを含めないようにできる属性です。例えば、成果物を提出する時なんかに便利な機能です。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;さて、ここまで来たら想像がつきますよね？&lt;br /&gt;そうです。アクションのリポジトリでも &lt;b&gt;export-ignore を設定することで、アクションを使うときにダウンロードしてくるサイズをちょっと節約&lt;/b&gt;できます。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;ちなみに、composite action 以外の action でも archive が展開されるのは同じです。&lt;br /&gt;TypeScript でアクションを作ってる方は多いと思いますが、アクションが実際に使うのはコンパイル後の .js ファイルです。ソースである .ts ファイルやテストコードなどアクションの実行には不要なファイルがそこそこあります。&lt;br /&gt;このようなアクション実行時に不要なファイルを export-ignore してみるのはどうでしょうか。試しに自作アクションで導入してみました。&lt;br /&gt;&lt;a href=&quot;https://github.com/srz-zumix/post-run-action&quot; target=&quot;_blank&quot;&gt;srz-zumix/post-run-action&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhqKBhEhK-D2qyZDUfAbHQAyWaqjcyTB2sJ4M25CXX97CwwRazfUZ1ARroyTMB8fVQpvExEXnQqHw5nHXKA9ON-rumrvZ-YLT_9C2WbFV_w5lInQOkmMcAAzZABIVl7wK8OcAyTIhPONAD36BnwxH1XklD8dYhGpBIf2lw04NBtOVr5oiGJl7XNhHozpnM&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;718&quot; data-original-width=&quot;1458&quot; height=&quot;317&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEhqKBhEhK-D2qyZDUfAbHQAyWaqjcyTB2sJ4M25CXX97CwwRazfUZ1ARroyTMB8fVQpvExEXnQqHw5nHXKA9ON-rumrvZ-YLT_9C2WbFV_w5lInQOkmMcAAzZABIVl7wK8OcAyTIhPONAD36BnwxH1XklD8dYhGpBIf2lw04NBtOVr5oiGJl7XNhHozpnM=w640-h317&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgh5JZXHzhv8Zdm9v6BYnUYzivHZIZKj9RjjjYpydFMnbMRdWtnku9AgVXeUu2GShM539_w7YO2tUCKW0uzH3R-NDj0KO5DTCaw8gVSHV7JGc__hwqij2r1uUE4uDu7fg79dIEbsTT-8eJlx62QUFsMM37Dy3O-8IkD8NP-rox-1qswB6FPgI-_L0en9kg&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img alt=&quot;&quot; data-original-height=&quot;1108&quot; data-original-width=&quot;1530&quot; height=&quot;464&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEgh5JZXHzhv8Zdm9v6BYnUYzivHZIZKj9RjjjYpydFMnbMRdWtnku9AgVXeUu2GShM539_w7YO2tUCKW0uzH3R-NDj0KO5DTCaw8gVSHV7JGc__hwqij2r1uUE4uDu7fg79dIEbsTT-8eJlx62QUFsMM37Dy3O-8IkD8NP-rox-1qswB6FPgI-_L0en9kg=w640-h464&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;御覧頂いているように、不要なファイルを除外しつつ、問題なくアクション実行できています。&lt;/p&gt;&lt;p&gt;今回試した post-run-action はもともと小さなリポジトリなので、export-ignore の恩恵はほとんどないとは思います。ただ、ソースが大きかったり、テストデータが大きかったりする場合は多少変わってくるかもしれません。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;今回はちょっとした小技の紹介でした。&lt;br /&gt;（ちなみに export-ignore を確認したときに知ったのですが、export-subst でなんか面白い使い方できないかなぁと思った）&lt;/p&gt;&lt;p&gt;ではでは。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/6371674322901758869/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2025/09/github-actionsexport-ignore.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/6371674322901758869'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/6371674322901758869'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2025/09/github-actionsexport-ignore.html' title='【GitHub Actions】export-ignore でアクションのサイズを小さくする小技'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEhz9buwV-RPz7keUJAUcMlniA5xk29ZtyW2LvQIPeJvSfXkVFPQz9R3B_Xhj83bKgcESdgi5Mbc99zLwk6VSVe5ld74OV_a9i6BCMMGqGUmxrNVRfAgHKycysYVra4duI7MFzbkxhGRl9q-Vz1kNB_LnU6qp_ztF4ok2o6DV6eVE9GGVZcyDJYOAm9EBM4=s72-w640-h446-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-5437484713015317904</id><published>2025-09-01T10:25:00.001+09:00</published><updated>2025-09-01T10:25:44.831+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>【GitHub Actions】actions/labeler 互換で on.pull_request 以外でも使えるアクション srz-zumix/labeler-action を作りました </title><content type='html'>&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjuuHb3vm6qduHp7PdIP62qExUcmpLwXUE-GryIVfL3mQ7zJ7s4IceOgr1_lgRVLA4tmDrfx6Pel4xml5pT6p4ZZcfB7tEp-pWUpQCefuWElzrx7BaCYdQaUrZ-yKQj0lIYuVoeyYF77EwSiUKv5SxaMJQFFqXcaEKdWXzLk3n9QF5Dns2EExz-IeMR438&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img data-original-height=&quot;256&quot; data-original-width=&quot;690&quot; height=&quot;149&quot; src=&quot;https://blogger.googleusercontent.com/img/a/AVvXsEjuuHb3vm6qduHp7PdIP62qExUcmpLwXUE-GryIVfL3mQ7zJ7s4IceOgr1_lgRVLA4tmDrfx6Pel4xml5pT6p4ZZcfB7tEp-pWUpQCefuWElzrx7BaCYdQaUrZ-yKQj0lIYuVoeyYF77EwSiUKv5SxaMJQFFqXcaEKdWXzLk3n9QF5Dns2EExz-IeMR438=w400-h149&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/actions/labeler/pull/873&quot; target=&quot;_blank&quot;&gt;actions/labeler&lt;/a&gt; 便利ですよね。&lt;br /&gt;でもちょっと困ったことがありました。&lt;br /&gt;過去の PR に対してルール適用をしようと思ったところ、ブランチ名ルールが pull_request イベント前提のコードになっていて、workflow_dispatch で PR 番号指定して実行したときに設定どおりにラベル付けできませんでした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/actions/labeler/pull/873&quot; target=&quot;_blank&quot;&gt;この問題の修正 PR&lt;/a&gt; を出してはいるんですが反応がないので、自分で作りました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a href=&quot;https://github.com/srz-zumix/labeler-action&quot; target=&quot;_blank&quot;&gt;srz-zumix/labeler-action&lt;/a&gt;&lt;div&gt;使い方は actions/labeler とほぼ同じです。&lt;/div&gt;&lt;div&gt;labeler の設定ファイルと同じ設定ファイルが使えます。&lt;br /&gt;labeler-action は `dot: false` には対応していないのですが、ラベルの色設定に対応しています。labeler はラベルがない場合にラベルを作成してくれはしますが、色がグレーになってしまうのでちょっと不便でした。&lt;br /&gt;&lt;br /&gt;色指定は以下のようにします。&lt;br /&gt;&lt;/div&gt;

&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;ci:
- any:
  - changed-files:
    - any-glob-to-any-file: &#39;.github/*&#39;
- color: &#39;#7c0bb2&#39;

aqua:
- changed-files:
  - any-glob-to-any-file: &#39;aqua.*.yaml&#39;
- color: &#39;#1E90FF&#39;

documentation:
- changed-files:
  - any-glob-to-any-file:
    - &#39;docs/*&#39;
    - README.md
&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;都合が良いことに color の設定があっても actions/labeler では無視されてエラーにはなりません。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに labeler-action はツールを呼び出しているだけで処理の実体は &lt;a href=&quot;https://github.com/srz-zumix/gh-label-kit&quot; target=&quot;_blank&quot;&gt;srz-zumix/gh-label-kit&lt;/a&gt; にあります。こちらも私が作っているもので、GitHub のラベル関係の操作を行える gh-extension となっています。&lt;br /&gt;この拡張機能の１機能として labeler コマンドを実装しています。&lt;br /&gt;したがって、gh-label-kit を使っていただければ GitHub Actions を使わず、ローカル環境からでもラベル設定が可能になります。&lt;br /&gt;その他にも gh 標準には（今のところまだ）ない機能が揃っているので是非使ってみてください。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;また、今回は gh-extension を gh extension install するのではなく、&lt;a href=&quot;https://github.com/aquaproj/aqua&quot; target=&quot;_blank&quot;&gt;aqua&lt;/a&gt; を使用してインストールしています。これは self-hosted runner のことをちょっと意識しています。&lt;br /&gt;aqua はまだ使い始めて間もないので、もっと便利な使い方を実践していきたいです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;以上です。ではでは&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/5437484713015317904/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2025/09/github-actionsactionslabeler.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5437484713015317904'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5437484713015317904'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2025/09/github-actionsactionslabeler.html' title='【GitHub Actions】actions/labeler 互換で on.pull_request 以外でも使えるアクション srz-zumix/labeler-action を作りました '/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/a/AVvXsEjuuHb3vm6qduHp7PdIP62qExUcmpLwXUE-GryIVfL3mQ7zJ7s4IceOgr1_lgRVLA4tmDrfx6Pel4xml5pT6p4ZZcfB7tEp-pWUpQCefuWElzrx7BaCYdQaUrZ-yKQj0lIYuVoeyYF77EwSiUKv5SxaMJQFFqXcaEKdWXzLk3n9QF5Dns2EExz-IeMR438=s72-w400-h149-c" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-4860044821056545164</id><published>2025-07-10T09:32:00.001+09:00</published><updated>2025-07-10T09:32:07.229+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>【GitHub Actions】任意のスクリプトを Post 実行するアクションを作った</title><content type='html'>&lt;p&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/srz-zumix/post-run-action&quot; target=&quot;_blank&quot;&gt;srz-zumix/post-run-action&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;リポジトリはこちちです。&lt;br /&gt;機能としては run step と同等のことが Post タイミングで実行できるアクションです。&lt;br /&gt;&lt;br /&gt;アクションには後片付けをするタイミングとして Post 処理が書けます。&lt;br /&gt;よく使う actions/checkout も Post 処理で git config などを元に戻す処理がされています。&lt;br /&gt;実行ログを見ていただくと、下図のように Post 処理が並んでいると思います。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipUEu1AWVgcxIYEkYNGaThyXTOihmXrjdW1Ak_XBY3SIxI2ZrcXltyD7qP7TgH1sYxUCmx8oDY-D1X8l2z-pMX-QvUpXM2b2jM0VcLhNXtThGMyodIupui3AfUttNw2Nw-40DjJxUd9527WeE6cGQLUyEw9MGiSyfDMP0xv2MGL5wPPlY3f0gjqxDSfFQ/s1718/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-07-08%2010.52.34.png&quot; style=&quot;clear: left; margin-bottom: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;636&quot; data-original-width=&quot;1718&quot; height=&quot;236&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipUEu1AWVgcxIYEkYNGaThyXTOihmXrjdW1Ak_XBY3SIxI2ZrcXltyD7qP7TgH1sYxUCmx8oDY-D1X8l2z-pMX-QvUpXM2b2jM0VcLhNXtThGMyodIupui3AfUttNw2Nw-40DjJxUd9527WeE6cGQLUyEw9MGiSyfDMP0xv2MGL5wPPlY3f0gjqxDSfFQ/w640-h236/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-07-08%2010.52.34.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;このようにワークフローで手軽に Post 処理を記述ができようになる便利なアクションが post-run-action です。&lt;br /&gt;もちろん post-run-action を使わずとも if: always() なステップを最後に追加すれば、後片付けをすることは可能です。&lt;br /&gt;&lt;br /&gt;後片付けしたい処理と、後片付け処理を近くに書いておけるのがメリットでしょうか。&lt;br /&gt;例えば、長いワークフローだと Post step が遠くて分かりづらいかもしれません。&lt;/p&gt;
  
&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;      steps:
      - name: Checkout
        id: checkout
        uses: actions/checkout@v4
      - name: Do
        run: |
          echo &quot;TODO&quot;
      - name: Post Action
        uses: srz-zumix/post-run-action@v2
        with:
          post-run: |
            echo &quot;Post run step&quot;

      # ...

      - name: Post
        if: always()
        run: |
          echo &quot;Post run step&quot;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;そのような場合には、アクション化してしまうことも1つ手段かと思います。&lt;br /&gt;しかし、残念なことに現状 composite action で Post 処理が書けません！&lt;br /&gt;JavaScript action なら Post 処理を書けますが、複数のステップをまとめてアクション化する場合、composite が書きやすくそれを選択しがちです。&lt;br /&gt;&lt;br /&gt;そこで post-run-action を使います！&lt;br /&gt;実は composite で Post 処理が書けないことをなんとかしたくて作ったのがこのアクションなのです。&lt;br /&gt;&lt;br /&gt;post-run-action を使うことで好きなタイミングで後片付け処理をセットできるようになります。私が作成したアクションの中でも業務でよく使っているアクションの1つになります。&lt;br /&gt;ぜひ使ってみてください。&lt;br /&gt;&lt;br /&gt;では。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/4860044821056545164/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2025/07/github-actions-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/4860044821056545164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/4860044821056545164'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2025/07/github-actions-post.html' title='【GitHub Actions】任意のスクリプトを Post 実行するアクションを作った'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEipUEu1AWVgcxIYEkYNGaThyXTOihmXrjdW1Ak_XBY3SIxI2ZrcXltyD7qP7TgH1sYxUCmx8oDY-D1X8l2z-pMX-QvUpXM2b2jM0VcLhNXtThGMyodIupui3AfUttNw2Nw-40DjJxUd9527WeE6cGQLUyEw9MGiSyfDMP0xv2MGL5wPPlY3f0gjqxDSfFQ/s72-w640-h236-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202025-07-08%2010.52.34.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-5298951210891856993</id><published>2025-06-23T09:28:00.001+09:00</published><updated>2025-06-23T09:28:45.968+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AI"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><title type='text'>GitHub Search と NotebookLM で自分の活動を振り返る</title><content type='html'>&lt;h5 class=&quot;subhead&quot;&gt;GitHub Search で昨日何してたっけ？を簡単に&lt;/h5&gt;
&lt;a href=&quot;https://github.com/srz-zumix/gh-activity-report&quot; target=&quot;_blank&quot;&gt;gh-activity-report&lt;/a&gt;&amp;nbsp;という gh 拡張機能をちょうど2年前くらいに作っていました。&lt;br /&gt;
こちらは GitHub の検索APIを gh search コマンドをつかって簡単に呼び出し、結果をレポートとして使いやすいように加工して出力する gh 拡張機能です。&lt;br /&gt;
gh search 使えばできることなので、わざわざ拡張機能を作る必要もないのですが期間の指定を「XX日前以降」とか「今月」とかがめんどくさかったのでこれを作りました。&lt;br /&gt;&lt;br /&gt;
例えば、昨日以降に更新した PR および Issue を検索する場合はこのようになります。&lt;br /&gt;
&lt;pre class=&quot;console&quot;&gt;gh activity-report -d 1&lt;/pre&gt;
これを gh search で書くとこのようになります。
&lt;pre class=&quot;console&quot;&gt;gh search issues --include-prs --sort updated --author @me --updated &quot;&amp;gt;=2025-04-21&quot;&lt;/pre&gt;今日の日付に合わせて、コマンドを実行する必要があるのでちょっと面倒くさいですよね。&lt;br /&gt;
自分は下記コマンドで gh ar -d 1 で呼び出せるようにエイリアス設定をしています。&lt;br /&gt;昨日何してたっけ？先週何してたっけ？と良くなるのでとても便利です。&lt;br /&gt;
&lt;pre class=&quot;console&quot;&gt;gh alias set ar activity-report&lt;/pre&gt;

&lt;h5 class=&quot;subhead&quot;&gt;GitHub Search の結果を定時報告に使う&lt;/h5&gt;
&lt;div&gt;さて、この&amp;nbsp;&lt;a href=&quot;https://github.com/srz-zumix/gh-activity-report&quot; target=&quot;_blank&quot;&gt;gh-activity-report&lt;/a&gt;&amp;nbsp;ですが gh search の出力フォーマット以外にも対応しています。gh コマンドをよく使っている人は --jq や --template オプションで出力加工ができることをご存知かと思います。 gh ar でやる場合は -- を使います。&lt;br /&gt;&lt;/div&gt;
&lt;pre class=&quot;console&quot;&gt;gh ar -d 1 -- --json url --jq &quot;.[].url&quot;&lt;/pre&gt;&lt;div&gt;単純な加工であればこれで十分ですが、ちょっと凝った出力にするのはやや面倒です。&lt;br /&gt;
--format オプションでいくつかパターンを用意してます。下記は一例です。&lt;/div&gt;
&lt;pre class=&quot;console&quot;&gt;gh ar -d 1 --format markdown&lt;/pre&gt;
&lt;pre class=&quot;console&quot;&gt;gh ar -d 1 --format list&lt;/pre&gt;
&lt;div&gt;自分用に用意したものなので、お好きなフォーマットにする場合は前述のオプションか、json format で出力して結果をテンプレートエンジンなどで加工するとかもできると思います。&lt;br /&gt;（私は &lt;a href=&quot;https://github.com/podhmo/kamidana&quot; target=&quot;_blank&quot;&gt;kamidana&lt;/a&gt; を使った自作の &lt;a href=&quot;https://github.com/srz-zumix/kamidana-action&quot; target=&quot;_blank&quot;&gt;kamidana-action&lt;/a&gt; をよく使っています）&lt;br /&gt;gh の --json オプションは欲しいキーを指定しないといけなく、全部が面倒くさいのですが --format json なら簡単に全部出力できます。&lt;br /&gt;
&lt;pre class=&quot;console&quot;&gt;gh ar -d --format json&lt;/pre&gt;
&lt;div&gt;私はこれらを組み合わせて、週報を自動で書かせています。&lt;br /&gt;&lt;/div&gt;

&lt;h5 class=&quot;subhead&quot;&gt;定期的なふりかえり&lt;/h5&gt;
  &lt;div&gt;もともとこの拡張機能は活動の報告やふりかえりを目的として作成しましたが、これらは評価のためでもありました。&lt;/div&gt;&lt;div&gt;年に1回や半年に1回のタイミングだとどうしても記憶が曖昧になっていたり、直近の記憶が強くなりがちです。何やってたんだっけ？と毎回なります。&lt;br /&gt;拡張機能で半年間の活動を出力させることもできますが、量がすごく多いのでそれで振り返るのもまた大変です。なので、月ごとにふりかえりをして記録をするという手段を取っています。これを自分リリースノートという名前でやっています。&lt;/div&gt;&lt;div class=&quot;pale&quot;&gt;（個人活動の方でも昔やってましたが、今は止まってます・・・）&lt;/div&gt;&lt;div&gt;自分リリースノートは自身の成長を観点としています。記録にはその観点フィルターを通した要約結果が記載されています。&lt;br /&gt;今回、たまたま別の観点でふりかえりをしたいというきっかけがあり、もう一度 PR などの活動を見返す必要があったので、 NotebookLM に手伝ってもらいました。&lt;br /&gt;
  
&lt;h5 class=&quot;subhead&quot;&gt;NotebookLM で自分の活動をふりかえる&lt;/h5&gt;
NotebookLM のソースとして&amp;nbsp;&lt;a href=&quot;https://github.com/srz-zumix/gh-activity-report&quot; target=&quot;_blank&quot;&gt;gh-activity-report&lt;/a&gt;&amp;nbsp;の出力を与えてみましたが、既存のフォーマットでは微妙だったので今回それを目的としたフォーマット（lens-with-body）を追加しています。私がブログを休んでいた期間の情報を出力すると以下のようなオプションになります。&lt;br /&gt;&lt;pre class=&quot;console&quot;&gt;gh ar --since 2023-04-01 -l 1000 --format lens-with-body --visibility public&lt;/pre&gt;&lt;div&gt;どのようなフォーマットかというと「repository,number,url,state,title,createdAt,closedAt,updatedAt,author,body&lt;/div&gt;&lt;div&gt;」キーの情報を平文でただただ出力しているだけです。（長いので結果は省略）&lt;br /&gt;既存のフォーマットは GitHub にそのまま書きやすい、人が読みやすいものが多かったのですが、今回のフォーマットは情報をダンプしている感じで人が読みやすいとは言い難いです。&lt;/div&gt;&lt;br /&gt;出力した結果をソースとしていれて、どのような活動があったかまとめてもらいました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL35uFWcWpM9eUv97FafhvYC0A6z1mli9INRzlEXUNEpmFuLFc_Py2lReIsJHzHUEwJnfKOfAjDQWmjPnI9EJzOf70hWNt4NOpIVD-AmOcePrwvfFYUWVs3FQbHLQ5mown_oilZJgx3XNjI9UpKCGFUpgDn2WU31oklQhlCNkzqGmewchGCs6fHEWevjg/s2914/notebooklm-gh-ar1.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1644&quot; data-original-width=&quot;2914&quot; height=&quot;362&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL35uFWcWpM9eUv97FafhvYC0A6z1mli9INRzlEXUNEpmFuLFc_Py2lReIsJHzHUEwJnfKOfAjDQWmjPnI9EJzOf70hWNt4NOpIVD-AmOcePrwvfFYUWVs3FQbHLQ5mown_oilZJgx3XNjI9UpKCGFUpgDn2WU31oklQhlCNkzqGmewchGCs6fHEWevjg/w640-h362/notebooklm-gh-ar1.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoVKrGaNs_5c1U5Dl6N3QuaOWJxGkkvbtjqYyFT0msW5w0GGcAXtl9pldivZXZH6PxnISwt3TLRuNXKn7d9LZB1WDwg_mWOJOOJbVCkWqSsAzeDTwZEPvjamXY3SRm2Zif428sr4MzGmKsqDUS8KL08D1EqAmbcNlmrKjiJVoXauc0AUqVRSbDiX0o9us/s2918/notebooklm-gh-ar2.png&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1870&quot; data-original-width=&quot;2918&quot; height=&quot;410&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoVKrGaNs_5c1U5Dl6N3QuaOWJxGkkvbtjqYyFT0msW5w0GGcAXtl9pldivZXZH6PxnISwt3TLRuNXKn7d9LZB1WDwg_mWOJOOJbVCkWqSsAzeDTwZEPvjamXY3SRm2Zif428sr4MzGmKsqDUS8KL08D1EqAmbcNlmrKjiJVoXauc0AUqVRSbDiX0o9us/w640-h410/notebooklm-gh-ar2.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;なんかいい感じです。&lt;br /&gt;AI の登場で情報をまとめて要約することが手軽になりましたね。&lt;br /&gt;&lt;br /&gt;最初は全期間の１ソースだけ用意していたのですが、いまいち認識が甘かったので期間を分割して複数のソースとしました。単純にファイルサイズ（トークン数）というわけでもなさそうで、自分の PR の body がほとんど空っぽだったせいもあるような気もしています。&lt;br /&gt;また、期間中の PR が月ごとに何件あったか調べてもらったら、微妙に一致しなかったりしました。&lt;br /&gt;&lt;br /&gt;ちなみに、クセで目的とは関係なく挙動の実験をしてたら、このブログを書くのが２ヶ月遅れましたw　いろいろ調べてみるのは楽しいのですが、現時点での AI に合わせてもしょうもないのでキリにします。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;AI 関連の変化は目まぐるしいので、上手に向き合っていけたらいいなと思ってますね。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;私は AI 自体に詳しいわけでもなく、利用者としても初心者レベルなので、どちらも触れていって、自分の引き出しを増やせればと思います。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;
  
  &lt;h5 class=&quot;subhead&quot;&gt;Gemini ではどうか？&lt;/h5&gt;
  &lt;/div&gt;&lt;div&gt;Gemini でも同じことができます。&lt;br /&gt;NotebookLM は json ファイルに対応しておらず、平文化する必要がありましたが Gemini だとそのまま json をソースにできるので楽でした。&lt;br /&gt;目的にあわせて使いやすものを使うのが良いんじゃないかなと思います。&lt;/div&gt;&lt;div&gt;&lt;div&gt;
  
  &lt;h5 class=&quot;subhead&quot;&gt;最後に&lt;/h5&gt;
  &lt;/div&gt;&lt;/div&gt;&lt;div&gt;久しぶりブログ書いたけど、感想文みたいになっちゃいましたね。&lt;br /&gt;最近は gh 拡張とか GitHub Actions のアクションを作ってることが多いので、そのへんも紹介できたらいいなと思ってます。では。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/5298951210891856993/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2025/06/github-search-notebooklm.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5298951210891856993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5298951210891856993'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2025/06/github-search-notebooklm.html' title='GitHub Search と NotebookLM で自分の活動を振り返る'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhL35uFWcWpM9eUv97FafhvYC0A6z1mli9INRzlEXUNEpmFuLFc_Py2lReIsJHzHUEwJnfKOfAjDQWmjPnI9EJzOf70hWNt4NOpIVD-AmOcePrwvfFYUWVs3FQbHLQ5mown_oilZJgx3XNjI9UpKCGFUpgDn2WU31oklQhlCNkzqGmewchGCs6fHEWevjg/s72-w640-h362-c/notebooklm-gh-ar1.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-884603523924451476</id><published>2025-06-23T09:27:00.001+09:00</published><updated>2025-06-23T09:27:51.278+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="雑記"/><title type='text'>おひさ！</title><content type='html'>どうも久しぶりです。いつぶりの投稿でしょうか。約2年ぶりみたいですね。。&lt;br /&gt;ここ数年は仕事が楽しくて社内での活動ばかりでした。&lt;br /&gt;…というのも言い訳でして、一度途絶えた習慣を元に戻すのは大変だなと感じてます。&lt;br /&gt;リモートワークになり通勤がなくなったのが一番の影響でしょうか。&lt;br /&gt;出勤途中のスタバで記事を書くというのが習慣だったんですよね。&lt;br /&gt;私物 PC を毎日リュックに入れて通勤してました。たまに会社の PC も持ち帰ることがあったので2台背負って電車に揺られる日もありました。信じられません。&lt;div&gt;&lt;div&gt;&lt;br /&gt;最近は公式ドキュメント読めば OK だったり、 Zenn や Qiita などの記事を見ることや、&lt;br /&gt;AI に聞くことが増え、個人ブログで情報を得る機会がかなり減ってしまいました。&lt;br /&gt;&lt;span class=&quot;pale&quot;&gt;（消しゴムの跡）&lt;/span&gt;&lt;br /&gt;このへんはいろいろと思うところもあるんですよね。自分がこのブログを書く意味ってなんだろう、とか。&lt;/div&gt;&lt;div&gt;&lt;span class=&quot;pale&quot;&gt;（テキトーなこと言ってます）&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;あと、これまでインターネット上の自分は本名の自分と別として活動してました。&lt;br /&gt;まぁ隠してたわけではないですし、それなりの人に = あの人と認知されていることは知ってはいましたが、ここ数年でこの = 認知の範囲が広がったんじゃないかなと思ってます。&lt;br /&gt;今までのように仕事成分抜いて投稿するってのもやりづらいなぁと勝手に感じております。&lt;br /&gt;&lt;br /&gt;と、ネガティブな理由を書きましたが、それを書くために再び筆を執ったわけではないです。&lt;br /&gt;最近、若手の活躍や意欲の高さにあてられて、自分も何かやりたくなったからですね&lt;br /&gt;この2年間なにもしてなかったわけではなく、OSS活動はずっとやってきてましたし、公にやったことの話なら問題ないので、また書くことにしました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;書くペースはどうでしょうね？以前のように週一回更新はできないかもしれないですが、2年分の貯金でしばらく頑張ってみましょうかね。こういう形での不定期連載もありだろうか？&lt;br /&gt;まぁまだしばらくこのブログで個人活動を続けようかと思います。今後ともよろしくお願いします。&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/884603523924451476/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2025/06/blog-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/884603523924451476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/884603523924451476'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2025/06/blog-post.html' title='おひさ！'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-2694970655690680164</id><published>2023-06-28T10:14:00.001+09:00</published><updated>2023-06-28T10:14:39.678+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="gh"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>gh と peco でリポジトリ一覧から選択して clone する</title><content type='html'>&lt;h5 class=&quot;subhead&quot;&gt;はじめに、雑な説明&lt;/h5&gt;
&lt;div&gt;&lt;a href=&quot;https://github.com/cli/cli&quot; target=&quot;_blank&quot;&gt;gh&lt;/a&gt; は GitHub 関連の操作がとっても楽になる便利な CLI です。&lt;br /&gt;&lt;a href=&quot;https://github.com/peco/peco&quot; target=&quot;_blank&quot;&gt;peco&lt;/a&gt; は CUI 上でインタラクティブに候補から出力を選択できるツールです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;


&lt;h5 class=&quot;subhead&quot;&gt;各種インストール&lt;/h5&gt;&lt;div&gt;gh:&amp;nbsp;&lt;a href=&quot;https://github.com/cli/cli#installation&quot;&gt;https://github.com/cli/cli#installation&lt;/a&gt;&lt;/div&gt;&lt;div&gt;peco:&amp;nbsp;&lt;a href=&quot;https://github.com/peco/peco#installation&quot;&gt;https://github.com/peco/peco#installation&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;

&lt;h5 class=&quot;subhead&quot;&gt;エイリアス&lt;/h5&gt;
&lt;div&gt;.giconfig ファイルに下記を追加します&lt;br /&gt;&lt;/div&gt;

&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;[alias]
	peco = &quot;!f(){ git peco-$1 ${@:2:($#-1)}; };f&quot;
	peco-clone = &quot;!f(){ gh repo list -L 100 $1 --json nameWithOwner --jq &#39;.[].nameWithOwner&#39; | peco | xargs -I % gh repo clone -u up % ${@:2:($#-1)};};f&quot;&lt;/pre&gt;
&lt;/div&gt;

&lt;div&gt;-u up オプションを付けているのは fork リポジトリの場合にデフォルトで upstream が remote に追加されますが、この名前だと gh pr create したときに push する remote を選択するときに upstream が第一候補になってミスりやすいからです&lt;br /&gt;&lt;/div&gt;


&lt;h5 class=&quot;subhead&quot;&gt;使い方&lt;/h5&gt;
&lt;pre class=&quot;console&quot;&gt;git peco clone srz-zumix&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;iframe allowfullscreen=&#39;allowfullscreen&#39; webkitallowfullscreen=&#39;webkitallowfullscreen&#39; mozallowfullscreen=&#39;mozallowfullscreen&#39; width=&#39;320&#39; height=&#39;266&#39; src=&#39;https://www.blogger.com/video.g?token=AD6v5dyN-zltpWrotmjJMpbDgICkZi1aKUFY5qEsx1NpOs6ElXOVIzvvAdmxjo9Zwc9luWq-CytcYZbjXG3oJ4OV9A&#39; class=&#39;b-hbp-video b-uploaded&#39; frameborder=&#39;0&#39;&gt;&lt;/iframe&gt;&lt;/div&gt;


&lt;h5 class=&quot;subhead&quot;&gt;最後に&lt;/h5&gt;&lt;div&gt;今まで git clone するときにいちいち GitHub をブラウザで開いて URL コピペしたりして clone してましたが、gh の登場でかなり簡単に clone できるようになりました。&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;

&lt;pre class=&quot;console&quot;&gt;gh repo clone owner/repo&lt;/pre&gt;

&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;こうですね。&lt;/div&gt;&lt;div&gt;ただ、新しい PC に引っ越ししたときに環境構築をしていて、↑の方法で clone してたのですが、リポジトリ名なんだっけ？となることがあって（１つの org にいっぱい repo あったりするので・・）、その度にブラウザ開くか、「gh repo list owner」コマンドでリスト出してたんですが、 peco でワンオペにしたらええやんということで生まれました。&lt;br /&gt;&lt;br /&gt;この方法であれば owner/organization 名さえ覚えておけば簡単に clone できます。&lt;br /&gt;peco の機能で検索フィルタも書けられるので目当ての repo も探しやすい！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ちなみに GitHub Enterprise の場合は GH_HOST 環境変数でホストを指定すれば対応できますが、私はめんどくさいしつけ忘れてしまうことが多いので &lt;a href=&quot;https://github.com/k1LoW/gh-do&quot; target=&quot;_blank&quot;&gt;gh-do&lt;/a&gt; もインストールして下記のエイリアスを登録して使ってます。&lt;br /&gt;&lt;/div&gt;

&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;alias ghe-do=&quot;gh do --hostname=github.hoge.jp --&quot;
&lt;/pre&gt;
&lt;/div&gt;
  
&lt;div&gt;e.g.&lt;br /&gt;&lt;/div&gt;

&lt;pre class=&quot;console&quot;&gt;ghe-do git peco clone xxx&lt;/pre&gt;
  
  &lt;div&gt;&lt;br /&gt;今回は以上です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/2694970655690680164/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2023/06/gh-peco-clone.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/2694970655690680164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/2694970655690680164'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2023/06/gh-peco-clone.html' title='gh と peco でリポジトリ一覧から選択して clone する'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-5986940545922472455</id><published>2023-05-28T18:35:00.001+09:00</published><updated>2023-05-28T18:35:56.403+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>【GitHub Actions】Organization/Owner 配下にあるすべてのリポジトリをマトリックスにする</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://github.com/srz-zumix/github-actions-sample/blob/main/.github/workflows/owner_all_repo_matrix.yaml&quot; target=&quot;_blank&quot;&gt;https://github.com/srz-zumix/github-actions-sample/blob/main/.github/workflows/owner_all_repo_matrix.yaml&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;source&quot;&gt;
&lt;pre class=&quot;brush:yaml&quot;&gt;name: Organization/Owner repo matrix
on:
  pull_request:

permissions:
  contents: read

env:
  GH_TOKEN: ${{ github.token }}

jobs:
  prepare:
    runs-on: ubuntu-latest
    outputs:
      repos: ${{ steps.get-repos.outputs.repos }}
    env:
      TARGET_OWNER: srz-zumix
    steps:
      - id: get-repos
        run: |
            # shellcheck disable=SC2016
            REPOS=$(gh repo list &quot;${TARGET_OWNER}&quot; --json nameWithOwner --template &#39;[ {{ range $i, $e := .}}{{ if ne $i 0 }}, {{ end }}&quot;{{ $e.nameWithOwner }}&quot;{{ end }} ]&#39;)
            echo &quot;repos=${REPOS}&quot; &amp;gt;&amp;gt; &quot;${GITHUB_OUTPUT}&quot;
      - run: echo &quot;${{ steps.get-repos.outputs.repos }}&quot;

  main:
    runs-on: ubuntu-latest
    needs: prepare
    strategy:
      matrix:
        repo: &quot;${{ fromJSON(needs.prepare.outputs.repos) }}&quot;
    steps:
      - run: echo ${{ matrix.repo }} 

&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;gh repo list でリポジトリをリストアップして、その結果を --template で json の配列に整形。&lt;br /&gt;fromJSON で matrix にセットします。&lt;/p&gt;&lt;p&gt;gh 使うとこういったことが楽に実現できるので便利です。&lt;/p&gt;&lt;p&gt;今回は以上です。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/5986940545922472455/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2023/05/github-actionsorganizationowner.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5986940545922472455'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/5986940545922472455'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2023/05/github-actionsorganizationowner.html' title='【GitHub Actions】Organization/Owner 配下にあるすべてのリポジトリをマトリックスにする'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-688403406270843056</id><published>2023-04-19T22:43:00.001+09:00</published><updated>2023-04-19T22:43:10.269+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>【GitHub Actions】【reusable workflow / composite action】Enable Debug logging したときだけコンテキストをダンプする step を仕込む</title><content type='html'>&lt;p&gt;&amp;nbsp;GitHub Actions の共通アクションやワークフローを書いていると、たまに失敗したときの状態をより詳しく知りたいことがあります。&lt;br /&gt;今回はその一例として github コンテキストなど、GitHub Actions から提供されるコンテキストのデバッグログを仕込みたいと思います。&lt;/p&gt;&lt;p&gt;ところで GitHub Actions の VSCode 拡張が公式からリリースされました。&lt;br /&gt;実はこれを使うとコンテキストやワークフローの候補が出るようになるので、大変便利になりました。&lt;br /&gt;これによって、いちいちこのコンテキストからは何が参照できるんだっけな？と調べる必要が減りました。&lt;br /&gt;※ event の詳細は 2023/4 時点では候補にでなかったので、まだまだ event の詳細は&lt;a href=&quot;https://docs.github.com/ja/webhooks-and-events/webhooks/webhook-events-and-payloads&quot; target=&quot;_blank&quot;&gt;公式ドキュメント&lt;/a&gt;（webhook のドキュメントですが同じものが入ります）や&lt;a href=&quot;https://github.com/srz-zumix/gh-act/actions/workflows/events.yml&quot; target=&quot;_blank&quot;&gt;実挙動&lt;/a&gt;を見て確認する必要がありそうです&lt;/p&gt;&lt;p&gt;ワークフローを書いてる最中はどういう変数があるかはわかりますが、実際にどのような値が入ってくるのかはドキュメントなどから想像するしかありません。&lt;br /&gt;ローカル環境でワークフローを実行する &lt;a href=&quot;https://github.com/nektos/act&quot; target=&quot;_blank&quot;&gt;nektos/act&lt;/a&gt; のようなツールもありますが、これらは非公式かつ挙動が完全一致するものではないので、実際にワークフローを動かして確認するのが現時点では一番確実です。&lt;/p&gt;&lt;p&gt;私は act の gh 拡張機能（&lt;a href=&quot;https://github.com/srz-zumix/gh-act&quot; target=&quot;_blank&quot;&gt;gh-act&lt;/a&gt;）を開発しており、その動作確認をこめて&lt;a href=&quot;https://github.com/srz-zumix/gh-act/actions/workflows/events.yml&quot; target=&quot;_blank&quot;&gt;コンテキストをダンプ&lt;/a&gt;してるので参考にしてみてください。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;さて、ワークフローを開発している最中や、リポジトリ専用のワークフローであれば、なにか失敗したときの調査に役立ちますし、常にコンテキストをダンプする step を置いておけば良いかなと思ってます。（実際にそうしてることが多いです）&lt;/p&gt;

&lt;p&gt;こんな感じです&lt;/p&gt;
&lt;div class=&quot;source&quot;&gt;
  &lt;pre class=&quot;brush:yaml&quot;&gt;    steps:
    - name: $github
      env:
        GITHUB_CONTEXT: ${{ toJson(github) }}
      run: |
        echo &quot;${GITHUB_CONTEXT}&quot;
  &lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;一方、reusable workflow など共通化して多数のリポジトリから使用されるものの場合、機能とは関係のないダンプはいれづらいです。（気にしなくていいとも思ったりもしますが、なんか個人的には避けたかった）&lt;/p&gt;&lt;p&gt;&lt;br /&gt;GitHub Actions はワークフローが失敗したときに&lt;a href=&quot;https://docs.github.com/ja/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging&quot; target=&quot;_blank&quot;&gt;デバッグログを有効&lt;/a&gt;にして re-run できます。理想としてはデバッグログとしてダンプできたらいいなと思っておりました。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifdFzHn8M0B2EZM8HarSelHM0ZLeByyaF9TLHcGFA1uLK-Fdr_fxAuumhFPb6SaXhHw4ul1mA9LoZFR_CtB-m_1FimkOQd2vEVHQydDnryRfvK6SoszO89zosz8GJIFWgkUp8iY_a3_NEIgIfFlrtQvUtVY_a1GAB5PgwJTtD6pm3PXDXB78n7764l/s1328/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-04-16%2014.58.31.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;508&quot; data-original-width=&quot;1328&quot; height=&quot;244&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifdFzHn8M0B2EZM8HarSelHM0ZLeByyaF9TLHcGFA1uLK-Fdr_fxAuumhFPb6SaXhHw4ul1mA9LoZFR_CtB-m_1FimkOQd2vEVHQydDnryRfvK6SoszO89zosz8GJIFWgkUp8iY_a3_NEIgIfFlrtQvUtVY_a1GAB5PgwJTtD6pm3PXDXB78n7764l/w640-h244/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-04-16%2014.58.31.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;reusable workflow 側で&lt;a href=&quot;https://docs.github.com/ja/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging&quot; target=&quot;_blank&quot;&gt;デバッグログを有効&lt;/a&gt;にされていることをなんらかの方法で判別できればよかったのですが、環境変数やコンテキストでは判別できなさそうでした。&lt;br /&gt;ただ、デバッグログを有効にした場合、最初に紹介した $github ステップの env の設定がダンプされていることに気づきました。&lt;p&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9tbj6Jb2Mudtl_C5B0hzLrTNaKF_11i3lA8V4e6hKVIsiwVqb1Lq8DvRukTMBA-N9fp5-V_O89q0tJjD3EcWN54J-lzOKqG-ozM7N9pXck3o4j9iwryWrGC4RPTSacqd1ZgIV3KPHDlHevSn4MfNzt_CKkVsaQqP-AxrVvkNVDTuqQF36xJfv22M6/s1186/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-04-16%2015.13.31.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1046&quot; data-original-width=&quot;1186&quot; height=&quot;564&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg9tbj6Jb2Mudtl_C5B0hzLrTNaKF_11i3lA8V4e6hKVIsiwVqb1Lq8DvRukTMBA-N9fp5-V_O89q0tJjD3EcWN54J-lzOKqG-ozM7N9pXck3o4j9iwryWrGC4RPTSacqd1ZgIV3KPHDlHevSn4MfNzt_CKkVsaQqP-AxrVvkNVDTuqQF36xJfv22M6/w640-h564/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-04-16%2015.13.31.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;こんな感じ&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;そしてこの env の評価ですが、 if: false のように常に実行しないステップにしても評価はされました。&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcgrgKF6rc3rQkYylE68OnMaexF8Jk4lxN0leG1KquD8QwitWZffl78hKY9aMFA0nqXTO2GVy3BekdN451yBYWF3HemwvEO_D_xKVOiXcq_N1xOOKoVsHoBvbYHFAgVW4Geq26CiOhj4xkzNa3f7rJfDpp2y6ClfQaxxow7PGWYtICIBiSp2_tNvY0/s1216/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-04-16%2015.13.55.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1216&quot; data-original-width=&quot;1190&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjcgrgKF6rc3rQkYylE68OnMaexF8Jk4lxN0leG1KquD8QwitWZffl78hKY9aMFA0nqXTO2GVy3BekdN451yBYWF3HemwvEO_D_xKVOiXcq_N1xOOKoVsHoBvbYHFAgVW4Geq26CiOhj4xkzNa3f7rJfDpp2y6ClfQaxxow7PGWYtICIBiSp2_tNvY0/w626-h640/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-04-16%2015.13.55.png&quot; width=&quot;626&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;先程と同じ用に見えますが、前者は ✔ マークアイコンですが、後者は / マークでスキップされていることがわかります。&lt;/div&gt;


&lt;p&gt;ここでようやく結論、タイトル回収です。&lt;br /&gt;「if: false で常に実行しないステップを用意し、知りたい情報を env にセットしておく」&lt;br /&gt;こうすることでデバッグログを有効にしたときだけ github コンテキストの内容を確認できました。この方法は github コンテキストに限らず使えます。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;今回は以上です。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/688403406270843056/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2023/04/github-actionsreusable-workflow.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/688403406270843056'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/688403406270843056'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2023/04/github-actionsreusable-workflow.html' title='【GitHub Actions】【reusable workflow / composite action】Enable Debug logging したときだけコンテキストをダンプする step を仕込む'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifdFzHn8M0B2EZM8HarSelHM0ZLeByyaF9TLHcGFA1uLK-Fdr_fxAuumhFPb6SaXhHw4ul1mA9LoZFR_CtB-m_1FimkOQd2vEVHQydDnryRfvK6SoszO89zosz8GJIFWgkUp8iY_a3_NEIgIfFlrtQvUtVY_a1GAB5PgwJTtD6pm3PXDXB78n7764l/s72-w640-h244-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-04-16%2014.58.31.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-2211924148114538603</id><published>2023-02-22T10:05:00.001+09:00</published><updated>2023-05-01T14:36:59.601+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>GitHub Actions で停止してしまったスケジュールワークフローをリストアップする</title><content type='html'>&lt;p&gt;メインブランチに更新がない状態が続くとスケジュールで動くワークフローは無効化されます。&lt;br /&gt;無効化される前に通知が来てリンクからワークフローのページを開いて「Enable workflow」を押す必要があるのですが、わりと忘れがちでいつの間にかワークフローが止まっていることがありました。&lt;br /&gt;そして無効になってしまったあとは特に通知も来ないので、たまたま見に行ったときに気づくことがほとんど。&lt;br /&gt;無効になってしまったワークフローを一覧できたらなーと思っていたのですが、gh でできそうだったのでやってみました。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;一覧&lt;/h5&gt;
&lt;pre class=&quot;console&quot;&gt;gh repo list --json nameWithOwner --jq .[].nameWithOwner | xargs -I {} sh -c &quot;echo {}; gh workflow list -a -R {} | grep disabled&quot;&lt;/pre&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBOwR1SSJW-Ai3oYS126dFDO84gqCvIB1d6sMI1uM8dQO8Uc8eZAVnQGNvY2OR1dyxiEyICeoUPWso7cJuMo935Fjpqwme2fkL0bLPgDcrvE1M72wOCfoZTwNAVuigcN1EuKJ5ErliMmVrCqsUG1bl_0HFfh4a0zg4Ufwp5f6NVZDcekkA7jxewsZ7/s2104/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-02-16%2022.44.45.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;608&quot; data-original-width=&quot;2104&quot; height=&quot;184&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBOwR1SSJW-Ai3oYS126dFDO84gqCvIB1d6sMI1uM8dQO8Uc8eZAVnQGNvY2OR1dyxiEyICeoUPWso7cJuMo935Fjpqwme2fkL0bLPgDcrvE1M72wOCfoZTwNAVuigcN1EuKJ5ErliMmVrCqsUG1bl_0HFfh4a0zg4Ufwp5f6NVZDcekkA7jxewsZ7/w640-h184/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-02-16%2022.44.45.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;無効になっているワークフローは&amp;nbsp;disabled_inactivity ステータスになっているのでリポジトリリストからワークフローリストを取得して grep しています。&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;Web で開く&lt;/h5&gt;
&lt;pre class=&quot;console&quot;&gt;gh repo list --json nameWithOwner --jq .[].nameWithOwner | xargs -I {} sh -c &quot;echo {}; gh workflow list -a -R {} | grep disabled | grep -oe [0-9]*$ | xargs -I WID gh workflow view -R {} WID --web&quot;&lt;/pre&gt;
&lt;p&gt;「名前 ステータス ワークフローID」が出力されるので末尾の ワークフローID を取得してブラウザで開くコマンドを呼び出します。&lt;br /&gt;&lt;br /&gt;無効になっているワークフローのページが開くのでそこで「Enable workflow」ボタンを押せば有効に戻せます。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDEEN8R8wKDkT-YmR-chPzkuUcmYE3sk-D1WtaFN95FFXy0RfxCldELpKbnmBJLlN-mgxnjzbvlfJxwEkmPBdKHzPf9aUc9rcJykjfBFyEGZockcBjmY3ylBuiGNaFXTM-Iw3FrQ2QmeNe386qK_vGMgpM7S9hn04z0b21leyyT_7x8PrPc1nrrREl/s1070/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-02-16%2015.34.32.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;472&quot; data-original-width=&quot;1070&quot; height=&quot;282&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDEEN8R8wKDkT-YmR-chPzkuUcmYE3sk-D1WtaFN95FFXy0RfxCldELpKbnmBJLlN-mgxnjzbvlfJxwEkmPBdKHzPf9aUc9rcJykjfBFyEGZockcBjmY3ylBuiGNaFXTM-Iw3FrQ2QmeNe386qK_vGMgpM7S9hn04z0b21leyyT_7x8PrPc1nrrREl/w640-h282/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-02-16%2015.34.32.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;h5 class=&quot;subhead&quot;&gt;Enable にする&lt;/h5&gt;
&lt;pre class=&quot;console&quot;&gt;gh repo list --json nameWithOwner --jq .[].nameWithOwner | xargs -I {} sh -c &quot;echo {}; gh workflow list -a -R {} | grep disabled | grep -oe [0-9]*$ | xargs -I WID gh workflow enable -R {} WID&quot;&lt;/pre&gt;
&lt;p&gt;gh workflow enable でワークフローをコマンドラインから有効にすることもできるので、Web で開く部分を少し変えればワンライナーで全リポジトリのワークフローを有効に戻せます。&lt;/p&gt;&lt;p&gt;今回は以上です。では。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/2211924148114538603/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2023/02/github-actions.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/2211924148114538603'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/2211924148114538603'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2023/02/github-actions.html' title='GitHub Actions で停止してしまったスケジュールワークフローをリストアップする'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBOwR1SSJW-Ai3oYS126dFDO84gqCvIB1d6sMI1uM8dQO8Uc8eZAVnQGNvY2OR1dyxiEyICeoUPWso7cJuMo935Fjpqwme2fkL0bLPgDcrvE1M72wOCfoZTwNAVuigcN1EuKJ5ErliMmVrCqsUG1bl_0HFfh4a0zg4Ufwp5f6NVZDcekkA7jxewsZ7/s72-w640-h184-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-02-16%2022.44.45.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-1898186949722648896</id><published>2023-01-18T10:03:00.001+09:00</published><updated>2023-01-18T10:03:29.175+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ansible"/><category scheme="http://www.blogger.com/atom/ns#" term="shell"/><title type='text'>Ansible で実行中の bash script を上書きしても大丈夫なのか試してみた</title><content type='html'>&lt;p&gt;表題どおりです。&lt;br /&gt;1年くらい前の話題ですが、アドベントカレンダーに空きがあれば投稿しようと思って書いてました。&lt;br /&gt;自分の dotfiles のインストールを ansible に少し移していこうとしてる repo で試しました。&lt;/p&gt;&lt;p&gt;結論は ansible のモジュールを使っていれば大丈夫です。&lt;br /&gt;（モジュール内で適切に処理されてない可能性はありえるが、それはほぼないと思っていいのではないかと思います）&lt;br /&gt;&lt;/p&gt;&lt;p&gt;詳細は repo を参照してください。&lt;br /&gt;&lt;a href=&quot;https://github.com/srz-zumix/ansible_dotfiles/tree/main/roles/bash-cp-test&quot; target=&quot;_blank&quot;&gt;https://github.com/srz-zumix/ansible_dotfiles/tree/main/roles/bash-cp-test&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/1898186949722648896/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2023/01/ansible-bash-script.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1898186949722648896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1898186949722648896'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2023/01/ansible-bash-script.html' title='Ansible で実行中の bash script を上書きしても大丈夫なのか試してみた'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-8585142458981736542</id><published>2022-12-27T10:19:00.001+09:00</published><updated>2022-12-27T10:19:12.950+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>GitHub Actions の Composite Action で post 処理を実現する方法の訂正</title><content type='html'>&lt;p&gt;&lt;a href=&quot;https://srz-zumix.blogspot.com/2022/08/github-actions-composite-action-post.html&quot; target=&quot;_blank&quot;&gt;GitHub Actions の Composite Action で post 処理を実現する方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;こちらの記事で「./」でパス指定すれば OK って書いたのですが、これは自分自身をチェックアウトしてたのでできたことでした。&lt;br /&gt;このアクションを使う場合はアクションの実体は&amp;nbsp;GITHUB_ACTION_PATH 環境変数の指す場所にあり、uses をパス指定する場合は workspace からの相対パスになるのでこの方法ではダメというわけです。&lt;br /&gt;&lt;br /&gt;uses で env は使えないので（静的に解決される必要があるかな？使えれば env. GITHUB_ACTION_PATH で良かったのですが）、workspace の .github/ 配下に post-action のシンボリックリンクを貼って、そのパスを指定するようにしました。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/srz-zumix/setup-service-jenkins/pull/27&quot; target=&quot;_blank&quot;&gt;https://github.com/srz-zumix/setup-service-jenkins/pull/27&lt;br /&gt;&lt;/a&gt;&lt;br /&gt;ちょっと微妙な感じもしますが、他に回避方法思いつかなかったのでこうしました。&lt;br /&gt;composite action でも早く post 処理できるようになるといいなー。&lt;br /&gt;（post action 用の repo or branch 用意するのも考えたけど、コードが分離するのが嫌だったのでやめました。でも、指定したパスの shell script を post 処理で実行するだけの action はあってもいいかなーと思いました。）&lt;/p&gt;&lt;p&gt;以上。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/8585142458981736542/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2022/12/github-actions-composite-action-post.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/8585142458981736542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/8585142458981736542'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2022/12/github-actions-composite-action-post.html' title='GitHub Actions の Composite Action で post 処理を実現する方法の訂正'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-1497080152600590819</id><published>2022-12-15T00:22:00.002+09:00</published><updated>2022-12-15T00:22:40.705+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AdventCalendar"/><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>Git に Contribute してみた</title><content type='html'>&lt;p class=&quot;refbox&quot;&gt;この記事は「&lt;a href=&quot;https://qiita.com/advent-calendar/2022/git&quot; target=&quot;_blank&quot;&gt;Gitのカレンダー | Advent Calendar 2022 - Qiita&lt;/a&gt;」の 15日目の記事です。&lt;/p&gt;&lt;p&gt;Git そのものの修正を出したい、手順ってどうすればいいんだろ？&lt;br /&gt;と検索しても GitHub で OSS に貢献（Contribute）する方法みたいなのがヒットして役に立たず。&lt;br /&gt;結局、公式の英語文とにらめっこして Contribute したので備忘録です。&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;はじめに&lt;/h5&gt;

&lt;p&gt;出した PR はこちら&lt;br /&gt;&lt;a href=&quot;https://github.com/gitgitgadget/git/pull/1406&quot; target=&quot;_blank&quot;&gt;https://github.com/gitgitgadget/git/pull/1406&lt;/a&gt;&lt;/p&gt;&lt;p&gt;そしてこの修正が含まれた Git 2.39 がリリースされました。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.blog/2022-12-12-highlights-from-git-2-39/&quot; target=&quot;_blank&quot;&gt;Highlights from Git 2.39 | The GitHub Blog&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;https://lore.kernel.org/git/xmqqlencspnl.fsf@gitster.g/&quot; target=&quot;_blank&quot;&gt;[ANNOUNCE] Git v2.39.0 - Junio C Hamano&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Changes にアカウント名が載ってましたねぇ。嬉しい。&lt;br /&gt;&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;Contribute 方法&lt;/h5&gt;

&lt;p&gt;さて、まずはじめに Git はよくある OSS のように GitHub での Pull Request を出したらレビューされて Approve されたらマージされる。というフローではありません。&lt;br /&gt;基本的にメーリングリストにパッチを送る形式のようです。&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/git/git/blob/master/.github/CONTRIBUTING.md&quot; target=&quot;_blank&quot;&gt;CONTRIBUTING.md&lt;/a&gt;&lt;/p&gt;&lt;p&gt;ただ、メーリングリストは自分もそう感じましたが非常にハードルが高いです。（英語だし）&lt;br /&gt;そこで私は GitGitGadget に PR を出す方法で Contribute してみました。&lt;br /&gt;やり方はドキュメントをたどっていけばわかりますが、日本語情報がなかったので、かなり慎重になりました。&lt;br /&gt;&lt;br /&gt;ドキュメントはこちら&amp;nbsp;&lt;a href=&quot;https://git-scm.com/docs/MyFirstContribution&quot; target=&quot;_blank&quot;&gt;MyFirstContribution&lt;/a&gt;&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;修正をする&lt;/h5&gt;

&lt;p&gt;修正するまでは他 OSS の場合とあまり変わらないですが、まず&amp;nbsp;&lt;a href=&quot;https://github.com/gitgitgadget/git&quot; target=&quot;_blank&quot;&gt;gitgitgadget/git&lt;/a&gt;&amp;nbsp;に PR 出すのでこちらから fork しましょう。&lt;br /&gt;修正したらビルドして動作確認、テストをすることになります。&lt;br /&gt;この辺は README 読めばわかると思うので省略。&lt;br /&gt;ちなみに今回の PR は1行修正であることと、テストってどうやる？どうやってる？って感じの内容だったのでやってません。&lt;br /&gt;（実際にはやったけど自分の環境では修正と関係ないところがパスしなかった。PR 出すとテストされるのでそっちに任せました。ごめんなさい）&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;コミットをする&lt;/h5&gt;

&lt;p&gt;変更できたら、次は commit します。&lt;br /&gt;ここは少し注意が必要です。コミットメッセージは当然英語ですが、そこは頑張ってください。&lt;/p&gt;&lt;p&gt;1つ目は git commit に --signoff (-s) をつける必要がある点です。このオプションを付けるとメッセージに「Signed-off-by: &amp;lt;user.email&amp;gt;」のメッセージが追加されます。&lt;br /&gt;これが必須なので普段つけてない人は気をつけましょう。&lt;/p&gt;&lt;p&gt;2つ目は commit メッセージのフォーマットが決まっている点です。&lt;br /&gt;.editorconfig で1行あたりの文字数が設定されているので、.editorconfig 対応してるエディタでコミットメッセージを編集するのをおすすめします。&lt;br /&gt;コミットメッセージの1行目は変更対象のコンポーネント名を含む 50 文字以下で概要を書きます。&lt;br /&gt;1行空行を空けたあとに、変更の詳細を書きます。&lt;br /&gt;詳細には、コード差分からは読み取れない部分を書くことが重要です。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;自分の場合、今回はとにかくメッセージの部分に時間を取られましたが、過去の commit のメッセージを参考にしてシンプルな日本語文章を書いてから、少しずつ翻訳ツールを使って英語のメッセージにしました。&lt;br /&gt;（普段英語できないのにテキトーな英語使ってたが、今回はかなり気を使った。。）&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;プルリクエストを出す&lt;/h5&gt;

&lt;p&gt;commit したらプルリクエスト（PR）を出します。&lt;br /&gt;PR を出す先は&amp;nbsp;&lt;a href=&quot;https://github.com/gitgitgadget/git&quot; target=&quot;_blank&quot;&gt;gitgitgadget/git&lt;/a&gt;&amp;nbsp;なので気をつけてください。&lt;br /&gt;やり方はこちらに記載されています。&lt;br /&gt;&lt;a href=&quot;https://git-scm.com/docs/MyFirstContribution#send-pr-ggg&quot; target=&quot;_blank&quot;&gt;https://git-scm.com/docs/MyFirstContribution#send-pr-ggg&lt;/a&gt;&lt;/p&gt;&lt;p&gt;PR の内容はメーリングリストに流れるカバーレターのタイトルと本文になるので、こちらもドキュメントを参考に書きましょう。&lt;br /&gt;&lt;br /&gt;カバーレターについてはこちらに記載されているので、これを参考に PR のタイトルと本文を記載します。&lt;br /&gt;&lt;a href=&quot;https://git-scm.com/docs/MyFirstContribution#cover-letter&quot; target=&quot;_blank&quot;&gt;https://git-scm.com/docs/MyFirstContribution#cover-letter&lt;/a&gt;&lt;/p&gt;&lt;p&gt;今回のように修正が 1 commit であれば、commit の概要をタイトルにしても良いと思います。&lt;br /&gt;説明文のほうは、commit や commit メッセージでは読み取れない補足情報を書きます。&lt;br /&gt;今回は簡単な内容説明と再現条件を記載しました。&lt;/p&gt;&lt;p&gt;これも過去の PR を参考にすると良いかもしれません。&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;PR 後の対応&lt;/h5&gt;

&lt;p&gt;PR を作成すると bot からのメッセージが投稿されます。&lt;br /&gt;こちらにも Contribute 方法について書かれてます。&lt;br /&gt;それに記載されてますが、初めて Contribute する場合は許可された GitHub ユーザー名にないため、すでに許可されたユーザーから /allow のコメントをもらう必要があります。&lt;br /&gt;&lt;br /&gt;自分の場合は幸運なことに特になにもせずとも /allow されました。&lt;br /&gt;もし /allow されない場合は issues から /allow コメントを出してる人を探すといいそうです。&lt;br /&gt;&lt;/p&gt;
&lt;span class=&quot;pale&quot;&gt;（すでに /allow されたユーザーなら誰でも /allow できるっぽいので今度は自分が /allow できるってことか。つまり私に /allow してーと頼むことも可能ってことか。）&lt;/span&gt;
&lt;p&gt;次に /submit コメントを書くと、PR の内容がメーリングリストに投稿されます。&lt;br /&gt;が、その前に /preview で投稿されるメールを確認できるので、しておきましょう。&lt;br /&gt;GitHub に登録してるメールにプレビューメールが届きます。&lt;br /&gt;内容に問題がなければ /submit コメントを送ります。&lt;/p&gt;&lt;p&gt;メーリングリストの返信や patch のステータスなどがボットにより自動で PR に送られてきます。&lt;br /&gt;メーリングリストで修正依頼や質問などが来たら返信する必要がありますが、今回は特に眺めてるだけで取り込まれました。（軽微な修正でしたので）&lt;br /&gt;ドキュメントにそのようなケースの対応方法も書いてあったので、たぶんそれを見ながら対応すれば大丈夫だと思います。（経験しなかったので省略）&lt;/p&gt;&lt;p&gt;あとは勝手に進んだのであまり知見として得るものはなかったのですが、待っていたら master に取り込まれて PR は close になります。&lt;br /&gt;（PR は merge されず close になります。取り込まれたかどうかは label でわかりそうです）&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;最後に&lt;/h5&gt;

&lt;p&gt;最後の方は待ってるだけで、これなにもしなくていいのかな？認識間違ってるかな？と不安にもなったのですが、結果的に取り込まれてそれがリリースされたのでとっても嬉しいです。&lt;br /&gt;なんか、Git そのものに Contribute するというのはちょっと特別感がある気がします。&lt;br /&gt;&lt;br /&gt;Git 自体の修正って大変そう。難しそうというイメージがありましたが、今回の PR 内容は調べてみたらそんなに難しい修正じゃなかったです。みなさんも普段 Git を使っていてなんか変だな？バグかな？と思ったら Contribute にチャレンジしてみてはいかがでしょうか？&lt;/p&gt;&lt;p&gt;とりあえずあまり有益な記事じゃないかもしれませんが、怖くないよってことが伝われば幸いです。ではでは。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/1497080152600590819/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2022/12/git-contribute.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1497080152600590819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/1497080152600590819'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2022/12/git-contribute.html' title='Git に Contribute してみた'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-7706965835975785622</id><published>2022-11-24T22:10:00.001+09:00</published><updated>2022-11-24T22:10:18.218+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Make formerly Integromat"/><title type='text'>【Make formerly Integromat】Twitter でいいねした画像を自動でクラウドストレージに保存する</title><content type='html'>&lt;p&gt;最近、お絵かきをしたいなと思ってちょこちょこ描いてるのですが、今は昔よりも簡単に上達するための手法や、Twitter の投稿でお手本を見られるので、思っていたよりうまくなった気がしてます（自己満）&lt;br /&gt;まぁまだまだ下手くそなんですけどね。それでも昔のなんかうまく描けないって感じの絵からは脱却できたと思う。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;はい。ここまでがまっとうな言い訳なんですが、Twitter でこのひとの絵上手だな、この構図いいな、こんな塗り方もあるのね、といいねした画像がいっぱいあるのですが、参考にしたいなというときにいいねを遡るのは大変なので保存することにしました。&lt;br /&gt;（決して助平心の極みではありません）&lt;/p&gt;&lt;p&gt;では早速シナリオへ&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRK6FmVqBF_2rg-XVs_3fBpoBM8MsXnhsU8so15nz1L0ViWVPLaIATRacyzObeYfjd439s43GpTp3eORf4YUeSdIne-wHBik4ICaoR9Zj4iMP0rZd0rPx2agMWlIZFEE_gXlV4eMhNRQ04Qb95RKyUV-lYb3KGI2lASrfD2j_5TbqOw-3GLEmVk4J/s1988/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-27%2023.32.44.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1018&quot; data-original-width=&quot;1988&quot; height=&quot;328&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRK6FmVqBF_2rg-XVs_3fBpoBM8MsXnhsU8so15nz1L0ViWVPLaIATRacyzObeYfjd439s43GpTp3eORf4YUeSdIne-wHBik4ICaoR9Zj4iMP0rZd0rPx2agMWlIZFEE_gXlV4eMhNRQ04Qb95RKyUV-lYb3KGI2lASrfD2j_5TbqOw-3GLEmVk4J/w640-h328/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-27%2023.32.44.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;シナリオは 4 つのモジュールだけなので簡単な方です。&lt;br /&gt;まずはじめにトリガーになる Twitter モジュールです。&lt;br /&gt;&lt;b&gt;※Twitter モジュールを使用するので有料プランが必要&lt;/b&gt;です。&lt;/p&gt;&lt;div&gt;トリガーは毎時設定で、「List Likes」モジュールで最大5件取得するようにしています。&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimy4CBHbT8RMbNtaQUyMaQUNXJ9miaM3QzAM5E8POsUzPLAlgwXM_Iy14_A7HMmO9nUV416z_FPKffGq6mx7049XifEdHJ6RnPNJAD2u_uAnLjMj5N7Ye0BOpIgDKJYD4ST1XnOS2S-0glJ05odCQPGeR0nHlOC6eNteot42sbD7wJadm5UXwOUnvz/s1160/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%200.16.52.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1036&quot; data-original-width=&quot;1160&quot; height=&quot;286&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimy4CBHbT8RMbNtaQUyMaQUNXJ9miaM3QzAM5E8POsUzPLAlgwXM_Iy14_A7HMmO9nUV416z_FPKffGq6mx7049XifEdHJ6RnPNJAD2u_uAnLjMj5N7Ye0BOpIgDKJYD4ST1XnOS2S-0glJ05odCQPGeR0nHlOC6eNteot42sbD7wJadm5UXwOUnvz/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%200.16.52.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijN4vNz7KD0nPZNSO85DWIg8fTpJ2BsBKOmkQ2hbpTFb4SceE7C3QSAM346bYu4zrbgSvVsd5YgJXHTpD2A1Bn7rJIAOlub-krv14Wn9KnpLa6LCv-c6XdWjOdJg6timkZFwzUocFl5qW1NHw07g6HufXrvhlYW4_plOGtkKYbGNXk26Sx9DzqoCP4/s1406/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%200.16.40.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1406&quot; data-original-width=&quot;1378&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijN4vNz7KD0nPZNSO85DWIg8fTpJ2BsBKOmkQ2hbpTFb4SceE7C3QSAM346bYu4zrbgSvVsd5YgJXHTpD2A1Bn7rJIAOlub-krv14Wn9KnpLa6LCv-c6XdWjOdJg6timkZFwzUocFl5qW1NHw07g6HufXrvhlYW4_plOGtkKYbGNXk26Sx9DzqoCP4/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%200.16.40.png&quot; width=&quot;314&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;When to start を過去からにしたら昔のいいねを順次5件ずつ処理されます。&lt;br /&gt;（全件は取得できないです。ページング対応してないからと思われます）&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both;&quot;&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvDz0UBaKi1Nr9k6wNjpfUACpTyetRjHeMzqdOcMFPc57DUUeCvsQOa3-KuWJebdDingDv3Cqur0qUYcTGylDuKQNjNXnkWUD0kw9OfrkFHvmAnDEmvNkMFnxbc8dO2_XeYLD8-qTMJpHcr9ku8fQHEvpNWArmdYtKTw-1JFNujK8D30OQAWe2BKNA/s1428/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%200.19.09.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;734&quot; data-original-width=&quot;1428&quot; height=&quot;164&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvDz0UBaKi1Nr9k6wNjpfUACpTyetRjHeMzqdOcMFPc57DUUeCvsQOa3-KuWJebdDingDv3Cqur0qUYcTGylDuKQNjNXnkWUD0kw9OfrkFHvmAnDEmvNkMFnxbc8dO2_XeYLD8-qTMJpHcr9ku8fQHEvpNWArmdYtKTw-1JFNujK8D30OQAWe2BKNA/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%200.19.09.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次の Iterator ですが、これは１ツイートに複数の画像がついている場合があるので「Extended entities: Media[]」配列をループさせてます。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT66zizLKnfq8KhuDxhsfOf_1aQpTfX2mbma47t0jEVdHhQeP0f5_SWHpiIlAl3Yu-CSYAj6fDF2x42Xg9wsoURhF1A8x5eBYXqsuTnDoZ7QbyF5ZVV32ilZocqSXWn6nBraHx9hbiGRxkpuMoDAXp7VG5zP-fyX9MoKQBhsjmBehoxi0hKBqkwUIb/s1494/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%2019.31.51.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;720&quot; data-original-width=&quot;1494&quot; height=&quot;154&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjT66zizLKnfq8KhuDxhsfOf_1aQpTfX2mbma47t0jEVdHhQeP0f5_SWHpiIlAl3Yu-CSYAj6fDF2x42Xg9wsoURhF1A8x5eBYXqsuTnDoZ7QbyF5ZVV32ilZocqSXWn6nBraHx9hbiGRxkpuMoDAXp7VG5zP-fyX9MoKQBhsjmBehoxi0hKBqkwUIb/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%2019.31.51.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;次の HTTP モジュールで取得した画像 URL からファイルをダウンロード&lt;/div&gt;&lt;div&gt;最後にダウンロードしたファイルを Dropbox モジュールでアップロードしてます。&lt;/div&gt;&lt;div&gt;アップロード先は好みで変えてください。&lt;/div&gt;&lt;div&gt;（サービスのモジュールがない場合は HTTP モジュールで頑張るか、FTP や SFTP モジュールになると思います）&lt;br /&gt;ファイル名は複数枚画像があった場合に同じファイル名にならないように Iterator からインデックスを取って名前に含めるようにしています。&lt;br /&gt;今回は単純にツイートIDをファイル名に含めるだけにしていますが、Twitter モジュールからツイートの情報が取れるので必要に応じて情報を残すと良いと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPPwpy-iItQVWIETSo56rgF9VG_w_ny92XUmJX1Cq5i63QLjcmWB5uKordC6pat8GBuquVtLRLYTVu4dkXy_TjnTr2FPW3rYZwDm1KgpYwbasXUG26JTB-eSpQAUfLdRgy2xrlypALVXCv4i-YCQXBTENmUxInDlb8jEQzR08Jilu3RhWNG1tAm2Eu/s1508/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%2019.31.18.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1350&quot; data-original-width=&quot;1508&quot; height=&quot;358&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPPwpy-iItQVWIETSo56rgF9VG_w_ny92XUmJX1Cq5i63QLjcmWB5uKordC6pat8GBuquVtLRLYTVu4dkXy_TjnTr2FPW3rYZwDm1KgpYwbasXUG26JTB-eSpQAUfLdRgy2xrlypALVXCv4i-YCQXBTENmUxInDlb8jEQzR08Jilu3RhWNG1tAm2Eu/w400-h358/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-28%2019.31.18.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;実際に運用している Dropbox はこんな感じです。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimk-x4loZzVS2-DVms9-CXq19iwKq6mHglKb-SHba1YnLVmm1ORtbexOmXkDmcaCk5SjmGr87FXEGG0MV8wOr2Mog5PLAalXiA1TLBhZXQ6OrZQczVX02-J7To7h-6CUed8xpLb_laOHHC05ZrmXxcRZ1PahDQvAOTrQzk5adqOxLBmMtX4QWHnC8i/s1920/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-09-01%203.27.08.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1440&quot; data-original-width=&quot;1920&quot; height=&quot;240&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimk-x4loZzVS2-DVms9-CXq19iwKq6mHglKb-SHba1YnLVmm1ORtbexOmXkDmcaCk5SjmGr87FXEGG0MV8wOr2Mog5PLAalXiA1TLBhZXQ6OrZQczVX02-J7To7h-6CUed8xpLb_laOHHC05ZrmXxcRZ1PahDQvAOTrQzk5adqOxLBmMtX4QWHnC8i/s320/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-09-01%203.27.08.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;いいねしておいたら勝手に保存されるので、どんどんいいねしちゃいますね！&lt;/div&gt;&lt;div&gt;ではでは。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/7706965835975785622/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2022/11/make-formerly-integromattwitter.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/7706965835975785622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/7706965835975785622'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2022/11/make-formerly-integromattwitter.html' title='【Make formerly Integromat】Twitter でいいねした画像を自動でクラウドストレージに保存する'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRK6FmVqBF_2rg-XVs_3fBpoBM8MsXnhsU8so15nz1L0ViWVPLaIATRacyzObeYfjd439s43GpTp3eORf4YUeSdIne-wHBik4ICaoR9Zj4iMP0rZd0rPx2agMWlIZFEE_gXlV4eMhNRQ04Qb95RKyUV-lYb3KGI2lASrfD2j_5TbqOw-3GLEmVk4J/s72-w640-h328-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-08-27%2023.32.44.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-4858712205949819832</id><published>2022-11-10T09:28:00.001+09:00</published><updated>2022-11-10T09:28:02.097+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git"/><title type='text'>git で新規ブランチ作成時の typo を防ぐ</title><content type='html'>&lt;p&gt;&amp;nbsp;あまり実用的ではないものの参考までに紹介します。&lt;br /&gt;（というのも最近趣味プログラミングしてなくてネタがない・・）&lt;/p&gt;&lt;p&gt;git でブランチ作成するときに feature って名前をつけることがよくあると思いますが、&lt;br /&gt;これを typo して faeture だったり featrue だったりで push してしまうことがあります。&lt;/p&gt;&lt;p&gt;ただの名前だしまあそんなに気にしなくても。。と思いますが、&lt;br /&gt;ブランチ切替時の入力補完が f や feat とかで止まってしまって1手順増えてしまいます。&lt;/p&gt;&lt;p&gt;たかが1手順とはいえ、体験すると割とストレスだし、開発メンバー全員に影響があることなので実は思っている以上に生産性を下げてしまっている。かもしれません。&lt;br /&gt;（体感です。計測してるわけじゃないです。）&lt;/p&gt;&lt;p&gt;トイルといえるかもしれませんね。&lt;br /&gt;スケールもすると思うので、改善のコスパは良い気がします。&lt;/p&gt;&lt;p&gt;。。少し脱線しましたが、本題へ&lt;/p&gt;&lt;p&gt;commit メッセージの typo チェックはよくあるけど、ブランチ名の typo チェックはあまり聞きません。&lt;br /&gt;ブランチ作成時の hook はなさそうだったので、多くの人が作ってるであろうブランチ作成の alias に手を加える方法にしました。&lt;/p&gt;


&lt;h5 class=&quot;subhead&quot;&gt;typo 修正付きブランチ作成 alias&lt;/h5&gt;
&lt;p&gt;できた alias はこちらです。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;pre class=&quot;console&quot;&gt;[alias]
  cob = &quot;!f(){ echo $1 | sed &#39;s|/| |g&#39; | typos - -w | sed &#39;s| |/|g&#39; | xargs -I% git switch -c %;};f&quot;
  &lt;/pre&gt;

&lt;p&gt;こうなります。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpU8-YHWglquFuzvNGS6avTrdLyQrQVcNYaNvK2SDHolYJfqn59-BJMJ5qOzhUEDDb2GuXRAuWDfhgU4YxI12wReudf2zDOdtFOHeQRJJrPUEurP-xpGkyOye-Xek9fbIJW3OsioJkeSJvIlw6ouMo9oR1dK3H9gGoETz68R99TIKJHrcucGWHDMPk/s628/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-11-07%2022.09.05.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;150&quot; data-original-width=&quot;628&quot; height=&quot;95&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpU8-YHWglquFuzvNGS6avTrdLyQrQVcNYaNvK2SDHolYJfqn59-BJMJ5qOzhUEDDb2GuXRAuWDfhgU4YxI12wReudf2zDOdtFOHeQRJJrPUEurP-xpGkyOye-Xek9fbIJW3OsioJkeSJvIlw6ouMo9oR1dK3H9gGoETz68R99TIKJHrcucGWHDMPk/w400-h95/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-11-07%2022.09.05.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;h5 class=&quot;subhead&quot;&gt;typo チェックツール&lt;/h5&gt;
&lt;p&gt;今回使った typo チェックツールは &lt;a href=&quot;https://github.com/crate-ci/typos&quot; target=&quot;_blank&quot;&gt;typos&lt;/a&gt; です。&lt;br /&gt;他に misspell も使ってみたのですが、feature の typo のいずれのパターンも修正できなかったので typos にしました。&lt;/p&gt;&lt;p&gt;typos は feature_test は分解してチェックしてくれますが、feature/test は分解されなかったので、sed で一度スラッシュを空白に変換してます。&lt;br /&gt;空白にしたのは typos のあとでもとに戻すときに、都合が良いからです。&lt;br /&gt;（_ だともともと _ だったものも / にしてしまう）&lt;/p&gt;&lt;p&gt;ちなみに typos でも faeture は feature になおしてくれますが、featrue はダメでした。&lt;br /&gt;辞書とかあれば改善するかもしれませんが、今回はネタレベルで書いた alias なのでパスします。&lt;/p&gt;

&lt;h5 class=&quot;subhead&quot;&gt;最後に&lt;/h5&gt;
&lt;p&gt;こういったちょっとした手間でもスケールすれば効果は大きくなります。&lt;br /&gt;最近は自称 SRE として改善を生業としてますが、こういったお遊びも役に立つことがあるでしょう。&lt;/p&gt;&lt;p&gt;以上。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/4858712205949819832/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2022/11/git-typo.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/4858712205949819832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/4858712205949819832'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2022/11/git-typo.html' title='git で新規ブランチ作成時の typo を防ぐ'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpU8-YHWglquFuzvNGS6avTrdLyQrQVcNYaNvK2SDHolYJfqn59-BJMJ5qOzhUEDDb2GuXRAuWDfhgU4YxI12wReudf2zDOdtFOHeQRJJrPUEurP-xpGkyOye-Xek9fbIJW3OsioJkeSJvIlw6ouMo9oR1dK3H9gGoETz68R99TIKJHrcucGWHDMPk/s72-w400-h95-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-11-07%2022.09.05.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-3223226197212248878</id><published>2022-10-18T10:35:00.000+09:00</published><updated>2022-10-18T10:35:00.887+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub"/><category scheme="http://www.blogger.com/atom/ns#" term="GitHub Actions"/><title type='text'>【GitHub Actions】コンテキストダンプのススメ</title><content type='html'>&lt;p&gt;GitHub Actions では github や job などのコンテキストから git の状態や PR の内容、ジョブの情報などが取得できます。&lt;br /&gt;これらを利用してステップの条件をつけたり、処理を変えたりなどができます。&lt;br /&gt;さて、このコンテキストですがどういったものがあるのかは、ドキュメントで確認できます。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://docs.github.com/ja/actions/learn-github-actions/contexts&quot; target=&quot;_blank&quot;&gt;コンテキスト - GitHub Docs&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;ただ、実際にどういった値が入っているかまではわからないですし、ランナーやジョブによって当然値は変化します。&lt;br /&gt;なので、コンテキストをダンプするための repository を用意しておくととても便利です。&lt;br /&gt;私は&amp;nbsp;&lt;a href=&quot;https://github.com/srz-zumix/ci-specs&quot; target=&quot;_blank&quot;&gt;ci-spec&lt;/a&gt; repository でいろいろなイベントトリガーでダンプできるようにしてあります。&lt;br /&gt;&lt;a href=&quot;https://github.com/srz-zumix/ci-specs/blob/master/.github/workflows/events.yml&quot; target=&quot;_blank&quot;&gt;https://github.com/srz-zumix/ci-specs/blob/master/.github/workflows/events.yml&lt;/a&gt;&lt;br /&gt;この情報って取れるのかな？って探すことが結構あるので重宝してます。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdUZvubCI58lmYc1QYPPz6TDmSFqCLujoV5NbYBntMvE2CmrTQJbXs21XwQQi86kyyMMAIUb3_Z5ECQYqqNVUjRtnOYU7VonIl9d7ZYA6iiFy0wzwiHxVZgCUXjimo6pXCgbGhz601JHkwyAP_u-A_QnRavNmOsUkezBU7Nn6MAv0nZf1ouW3wnat3/s1918/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-03%2012.01.21.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1214&quot; data-original-width=&quot;1918&quot; height=&quot;203&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdUZvubCI58lmYc1QYPPz6TDmSFqCLujoV5NbYBntMvE2CmrTQJbXs21XwQQi86kyyMMAIUb3_Z5ECQYqqNVUjRtnOYU7VonIl9d7ZYA6iiFy0wzwiHxVZgCUXjimo6pXCgbGhz601JHkwyAP_u-A_QnRavNmOsUkezBU7Nn6MAv0nZf1ouW3wnat3/w320-h203/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-03%2012.01.21.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEYthMLQmFtM0sOeM-H2OW8KfzR_00V2u_UINuDnMMsTFJthg7RKuSUnq8uY7CQmZLDKmYWwdqgAr5fNbUJzLbpC8xKR_j__221lpWP3pBdsDcQvBUZx2DupA6bsV7tDsSDiFFvMdKVnxGaXBoPQFpKwdP_lCfcmTxxistqxnF9GUBfxg1Fn3alK-_/s1796/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-03%2012.01.49.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1076&quot; data-original-width=&quot;1796&quot; height=&quot;192&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiEYthMLQmFtM0sOeM-H2OW8KfzR_00V2u_UINuDnMMsTFJthg7RKuSUnq8uY7CQmZLDKmYWwdqgAr5fNbUJzLbpC8xKR_j__221lpWP3pBdsDcQvBUZx2DupA6bsV7tDsSDiFFvMdKVnxGaXBoPQFpKwdP_lCfcmTxxistqxnF9GUBfxg1Fn3alK-_/w320-h192/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-03%2012.01.49.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;また、github context の json は &lt;a href=&quot;https://github.com/nektos/act&quot; target=&quot;_blank&quot;&gt;nektos/act&lt;/a&gt; の入力イベントとしても使えるので、常にダンプしておくと便利かもしれません。。かも。。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;今回は以上。&lt;br /&gt;act のことは「&lt;a href=&quot;https://srz-zumix.blogspot.com/2022/08/nektosact-github-actions.html&quot; target=&quot;_blank&quot;&gt;ブログズミ: nektos/act で GitHub Actions のワークフローをローカル実行&lt;/a&gt;」と「&lt;a href=&quot;https://zenn.dev/srz_zumix/articles/gh-act-first-released&quot; target=&quot;_blank&quot;&gt;GitHub Actions のローカル実行ツール（nektos/act）を便利にする gh extension を作った&lt;/a&gt;」で書いたのでよければ見て下さい。&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/3223226197212248878/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2022/10/github-actions.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/3223226197212248878'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/3223226197212248878'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2022/10/github-actions.html' title='【GitHub Actions】コンテキストダンプのススメ'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdUZvubCI58lmYc1QYPPz6TDmSFqCLujoV5NbYBntMvE2CmrTQJbXs21XwQQi86kyyMMAIUb3_Z5ECQYqqNVUjRtnOYU7VonIl9d7ZYA6iiFy0wzwiHxVZgCUXjimo6pXCgbGhz601JHkwyAP_u-A_QnRavNmOsUkezBU7Nn6MAv0nZf1ouW3wnat3/s72-w320-h203-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-03%2012.01.21.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-8795190263758302859</id><published>2022-09-21T09:13:00.000+09:00</published><updated>2022-09-21T09:13:39.833+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="git"/><category scheme="http://www.blogger.com/atom/ns#" term="macOS"/><title type='text'>Homebrew と git fsmonitor の相性が悪かったので対策した</title><content type='html'>&lt;p&gt;「&lt;a href=&quot;https://mail.google.com/mail/u/0/?tab=rm&amp;amp;ogbl&amp;amp;zx=moexgvfgphp2#inbox&quot; target=&quot;_blank&quot;&gt;Git 2.37.0 で FSMonitor daemon が追加されたことで status が早くなったそうです&lt;/a&gt;」&lt;br /&gt;この記事で fsmonitor の事書いてしばらく使っていたのですが、brew upgrade したときにたまに以下のエラーで失敗するようになってしまいました。&lt;/p&gt;
&lt;pre class=&quot;console&quot;&gt;Error: Another active Homebrew update process is already in progress.
Please wait for it to finish or terminate it to continue.&lt;/pre&gt;

&lt;p&gt;これは &lt;a href=&quot;https://github.com/Homebrew/brew/releases/tag/3.5.7&quot; target=&quot;_blank&quot;&gt;Homebrew 3.5.7&lt;/a&gt; で対応されたので、現在は発生しなくなっていると思います。&lt;br /&gt;&lt;br /&gt;当時はあんまり調べる時間なかったので、一旦 fsmonitor を無効にしてましたが、&lt;a href=&quot;https://github.com/Homebrew/brew/pull/13586&quot; target=&quot;_blank&quot;&gt;修正 PR&lt;/a&gt; と &lt;a href=&quot;https://github.com/Homebrew/brew/issues/13521&quot; target=&quot;_blank&quot;&gt;Issue&lt;/a&gt; をみた感じ&amp;nbsp;fsmonitor が homebrew の lock ファイルを掴んでしまうからみたいです。&lt;br /&gt;&lt;br /&gt;Homebrew 3.5.7 は fsmonitor を stop させる対応となっていますが、そもそも監視しておくメリットってあるのかな？ということで、 brew 配下だけ fsmonitor を無効にする設定を紹介します。&lt;/p&gt;&lt;p&gt;ちなみに brew に追加する tap も git なのでそれらも無効にします。&lt;/p&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqITyzdK3dkn5G9uWwL6AG3rnxrlNZ2c2syqgQvT94bwxfpFP2tA_i3tyfo04Sk0mMxiFgxzcOTDAE_i2UC5SpCNcSAyV127nyTao9EBEqXypHjEQUk9QQPTLfxMVnFcjwrcO18YmRnV72jmr2DX1P0NeUhJGetS3YqxnW-2Ubh2XqXiQqnddSjHWG/s1052/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-09-08%2020.23.07.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;750&quot; data-original-width=&quot;1052&quot; height=&quot;285&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqITyzdK3dkn5G9uWwL6AG3rnxrlNZ2c2syqgQvT94bwxfpFP2tA_i3tyfo04Sk0mMxiFgxzcOTDAE_i2UC5SpCNcSAyV127nyTao9EBEqXypHjEQUk9QQPTLfxMVnFcjwrcO18YmRnV72jmr2DX1P0NeUhJGetS3YqxnW-2Ubh2XqXiQqnddSjHWG/w400-h285/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-09-08%2020.23.07.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;

&lt;h5 class=&quot;subhead&quot;&gt;includeIf を使って任意のディレクトリ以下の git config をカスタムする&lt;/h5&gt;

&lt;p&gt;グローバル設定は false で使いたいディレクトリだけ true にするとか、brew 配下のワーキングディレクトリすべてに git config core.fsmonitor false していけばいい話ではあるのですが、デフォルト true で使いたい＆一括 false 設定をしたいです。&lt;/p&gt;&lt;p&gt;そこで、&lt;a href=&quot;https://git-scm.com/docs/git-config#_conditional_includes&quot; target=&quot;_blank&quot;&gt;includeIf&lt;/a&gt; を使います。&lt;/p&gt;&lt;p&gt;includeIf はその名の通り、条件を満たした場合のみ config を include する機能です。&lt;br /&gt;リンク先のドキュメントに Example があるのでどういうことができるのか想像できると思います。&lt;/p&gt;&lt;p&gt;今回は brew --prefix のパス以下の場合に fsmonitor = false にした config ファイルを読み込ませます。&lt;br /&gt;（brew --prefix に合わせて適宜変更してください）&lt;br /&gt;&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/srz-zumix/51ead2b0fc145bd41cab07653aba518e.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;br /&gt;これだけです。簡単ですね。&lt;br /&gt;includeIf 使うと特定のディレクトリ以下で user 切り替えるとかもできるので覚えておくと良いテクニックだったと思います。&lt;br /&gt;&lt;/p&gt;
&lt;h5 class=&quot;subhead&quot;&gt;おまけ&lt;/h5&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/jgavris/rs-git-fsmonitor&quot; target=&quot;_blank&quot;&gt;https://github.com/jgavris/rs-git-fsmonitor&lt;/a&gt;&lt;/p&gt;&lt;p&gt;これはたまたま見つけたデフォルトの fsmonitor の hook スクリプトを Rust rewrite したやつ。&lt;br /&gt;fsmonitor って true/false ではなくて hook スクリプトを指定することもできるんですね。&lt;br /&gt;&lt;br /&gt;git status がもっと速くなるみたいですよ。&lt;br /&gt;（筆者環境では差は感じられなかった）&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/8795190263758302859/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2022/09/homebrew-git-fsmonitor.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/8795190263758302859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/8795190263758302859'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2022/09/homebrew-git-fsmonitor.html' title='Homebrew と git fsmonitor の相性が悪かったので対策した'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqITyzdK3dkn5G9uWwL6AG3rnxrlNZ2c2syqgQvT94bwxfpFP2tA_i3tyfo04Sk0mMxiFgxzcOTDAE_i2UC5SpCNcSAyV127nyTao9EBEqXypHjEQUk9QQPTLfxMVnFcjwrcO18YmRnV72jmr2DX1P0NeUhJGetS3YqxnW-2Ubh2XqXiQqnddSjHWG/s72-w400-h285-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-09-08%2020.23.07.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1887782251735454807.post-4273707892082583513</id><published>2022-09-13T10:59:00.003+09:00</published><updated>2022-09-13T11:01:16.588+09:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="CI"/><category scheme="http://www.blogger.com/atom/ns#" term="CUE"/><category scheme="http://www.blogger.com/atom/ns#" term="cuelang"/><category scheme="http://www.blogger.com/atom/ns#" term="Dagger"/><title type='text'>Dagger 使ってみた</title><content type='html'>&lt;h5 class=&quot;subhead&quot;&gt;Dagger とは？&lt;/h5&gt;
&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://dagger.io/&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1500&quot; data-original-width=&quot;2866&quot; height=&quot;334&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5aDFO4qPCJHmPekZ_DLe2WPIj-WXxI_aZE6gBAo9fj7llerHStj-RsMynxALZ6xbdmcJL1ruP7O-0Kzzr1EoBFzMThtz5n0peh1Raj7BXMOSovbCEmz1FmxZAVkRs3E57YhEbKK4lGYwtv4JhJ9CVMolIoBWFw9TPZmOrA4mnwRU2St6bzJBLzQzq/w640-h334/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-06-19%2012.57.54.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;https://dagger.io/&quot; target=&quot;_blank&quot;&gt;Dagger&lt;/a&gt; は CI/CD パイプライン用のポータブルな開発キットです。&lt;/div&gt;&lt;div&gt;Dagger は他の一般的な CI/CD が YAML でパイプラインを記述するのと異なり、CUE で記述します。CUE については後述しますが、YAML よりプログラミング言語に近くて柔軟性が高いって感じですかね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CUE によって YAML ではやりづらかったパイプライン再利用が容易になっています。&lt;/div&gt;&lt;div&gt;また、Dagger はローカルでも CI でも、どこでもパイプラインが実行できるのが特徴です。&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjes5gqW-F-MLH65Mp3fjHmbGtBk527E3sFgDIFHa3QcL-slgpoPTCkC8Cbn5mWXrZTmbsJ1jQEx6XTlvXVG-m0d8kVCryCa-fy76J2wUJYXDBRHQxwLlIXj0QHvWzZ8ToUodQZaDUMSu2YUpDtKCgv2cRm7jxZHADxU1DzcATeZ2KjiXI5eF_vYLAw/s2728/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-06-19%2014.42.32.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;952&quot; data-original-width=&quot;2728&quot; height=&quot;224&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjes5gqW-F-MLH65Mp3fjHmbGtBk527E3sFgDIFHa3QcL-slgpoPTCkC8Cbn5mWXrZTmbsJ1jQEx6XTlvXVG-m0d8kVCryCa-fy76J2wUJYXDBRHQxwLlIXj0QHvWzZ8ToUodQZaDUMSu2YUpDtKCgv2cRm7jxZHADxU1DzcATeZ2KjiXI5eF_vYLAw/w640-h224/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-06-19%2014.42.32.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;Dagger はすべてコンテナ上で実行されます。コンテナが動く環境上であればどこでも「同じ」パイプラインを実行できるのが Dagger であり、CI/CD ツールではなく、パイプラインを共通化するレイヤーとして機能するツールです。&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;
  
&lt;h5 class=&quot;subhead&quot;&gt;CUE&lt;/h5&gt;
&lt;div&gt;&lt;a href=&quot;https://github.com/cue-lang/cue&quot; target=&quot;_blank&quot;&gt;https://github.com/cue-lang/cue&lt;/a&gt;&lt;/div&gt;&lt;div&gt;CUE は&amp;nbsp;Configure, Unify, Execute の頭文字のようです。&lt;br /&gt;CUE は JSON のスーパーセットで、CUE から JSON/YAML にエクスポートも可能です。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CUE については Dagger のページにも説明が詳しくあるのでそちらを参照してください。&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://docs.dagger.io/1215/what-is-cue/&quot; target=&quot;_blank&quot;&gt;https://docs.dagger.io/1215/what-is-cue/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CUE は YAML のマージ機能も備えているので↓みたいな使い方もできるみたいです。これはこれで便利そうですね。&lt;/div&gt;&lt;div&gt;「&lt;a href=&quot;https://bufferings.hatenablog.com/entry/2022/07/17/043605&quot; target=&quot;_blank&quot;&gt;CircleCI の設定ファイルを分割して CUE で合成してみたら割と簡単で便利そう - Mitsuyuki.Shiiba&lt;/a&gt;」&lt;br /&gt;&lt;br /&gt;今回は Dagger の話なので CUE そのものもそのうち触ってみたいです。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
  
&lt;h5 class=&quot;subhead&quot;&gt;使ってみる&lt;/h5&gt;&lt;div&gt;ものは試しで、使ってみました。&lt;br /&gt;Dagger のサンプルとして &lt;a href=&quot;https://github.com/dagger/todoapp&quot; target=&quot;_blank&quot;&gt;todoapp&lt;/a&gt; があるのでそれでまずは動作を試してみるのがオススメです。このへんはありきたりな内容になってしまうので、省略します。&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead&quot;&gt;iutest に適用&lt;/h5&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/srz-zumix/iutest&quot; target=&quot;_blank&quot;&gt;iutest&lt;/a&gt; は筆者が書いてる C++ テスティングフレームワークです。&lt;br /&gt;（まぁ最近はテスティングフレームワークの機能開発はほとんどしてないんですが・・いろんな CI サービスを使っている・使っていたのでそういう意味では参考になることもあるかもしれないです。）&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;今回 alpine イメージ上でのテストを今までしてなかったので、それを Dagger でやるようにしました。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ベースとなる cue ファイルはサンプルの&amp;nbsp;&lt;a href=&quot;https://github.com/dagger/todoapp&quot; target=&quot;_blank&quot;&gt;todoapp&lt;/a&gt;&amp;nbsp;を使いました。&lt;/div&gt;&lt;div&gt;1から書くよりもサンプルなどをベースに書いていくと楽だと思います。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;なんですが、todoapp が参考にしたときと大分違う設定になっていました。&lt;br /&gt;ちょうどそのころの Dagger 使った系の記事があったのでそちらを参考にしてください。&lt;br /&gt;「&lt;a href=&quot;https://zenn.dev/ap0/articles/f8431193b7c6ca&quot; target=&quot;_blank&quot;&gt;ベンダーロックインしないCI/CDパイプライン、Daggerを使ってCodeCheckを自動化してみた。&lt;/a&gt;」&lt;/div&gt;&lt;div&gt;「&lt;a href=&quot;https://qiita.com/takumi3488/items/dd34e9c729acca17a7eb&quot; target=&quot;_blank&quot;&gt;コンテナベースのCI/CDツール「Dagger」を試してみよう - Qiita&lt;/a&gt;」&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;どういうふうに書いたかは百聞は一見に如かずということで、レポジトリを見てください。&lt;br /&gt;この記事向けにコメントも追加してます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://github.com/srz-zumix/iutest/blob/develop/iutest.cue&quot; target=&quot;_blank&quot;&gt;https://github.com/srz-zumix/iutest/blob/develop/iutest.cue&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH7foiYO7BdPgIJ6y4aGqzaLqHKTIhVduguYDf5MmKTN2z63TvE-V9e1gabF-uofLhILEoGlO2NqgnegVvrzGBxtnrxNHLYUS7TCpwMBHkMm0UKT67ct4goDkKkfsHdy5dZfWbuETOZYvyZMYPx2wviBmrlFVKkGmTDQlVik52LyJffsBGogfRkSpB/s1446/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-19%2022.24.33.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;1446&quot; data-original-width=&quot;1392&quot; height=&quot;640&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiH7foiYO7BdPgIJ6y4aGqzaLqHKTIhVduguYDf5MmKTN2z63TvE-V9e1gabF-uofLhILEoGlO2NqgnegVvrzGBxtnrxNHLYUS7TCpwMBHkMm0UKT67ct4goDkKkfsHdy5dZfWbuETOZYvyZMYPx2wviBmrlFVKkGmTDQlVik52LyJffsBGogfRkSpB/w616-h640/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-19%2022.24.33.png&quot; width=&quot;616&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;とはいえ、見てくださいだけではこの記事の意味がないのでこの設定に至るまでの紆余曲折を記述しておきます。&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead2&quot;&gt;変数展開は () でする&lt;/h5&gt;&lt;div&gt;同じ設定はまとめたいので変数にしてたのですが、使うときに単純に変数を書くだけじゃだめでハマりました。&lt;/div&gt;
  
  &lt;div class=&quot;source&quot;&gt;
    &lt;pre class=&quot;brush:plain&quot;&gt;       // 必要な環境変数をセット
        env: {
            // string は () で囲んで展開する
            IUTEST_ROOT_DIR: (iutest_root_dir)
            // 文字列の中で変数展開する場合は ( をエスケープする
            IUTEST_OUTPUT_DIR: &quot;\(test_result_dir)&quot;
        }
&lt;/pre&gt;
  &lt;/div&gt;
  
  &lt;h5 class=&quot;subhead2&quot;&gt;exit: 0 は今の所意味がない&lt;/h5&gt;&lt;div&gt;CTest が失敗しても後続の処理を継続したかったので終了コードを 0 に上書きしたいなーと思ったのですが、今はできないっぽい。&lt;br /&gt;なので、しかたがないので script: contents の処理で失敗を無視してます。&lt;br /&gt;&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead2&quot;&gt;always は condition の always ではない&lt;/h5&gt;&lt;div&gt;↑と同じ理由で常に実行される処理を書きたかったので、always を使ってみたのですが、どうやらこれは実行条件の always とはちょっと違って、cache 利用するかしないかの always だったようです。&lt;br /&gt;always を true にするとキャッシュを無視して常に実行されるようになりますが、依存処理が失敗していても実行するようなことはできませんでした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href=&quot;https://docs.dagger.io/1231/always-execute/&quot; target=&quot;_blank&quot;&gt;https://docs.dagger.io/1231/always-execute/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;常に実行したいってのは cache invalidate のことではないんだよなぁ・・&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead&quot;&gt;GitHub Actions で動かすには&lt;/h5&gt;&lt;div&gt;dagger の cue ファイルを置いておいても、そのままでは CI サービスで実行されないので、各サービスでワークフローを書く必要があります。&lt;/div&gt;&lt;div&gt;GitHub Actions の場合は、dagger 用の action があるのでそれを使えばすぐに動かせます。&lt;/div&gt;
 
  &lt;div class=&quot;source&quot;&gt;
    &lt;pre class=&quot;brush:plain&quot;&gt;  dagger:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dagger/dagger-for-github@v3
        with:
          cmds: |
            project init
            project update
            do ctest
    &lt;/pre&gt;
  &lt;/div&gt;
  
  &lt;h5 class=&quot;subhead&quot;&gt;CUE/Dagger を新たに覚えるのはつらい&lt;/h5&gt;&lt;div&gt;ここから使ってみた感想なのですが、CUE が使いやすいかというとまだわからないのですが、少なくとも覚えることは多い印象。&lt;br /&gt;YAML でのパイプライン記述における問題の１つである再利用性を CUE は解決していますが、最初に紹介した CUE を YAML のマージツールとして利用することで十分なような気もしますし、各 CI ツールで再利用性できる機能があったりしますし、Dagger である必要性があまり感じられませんでした。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;より理解をするには CUE と Dagger の境界を認識して、それぞれで調べる力、検索力が必要になるかなと思いました。&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead&quot;&gt;ポータビリティについて&lt;/h5&gt;
  
  &lt;h5 class=&quot;subhead2&quot;&gt;環境のポータビリティ&lt;/h5&gt;&lt;div&gt;Dagger は「環境」のポータビリティを実現しています。&lt;/div&gt;&lt;div&gt;CI でもローカルでも同じ「環境」で処理を実行できます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;ローカルと CI で同じ「処理」をすることは Makefile でもなんでもいいですが、可能です。&lt;/div&gt;&lt;div&gt;なので CI と同じ「処理」をすることは Dagger を使わなくても可能です。&lt;br /&gt;ただ、それだと実行環境は CI やローカルで異なるため、実行結果は変わってきます。&lt;br /&gt;Dagger は実行環境もセットになっているので、同じ「環境」で同じ「処理」ができ、CI とローカルで同じ実行結果が期待できます。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;これは大きなメリットです。仕事や個人開発でも CI でしか起きない問題の調査はめんどうです。ローカルで同じことができればこれも楽になります。&lt;br /&gt;また、問題調査としてではなく開発者がローカルで動作確認をしたい場合に、ローカルで手軽に実行できるのも利点ですね。&lt;br /&gt;私はゲーム開発に携わっているので、ターゲットプラットフォームでのビルドをローカルでしたいという需要はすごくわかります。（Dagger でゲーム開発のターゲットプラットフォームビルドができるかというと難しい気がしますが・・）&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;ただ、Dagger の実行環境はコンテナに制限されるため、コンテナでできないことはできません。&lt;br /&gt;また、iutest はテスティングフレームワークなので、１つの同じ環境でテストするよりも、多様な環境でテストできたほうが嬉しいです。（※Dagger で複数環境用意するのもありですが、管理下の想定された環境よりも、管理外の環境のほうが意味があると思っている）&lt;/div&gt;&lt;div&gt;今回は alpine コンテナでのテストが今までなかったので Dagger を採用して GitHub Actions で動かしています（Dagger も環境の１つなので何かしらのテストを回しておきたいという意思）。&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead2&quot;&gt;ワークフローのポータビリティ&lt;/h5&gt;&lt;div&gt;ワークフロー？パイプライン？&lt;br /&gt;言葉の定義があいまいなんですが、ここでは PR トリガーから結果の通知など CI の最初から最後までという意味合いでワークフローを使ってます。
&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;b&gt;
  
「A PORTABLE DEVKIT FOR CI/CD PIPELINES」
  &lt;/b&gt;&lt;div&gt;Dagger のトップページにはこう書かれています。&lt;br /&gt;パイプラインという言葉を使ってるので Dagger がカバーしている範囲はパイプラインと呼びます。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;図にするとこんな感じかな。&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj59TUzJeUo9XyappjF13O2bMSE3DrsDSSYnhabGl4Zzn0BKqJ2lFoetwa7RcsMQU3efFP3rd5Qgh1DQksLuoBsqQXhNM5U54X2xksaH6KFSMDdSPjVisMsLKKGJRck5VBRF_dC7KWTnTc0to4VEsaUQuoWFrQqzkW_xm8GWUJTU-6cX9QL8FTCEjmj/s1230/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-20%2023.57.49.png&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; data-original-height=&quot;982&quot; data-original-width=&quot;1230&quot; height=&quot;510&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj59TUzJeUo9XyappjF13O2bMSE3DrsDSSYnhabGl4Zzn0BKqJ2lFoetwa7RcsMQU3efFP3rd5Qgh1DQksLuoBsqQXhNM5U54X2xksaH6KFSMDdSPjVisMsLKKGJRck5VBRF_dC7KWTnTc0to4VEsaUQuoWFrQqzkW_xm8GWUJTU-6cX9QL8FTCEjmj/w640-h510/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-07-20%2023.57.49.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Jenkins でジョブに直接処理を書かずに .sh ファイルとかにしようね。とか。ビルドツール使おうねとか。そららはパイプラインの話。&lt;/div&gt;&lt;div&gt;それのもう１つ上のレイヤーで環境とセットでまとめてくれるのが Dagger 。&lt;br /&gt;&lt;/div&gt;&lt;div&gt;さらに上のレイヤーであるワークフローはそれぞれ対応する必要がある。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Dagger はベンダー依存しない CI ツールという立ち位置ですが GitHub Actions での実行例を見ていただければ分かる通り、特定の CI サービス上で Dagger を実行するには Dagger だけでは完結しません。というか、GitHub Actions でいうとトリガー部分（on: pull_request）は Dagger では設定できませんし、動かす CI サービス固有の機能を使いたい場合は Dagger 外でやる必要があります。（Dagger はそういう CI の差を埋めてくれるものではないので）&lt;/div&gt;&lt;div&gt;そして CI サービスを引っ越しする場合には、トリガー周りなどそういった設定は書き直しになります。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;CI/CD ワークフローのポータビリティという観点では、Dagger は直接的に貢献するわけではないです。（パイプライン部分だけでもポータブルになるので楽にはなる）&lt;/div&gt;&lt;div&gt;ただ、どのサービスを使うのか決まっているのであれば、そのサービスの書き方をしたほうが良いとも思えます。&lt;/div&gt;&lt;div&gt;逆に社内で使ってる CI サービスが多種多様であるとか、OSS だから手軽に乗り換えできると嬉しいとかであれば、Dagger を使う利点はあると思います。&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead2&quot;&gt;ローカル実行について&lt;/h5&gt;&lt;div&gt;実はローカル実行できる CI サービスもあります。&lt;br /&gt;なので目的や事情によってはそのサービスのローカル実行機能を利用したほうがいい場合もあるかもしれません。&lt;/div&gt;&lt;div&gt;例えば CircleCI では cli からローカル実行できます。（&lt;a href=&quot;https://circleci.com/docs/ja/2.0/local-cli#limitations-of-running-jobs-locally&quot; target=&quot;_blank&quot;&gt;制約はあります&lt;/a&gt;）&lt;/div&gt;&lt;div&gt;GitHub Actions の場合、&lt;a href=&quot;https://github.com/nektos/act&quot; target=&quot;_blank&quot;&gt;nektos/act&lt;/a&gt; というツールを使えばエミュレートできます。（act は大分できないことや、Hosted runner との差異がありますが・・）&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;これらで十分なのであれば Dagger に置き換える必要はないと思います。&lt;br /&gt;例えば、act は GitHub Actions のイベントをエミュレートしてくれるのでワークフローのローカル実行が可能ですが、Dagger は step レベルのローカル実行しかできないです。&lt;br /&gt;このへんは使い分けでしょうね。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;act のことは「&lt;a href=&quot;https://srz-zumix.blogspot.com/2022/08/nektosact-github-actions.html&quot; target=&quot;_blank&quot;&gt;ブログズミ: nektos/act で GitHub Actions のワークフローをローカル実行&lt;/a&gt;」と「&lt;a href=&quot;https://zenn.dev/srz_zumix/articles/gh-act-first-released&quot; target=&quot;_blank&quot;&gt;GitHub Actions のローカル実行ツール（nektos/act）を便利にする gh extension を作った&lt;/a&gt;」で書いたのでよければ見て下さい。&lt;/div&gt;
  
  &lt;h5 class=&quot;subhead&quot;&gt;まとめ&lt;/h5&gt;&lt;div&gt;個人的には最近使ってみた Earthly の方が Dagger より使いやすいなと思いました。&lt;br /&gt;Dagger がちょっと話題になりましたが、類似のツールと比較したり、今置かれている状況を踏まえて選択するのが良いと思いました。&lt;/div&gt;&lt;div&gt;以上、久しぶりに長めに書いた。ではでは。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://srz-zumix.blogspot.com/feeds/4273707892082583513/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://srz-zumix.blogspot.com/2022/09/dagger.html#comment-form' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/4273707892082583513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1887782251735454807/posts/default/4273707892082583513'/><link rel='alternate' type='text/html' href='http://srz-zumix.blogspot.com/2022/09/dagger.html' title='Dagger 使ってみた'/><author><name>srz_zumix</name><uri>http://www.blogger.com/profile/12777270094814249170</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglXfUkgVs17f1DQddZUU2EdVStFAxvCTSF6xW-I-qhARwtXNuN-o-xjzXAJY84q0PD7B2tWngd2QNr5vJX80-bw-l6IyOrAzSt8hV_yDKQAQFCyUKAQfNjA3xIl3F651Q/s113/icon_reasonably_small.png'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5aDFO4qPCJHmPekZ_DLe2WPIj-WXxI_aZE6gBAo9fj7llerHStj-RsMynxALZ6xbdmcJL1ruP7O-0Kzzr1EoBFzMThtz5n0peh1Raj7BXMOSovbCEmz1FmxZAVkRs3E57YhEbKK4lGYwtv4JhJ9CVMolIoBWFw9TPZmOrA4mnwRU2St6bzJBLzQzq/s72-w640-h334-c/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202022-06-19%2012.57.54.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>