php-audit-action(β版）をマーケットプレイスに公開してみた

# はじめに
みなさん大好き`npm audit`のPHP(composer)版があったとして、それをGithub Actionで動かせたら面白いかなと思いやってみました。
作ったものの紹介とそれをマーケットに公開するために何をしたかざっくり説明します。

# 利用したもの
知っていたはいたものの`composer audit`なコマンドは存在しないので、まずググりました。
[`composer audit`でググると出てきたissue](https://github.com/composer/composer/issues/7323)を元にざっくり調査。そのなかでも扱いやすそうで、スターも多めな[sensiolabs/security-checker](https://github.com/sensiolabs/security-checker)を活用させていただきました。これは`composer.lock`を食わせれば、該当ライブラリのcve情報などがわかるものとなっています。

# 作ったもの
## プロジェクト
[glassmonkey/actions-php-audit](https://github.com/glassmonkey/actions-php-audit)になります。
[マーケットプレイス](https://github.com/marketplace/actions/php-audit-action)にも公開されています。


## 実行結果
最初にどんなものを作ったかの説明のために実行結果を載せておきます。

今回は自分の検証も兼ねてphp5系で作った[バージョン4系のLaravel](https://readouble.com/laravel/4.2/ja/quick.html)の[composer.lock](https://github.com/glassmonkey/actions-php-audit/blob/master/composer.lock)に対して実行させてみました。

Github.comのActionsのコンソール画面にCVEの内容が出力がされる程度のものを作りました。改行などめちゃくちゃですが。
https://github.com/glassmonkey/actions-php-audit/commit/61779f5fe69965ca7af7d368ab0dec012a38585a/checks?check_suite_id=359400216
<img width="1243" alt="スクリーンショット 2019-12-16 5.04.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152938/734e79ab-8053-c03e-48bc-a4b421d875a8.png">


# 使い方

実際に使い方サンプルを載せていいますが、このような形です。
https://github.com/glassmonkey/actions-php-audit/blob/master/.github/workflows/alert.yml

```yaml
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が存在するパス（プロジェクトルートからの相対パス、プロジェクトルートなら不要）を引数に与えることで動くようにしています。

出力結果は [ここ](https://github.com/glassmonkey/actions-php-audit/blob/master/.github/workflows/alert.yml#L15)で示すように

```
${{ steps.checker.outputs.message }}
```

で取り出すことが出来ます。現時点でもslack通知のメッセージにこれにするなどすれば無理やり送れなくもなかったりはします。
しかし、めちゃくちゃ汚いので今後改修予定です。

なお、ここで注意なことが1点あります。出力データを取得する場合は他のactionから参照するために、`id`を指定する必要があることです。
今回は`checker`という`id`を付与しているので出力結果の参照が可能になっています。

```yml

 - uses: glassmonkey/actions-php-audit@v0.1.1
   id: checker
```


# マーケットプレイスへの公開手順
[こちらのページ](https://masutaka.net/chalow/2019-02-11-1.html)を参考にさせていただきました。

##  action.ymlを配置する。 
参考は[metadata-syntax-for-github-actions](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/metadata-syntax-for-github-actions)を参照  
例は[こちら](https://github.com/glassmonkey/actions-php-audit/blob/master/action.yml)

```yml
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://help.github.com/ja/github/authenticating-to-github/configuring-two-factor-authentication)の設定が必須なのでお忘れなく。

チェックをすれば自動でバリデーションが行われる。
<img width="810" alt="スクリーンショット 2019-12-16 5.53.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152938/11cf3da5-e1b5-f33a-73d2-2ca1f6bd1833.png">

### カテゴリもっぽいものを選ぶ
<img width="791" alt="スクリーンショット 2019-12-16 5.57.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152938/441653de-4af6-4b4d-e38d-78b064af35df.png">

### タグをつけてリリース
<img width="797" alt="スクリーンショット 2019-12-16 5.58.46.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152938/f5f96c8f-4d21-7dbc-8020-e1450750f0a8.png">


### 結果
公開が完了しているとリポジトリに下記のような通知がでます。

<img width="1052" alt="スクリーンショット 2019-12-16 5.37.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/152938/42ffd9dc-aee3-d776-8b6a-dc04cd123f97.png">
[マーケットプレイス](https://github.com/marketplace/actions/php-audit-action)にも公開されました。

# 余談とこれから
本来はissueを立てるか、slack通知をするなりしたほうが良かったのですが、時間がなかった点と今後の拡張性をもたせたかったので、とりあえずは別actionと組み合わせる前提の作りにしています。
今後はissueを立てる機能を追加するなり、slack通知するなり見当しようかなと思います。

出力結果に関してですが、1変数に出力する形で下記のように行っています。この方法だと複数行出力場合は1行で切られてしまっていたので、1つの文字列に改行込みは色々無理がありそうです：：

なお、`::set-output`は[仕様](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/development-tools-for-github-actions
)で専用の出力フォーマットとして定められています。

```bash

PHP_AUDIT_MESSAG=$(php /opt/security-checker/security-checker security:check composer.lock)
echo ::set-output name=message::${PHP_AUDIT_MESSAG}
```


# 感想
前職では結構ライブラリの脆弱性の観測はおざなりになっていたので、確認できる環境を作らないとですね。
npm auditは良い機能です。
適当に作ったので、課題は多いですがマーケット公開まで簡単に出来たのは学びでした。
ぜひみなさんも自動化を秘伝のたれで終わらせるのではなく共有しちゃいましょうｗ