はじめに
みなさん大好きnpm audit
のPHP(composer)版があったとして、それをGithub Actionで動かせたら面白いかなと思いやってみました。
作ったものの紹介とそれをマーケットに公開するために何をしたかざっくり説明します。
利用したもの
知っていたはいたもののcomposer audit
なコマンドは存在しないので、まずググりました。
composer audit
でググると出てきたissueを元にざっくり調査。そのなかでも扱いやすそうで、スターも多めなsensiolabs/security-checkerを活用させていただきました。これはcomposer.lock
を食わせれば、該当ライブラリのcve情報などがわかるものとなっています。
作ったもの
プロジェクト
glassmonkey/actions-php-auditになります。
マーケットプレイスにも公開されています。
実行結果
最初にどんなものを作ったかの説明のために実行結果を載せておきます。
今回は自分の検証も兼ねてphp5系で作ったバージョン4系のLaravelのcomposer.lockに対して実行させてみました。
Github.comのActionsのコンソール画面にCVEの内容が出力がされる程度のものを作りました。改行などめちゃくちゃですが。
https://github.com/glassmonkey/actions-php-audit/commit/61779f5fe69965ca7af7d368ab0dec012a38585a/checks?check_suite_id=359400216
使い方
実際に使い方サンプルを載せていいますが、このような形です。
https://github.com/glassmonkey/actions-php-audit/blob/master/.github/workflows/alert.yml
name: Alert Composer Audit
on:
push:
branches:
- master
jobs:
check-validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: glassmonkey/actions-php-audit@v0.1.1
id: checker
with:
WORK_DIR: path/to/dir
# Todo other actions
- name: sample message
run: echo "${{ steps.checker.outputs.message }}"
WORK_DIRという形で、composer.lockが存在するパス(プロジェクトルートからの相対パス、プロジェクトルートなら不要)を引数に与えることで動くようにしています。
出力結果は ここで示すように
${{ steps.checker.outputs.message }}
で取り出すことが出来ます。現時点でもslack通知のメッセージにこれにするなどすれば無理やり送れなくもなかったりはします。
しかし、めちゃくちゃ汚いので今後改修予定です。
なお、ここで注意なことが1点あります。出力データを取得する場合は他のactionから参照するために、id
を指定する必要があることです。
今回はchecker
というid
を付与しているので出力結果の参照が可能になっています。
- uses: glassmonkey/actions-php-audit@v0.1.1
id: checker
マーケットプレイスへの公開手順
こちらのページを参考にさせていただきました。
action.ymlを配置する。
参考はmetadata-syntax-for-github-actionsを参照
例はこちら
name: 'PHP AUDIT ACTION'
description: 'GitHub Actions for PHP LIbrary Secrity Checker'
author: 'glassmonkey'
runs:
using: 'docker'
image: 'Dockerfile'
env:
WORK_DIR: ${{ inputs.WORK_DIR }}
branding:
icon: 'upload-cloud'
color: 'blue'
inputs:
WORK_DIR:
description: Relative path of the directory where composer.lock exists
required: false
default: ""
outputs:
message:
description: "Using your library have security information"
※ これがきちんとと作られた状態だと
uses: glassmonkey/actions-php-audit@v0.1.1
の代わりにuses: ./
とローカル指定ができるようになるのでprivateリポジトリ下のactionを使う場合や検証などができます。(参照: https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/creating-a-docker-container-action#testing-out-your-action-in-a-workflow)
Readmeをきちんと書く。
せっかくなのでReadmeのガイドラインがあるので目を通しておくとよきです。
https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/creating-a-docker-container-action#create-a-readme
リリースをする
基本的にはリリース作業をすればマーケットプレイスへの公開も連動して行われる。
バリデーション
Publish this Action to the GitHub Marketplace
のチェックは2段階認証の設定が必須なのでお忘れなく。
カテゴリもっぽいものを選ぶ
タグをつけてリリース
結果
公開が完了しているとリポジトリに下記のような通知がでます。
[マーケットプレイス](https://github.com/marketplace/actions/php-audit-action)にも公開されました。余談とこれから
本来はissueを立てるか、slack通知をするなりしたほうが良かったのですが、時間がなかった点と今後の拡張性をもたせたかったので、とりあえずは別actionと組み合わせる前提の作りにしています。
今後はissueを立てる機能を追加するなり、slack通知するなり見当しようかなと思います。
出力結果に関してですが、1変数に出力する形で下記のように行っています。この方法だと複数行出力場合は1行で切られてしまっていたので、1つの文字列に改行込みは色々無理がありそうです::
なお、::set-output
は仕様で専用の出力フォーマットとして定められています。
PHP_AUDIT_MESSAG=$(php /opt/security-checker/security-checker security:check composer.lock)
echo ::set-output name=message::${PHP_AUDIT_MESSAG}
感想
前職では結構ライブラリの脆弱性の観測はおざなりになっていたので、確認できる環境を作らないとですね。
npm auditは良い機能です。
適当に作ったので、課題は多いですがマーケット公開まで簡単に出来たのは学びでした。
ぜひみなさんも自動化を秘伝のたれで終わらせるのではなく共有しちゃいましょうw