2022年1月27日
Continuous Integration
GitHub Actionsは、あらかじめ定義されたタスクを実行するカスタムアクションを作成できる機能です。Harness CIでどのように使えば拡張性を高められるかを説明します。
今回は、Harness CIにおけるGitHub Actionsのサポートと、プラグインの拡張性によるプラグインステップとしてのアクションのテンプレート化について解説します。
GitHub Actionsは、定義済みのタスクを実行するカスタムアクションを作成することができる機能です。これらの定義済みタスクは、コードベースのクローンからDockerイメージの構築、セキュリティースキャンのイメージまで多岐にわたります。過去に作成されたアクションは、GitHubマーケットプレイス上に存在し、1万以上のアクションが豊富にサポートされています。
Harness CIは、GitHub Actionsの実行をサポートするようになりました。この追加により、CIパイプラインのプラグインステップ経由でGitHub Actionsを使用できるようになりました。
GitHub ActionsのYAMLには、3つの属性があります。
Harness CIでGitHubアクションをプラグインとして利用するには、プラグインステップの設定でwith、uses、envの各属性をコピーする必要があります。また、GitHubアクションのプラグインはDocker in Docker(dind)を使用するため、ステップを特権モードで実行する必要があります。
以下は、GitHubのアクションとHarness CIのアクションYAMLを並べて比較したものです。
Harness CIでアクションを使用する場合の例を以下に示します。
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
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>
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")>
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が日本語に訳したものです。無断複製を禁じます。原文はこちらです。