Cybozu Productivity News

#5 - 2022.10.20

GitHub Actions でランナーのリソースを増強できる Larger runners がパブリックベータになりました

共有担当: @miyajan

  • これまで GitHub が提供する Linux と Windows のランナーは CPU 2 コア、メモリ 7GB でした
  • Larger runners では CPU が最大 64 コア、メモリが最大 256 GB までリソースを増強できます
  • enterprise もしくは organization レベルでランナーグループを作成し、Larger runners の利用をコントロールできます
    • どの organization、どのリポジトリが利用可能かアクセスコントロールが可能です
  • 料金
    • 使用するリソースの量に応じて利用料金も増えます
    • 通常のランナーはパブリックリポジトリは無料になりますが、Larger runners はパブリックリポジトリでも無料になりません
      • パブリックリポジトリで Larger runners を利用すると、外部からのコミットによって想定外の利用料金になる可能性があるので気をつけましょう
    • 通常のランナーはライセンスの種類に応じて無料枠が存在しますが、Larger runners は無料枠の対象になりません
  • パブリックベータ
    • 利用するにはサインアップページから申し込み、waitlist に登録する必要があります
    • GitHub Team か GitHub Enterprise Cloud プランの organization のみ利用可能です
  • GitHub Enterprise Cloud の場合、ランナーに固定の IP レンジのアドレスが割り当てられるようにする機能も追加されてます
  • これまで大量のリソースが必要なジョブを実行するには、ジョブを分割して並列実行するか、AWS/GCP など外部リソースに処理を持っていくかするしかなかったですが、GitHub Actions の単独のランナーで実現できる選択肢が増え、嬉しい場面がありそうです

GitHub Actions の GITHUB_TOKEN で workflow_dispatch と repository_dispatch イベントのワークフローを呼び出せるようになりました

共有担当: @miyajan

  • GitHub Actions のワークフロー実行時に自動で GITHUB_TOKEN というシークレットが割り当てられ、ワークフロー内で GitHub へアクセスするときに利用できます
    • 例えば、actions/checkout アクションはデフォルトでこの GITHUB_TOKEN を使って認証してリポジトリをチェックアウトします
  • これまでは、GITHUB_TOKEN で GitHub のイベントを発生させる操作を行ったときに、別ワークフローをトリガーしないようになっていました
    • 例えば、GITHUB_TOKEN を使ってリポジトリにコミットを push しても、GitHub Actions の on: push イベントのワークフローは実行されません
    • これは、ユーザーが誤ってワークフローの無限ループを引き起こすのを防ぐ目的の制限です
    • なので、ワークフローから別のワークフローをトリガーしたい場合は、パーソナルアクセストークンなど別の認証方法でイベントを発生させる必要がありました
  • 今回の変更で、GITHUB_TOKEN を使って workflow_dispatch イベントや repository_dispatch イベントを引き起こしたときは、対応する GitHub Actions のワークフローがトリガーされるように緩和されました
    • これらのイベントは明示的にワークフローを呼び出すためのイベントなので、誤って無限ループを引き起こすリスクは低いと判断されたようです
  • 今回の修正により、パーソナルアクセストークンなど別の認証方法を用意せずに実現できるシナリオが増えそうです
    • 例えば、ワークフローからコミットを作成して、CI ワークフローを workflow_dispatch イベントや repository_dispatch イベントで呼び出すようにするとか

CircleCI のセルフホストランナー(docker executor)を k8s 上でスケーラブルに動かすコンテナエージェント機能が登場しました(オープンプレビュー)

共有担当: @korosuke613

  • CircleCI において、セルフホストランナー(docker executor)を k8s 上でスケーラブルに動かすコンテナエージェント機能が登場しました(オープンプレビュー)
  • これまでも CircleCI にはセルフホストランナー機能がありましたが、ジョブと VM(ランナー)を 1:1 でマッピングする必要があったため、スケーラビリティが低いという問題点がありました
    • 今回の機能は、k8s 上で docker executor を動かすことでスケーラブルなセルフホストランナー(docker executor)を実現するぞという機能になります
    • 既存のセルフホストランナー機能の代替というわけではありません
  • 実際に試してみました -> まとめ | CircleCI の Container Agent 触ってみる
  • Helmチャートが用意されており、簡単にセットアップ可能でした
  • ランナーの設定項目も豊富です
  • CircleCI は docker executor の利用が主流なので、k8s とは相性がいいですね。簡単にセットアップできて必要に応じてスケールするのがやはり嬉しいと思いました

gRPC サーバのビルドに Earthly を使ってみよう

共有担当: @emiksk0910

  • Cybozu Productivity News #4でも紹介した OSS のビルドツール Earthly の入門記事を2つ書いたのでその紹介です
  • Go で書かれた gRPC サーバーを題材に Earthly を使ってスタブコードの生成やテスト、バイナリビルド、Dockerイメージの生成とプッシュを行う入門記事です
  • 実例を基に Earthly の基本的な構文の説明をしています
  • Makefile + Docker といった感じの触り心地で、Dockerfile を書いたことがある人なら苦もなく使えるようになると思います
  • 学習コストの低さ、コンテナ上でタスクを実行することによる可搬性と再現性1の高さ、キャッシュの仕組みの理解のしやすさなどが特徴です

Earthly を GitHub Actions で使ってみよう

共有担当: @emiksk0910

  • 続いて前の記事で書いた Earthfile (Earthly のタスク定義ファイル) を題材に、Earthly を GitHub Actions で実行する方法を説明しています
  • 内容の大部分は Earthly のキャッシュの仕組みについての説明になっています
    • inline cache: タスクの成果物としての Docker イメージをタスク実行のためのキャッシュに用いる
    • explicit cache: タスクの中間イメージをキャッシュのために別途リモートレジストリに保存し、それをタスク実行のためのキャッシュに用いる
  • 記事執筆のついでに複数のリモートキャッシュを読み込めるようにして、キャッシュの優先順位を設定できる Pull request を Earthly 本体に出しました
    • v0.6.22でリリースされています 🎉
  • Earthly Satellites という Earthly を実行するためのリモートインスタンスを立ち上げて、そこでタスクを実行する機能もベータですが存在しています
    • 同じ Satellite インスタンスを CI で用いることで、リモートではなくローカルのキャッシュをジョブに使えるようになります
  • まだリリースされていませんが、Earthly CI なるものも計画されているようです
  • Earthly 便利なのでみなさんもぜひ使ってみてください

CDK for Terraform(CDKTF) が GA になりました

共有担当: @r4mimu

  • Cloud Development Kit for Terraform (CDKTF) が8月にGAになりました
  • HCL を書かずに、使い慣れたプログラミング言語でインフラの定義ができます
    • 2022年10月1日時点でTypeScript、Python、Java、C#、Go がサポートされています
  • ユニットテスト用のライブラリも用意されています
  • cdktf synth というコマンドで Terraform CLI から利用できる JSON 形式の cdk.tf.json という設定ファイルが生成され、cdk.tf.json があるディレクトリ内で Terraform CLI を実行することができます
  • 逆に、cdktf convert コマンドで HCL を CDKTF のコードに変換する事もできます
  • 正直、使い所がわかっていませんが動的にインフラを生成したい際の選択肢として考えられそうです

Terraform Module Designs 思考の引き出しを増やすモジュール設計のヒント

共有担当: @r4mimu

  • 「実践Terraform」の著者の方によるモジュール設計についてのヒントがまとまったスライド
  • Terraform module の設計の仕方にとどまらず、ソフトウェア開発における設計の思想を述べている
    • 書籍などから様々な格言を引用して説明しており、読み物として面白いです
  • 標準プラクティスとして、まず公式ドキュメントを読むことを推奨しています
    • とりあえず公式ドキュメントに倣って、イマイチに感じたら後から変えていく
    • いかに「後から変えていく」を上手にできるように設計しようと述べています

TerraformモノレポCIのセキュア化 | メルカリエンジニアリング

共有担当: @r4mimu

  • モノレポ Terraform の CI をセキュアに構築した話
  • メルカリではグループ内のすべての Terraform をまとめてモノレポで管理しており、terraform apply はモノレポ内に配置した CI パイプライン上で実行されるようになっていた
  • その CI 環境における以下のような課題と対策が書かれています
    • 永続的なサービスアカウントキーが漏えいした場合、手動で無効にするまで悪意のある人物は何でもできてしまう
    • すべての Project に対するオーナー権限を持つサービスアカウントが存在する
    • 任意のコマンドが実行されるリスク(CI パイプラインや Terraform プロバイダによる任意コード実行)
  • クラウドには GCP を利用している場合での話ですが、AWS やモノレポでない環境においても永続的なサービスアカウント対策や任意のコマンド実行対策は参考になると思いました
  • 永続的なサービスアカウントキーを排除するために、CIプラットフォームを CircleCI から Cloud Build に移行することにしたとあり、CIプラットフォームをクラウドサービスに寄せるのは確かになと思った一方、どのように移行したのか個人的に気になりました
  • terraform apply を CI で行うにはセキュリティ面で色々な問題が考えられると思いますが、対処事例として参考になりました

セキュアなTerraformの使い方 ~ 機密情報をコードに含めず環境構築するにはどうしたらいいの?

共有担当: @r4mimu

  • Terraform でセキュアにシークレットを扱う方法について解説したスライド
  • .tf ファイルに機密情報を記述しない例として Terraform の Data Source や git 管理外ファイルに定義する方法が考えられるが、これらはNG
    • tfstate ファイルとは何か?から始まり、tfstate ファイルには機密情報が含まれてしまうことを解説
  • tfstate ファイルに機密情報が入ることを防ぐにはどうすればいいか
    • senitive 属性を付与することや tfstate ファイルを暗号化するなど一見良さそうな方法でもセキュアでないことを分かりやすく説明している
  • 結論として tfstate ファイルに機密情報が含まれることをやめるべきであり、どうやってやめるかを代替案を紹介
  • Terraform 初心者でも理解しやすいので一度目を通しておくと良いと思います

Terraform を使用するためのベスト プラクティス

共有担当: @r4mimu

  • Google による Terraform を使用するベストプラクティス
  • スタイルや構造に関する一般的なものから、モジュール構成やバージョン管理についても触れられています
    • 前述した機密情報の話や認証情報は CI/CD パイプラインに寄せることを推奨する話もあります
  • 各トピックごとに推奨例と非推奨例が載っており、理解しやすいです
  • 余談ですが alias terrafrom="terraform" を追加しようという内容があって面白かったです

Introducing the new npm Dependency Selector Syntax

共有担当: @ganta0087

  • npm CLIに依存モジュールの情報をフィルターしてJSON形式で出力できるqueryコマンドがv8.16.0で追加されました
  • クエリーはCSSセレクターに似た記法となっており、詳細な仕様はDependency Selector Syntax & Queryingに定義されています
  • 同時に@npmcli/arboristというnode_modules配下のツリーをプログラマティックに扱えるライブラリに、このDependency Selectorを扱える.querySelectorAll()メソッドが追加されました

Renovateがasdfの.tool-versionsファイルの更新にNode.js限定で対応

共有担当: @ganta0087

Highlights from Git 2.38

共有担当: @ganta0087

  • Git 2.38がリリースされ、scalarコマンドの同梱、rebaseに--update-refsオプションの追加などが行われました
  • scalarはBuilt-in filesystem monitorなどのこれまで追加されてきた大規模リポジトリ向けの機能を一律で有効化してくれます
  • rebaseの--update-refsは、例えばPull Requestを細かくしたいけど前のものがマージされないと進められないときにブランチをマージ前のところから切っていくことがありますが、そういう状況で最初の方のブランチのコミットを修正すると都度rebaseして回らなければならなかったのを自動で行ってくれるものです

生産性向上は一筋縄ではいかない 〜改善を進める上で生じる課題との付き合い方〜 | ドクセル

共有担当: @korosuke613

脱オンプレGitHub!クラウド移行促進のための取り組み | ドクセル

共有担当: @korosuke613

  • 生産性向上チームの取り組みを TECH STAND #9 GitHub というイベントで発表してきました
  • GitHub Enterprise Server から GitHub Enterprise Cloud へリポジトリを移すためにやってきたことを話しています
  • オンプレあるあるっぽい話が出てるので、気になる人は見てください

We are hiring

サイボウズの開発者の生産性を上げる「生産性向上チーム」とは!?

Footnotes

  1. Docker イメージを上手に作らないと再現性の高さは得られないことに注意してください。イメージをビルドする時に依存するライブラリのバージョンが不定だと容易に再現性が下がります。