2022年1月27日

Continuous Integration

Harness CIにおけるGitHub Actionsのサポート

GitHub Actionsは、あらかじめ定義されたタスクを実行するカスタムアクションを作成できる機能です。Harness CIでどのように使えば拡張性を高められるかを説明します。

GitHub Actions Support In Harness CI

今回は、Harness CIにおけるGitHub Actionsのサポートと、プラグインの拡張性によるプラグインステップとしてのアクションのテンプレート化について解説します。

GitHub Actionsは、定義済みのタスクを実行するカスタムアクションを作成することができる機能です。これらの定義済みタスクは、コードベースのクローンからDockerイメージの構築、セキュリティースキャンのイメージまで多岐にわたります。過去に作成されたアクションは、GitHubマーケットプレイス上に存在し、1万以上のアクションが豊富にサポートされています。

Harness CIは、GitHub Actionsの実行をサポートするようになりました。この追加により、CIパイプラインのプラグインステップ経由でGitHub Actionsを使用できるようになりました。

使用方法

GitHub ActionsのYAMLには、3つの属性があります。

  1. name:ブランチやタグと一緒にアクションのGitHubリポジトリーを参照します。
  2. with:キーと値を文字列で指定したマップ。これらは、アクションの入力です。
  3. env:アクションに渡される環境変数。

Harness CIでGitHubアクションをプラグインとして利用するには、プラグインステップの設定でwith、uses、envの各属性をコピーする必要があります。また、GitHubアクションのプラグインはDocker in Docker(dind)を使用するため、ステップを特権モードで実行する必要があります。

以下は、GitHubのアクションとHarness CIのアクションYAMLを並べて比較したものです。

Side-by-Side-Comparison

Harness CIでアクションを使用する場合の例を以下に示します。

Trivyスキャニングアクション

Trivyは、コンテナイメージやgitリポジトリーなどの脆弱性を検出するためのオープンソースのスキャナーです。

以下の例では、Harness CIでtrivyを使用して「drone/git」コンテナイメージをスキャンしています。

- step:
      identifier: trivy
      name: Run Trivy vulnerability scanner
      type: Plugin
      spec:
          connectorRef: dockerhub
          image: plugins/GitHub-actions
          privileged: true
          settings:
              uses: aquasecurity/trivy-action@master
              with:
                  image-ref: drone/git
                  format: table
                  exit-code: "1"
                  ignore-unfixed: "true"
                  vuln-type: os,library
                  severity: CRITICAL,HIGH,LOW
              env:
                  CI: true

Trivy-GitHub-Actions-Example

GCSアップロード動作

GCS uploadアクションは、Google Cloudストレージにファイルをアップロードするために使用することができます。

- step:
      identifier: gcs-uploader
      name: upload file to GCS
      type: Plugin
      spec:
        connectorRef: dockerhub
        image: plugins/GitHub-actions
        privileged: true
        settings:
              uses: google-GitHub-actions/upload-cloud-storage@main
              with:
                  path: '/path/to/file'
                  destination: demo/gcs
                  credentials: <+stage.variables.GCP_SECRET_KEY_BASE64> 

GCS Upload Action

Gitチェックアウトアクション

git checkoutアクションは、GitHubリポジトリーのコードベースをクローンするために使用されます。このアクションは、Harness CIで1つのステージで1つまたは複数のgitリポジトリーをクローンするために使用できます。

以下の例では、トリガーのペイロードに存在するプライマリーリポジトリーをクローンしています。プライベートリポジトリーをクローンするステップには、環境変数としてGITHUB_TOKENを指定することが必要です。

- step:
      identifier: checkout
      name: checkout GitHub action
      type: Plugin
      spec:
          connectorRef: dockerhub
          image: plugins/GitHub-actions
          privileged: true
          settings:
              uses: actions/checkout@v2
              with:
                  ref: ${{ GitHub.event.pull_request.head.sha }}
              event_payload: <+ trigger.eventPayload>
          envVariables:
              GITHUB_TOKEN: <+secrets.getValue("token")>

Git Checkout Action

2つ目のリポジトリーをクローンするためには、プラグインステップの設定でリポジトリー名を指定する必要があります。

- step:
      identifier: checkout-repo-by-name
      name: checkout GitHub repository by name
      type: Plugin
      spec:
          connectorRef: dockerhub
          image: plugins/GitHub-actions
          privileged: true
          settings:
              uses: actions/checkout@v2
              with:
                  repository: my-org/my-private-tools
                  path: my-tools
                  ref: ${{ GitHub.event.pull_request.head.sha }}
              event_payload: <+ trigger.eventPayload>
          envVariables:
              GITHUB_TOKEN: <+secrets.getValue("token")>

実装

GitHub Actions は、uses属性で指定されたリポジトリーをクローンし、クローンしたアクションコードからaction.ymlファイルにある手順を実行することで動作します。

GitHub ActionのCIプラグインは、GitHub Actionsをローカルに実行するためのオープンソースプロジェクトであるnektos/actを利用しています。nektos/actは、GitHubアクションのワークフローを実行するDockerコンテナを実行します。CIプラグインは、入力されたアクションステップのワークフローを作成し、それをnektos/act経由で実行します。以下は、プラグインのソースコードへのリンクです。

https://GitHub.com/drone-plugins/GitHub-actions

結論

Harness CIのプラグインの拡張性とシンプルさにより、たった1つのプラグインで多くのアクションを追加できることを示しました。Harness CIがいかにプラグイン化しやすいかがお分かりいただけたと思います。ぜひHarness CIでお気に入りのアクションを試してみてください。また、カスタムメイドのタスクのために独自のプラグインを作成するのもよいでしょう。Harness CIに関する詳しい情報は、JenkinsからHarness CIEへの移行をご覧ください。


この記事はHarness社のウェブサイトで公開されているものをDigital Stacksが日本語に訳したものです。無断複製を禁じます。原文はこちらです。

Harnessに関するお問い合わせはお気軽にお寄せください。

お問い合わせ