GitHub ActionsでPHPの静的解析を行ってみる

## はじめに

チーム内の方のコードレビューでGitHub Actionsをレビューを行ったの際に得た知識からGHA触ってみたりしたので、記事に起こそうと思いますー:smiley: 。

## 前提条件

チームではGitHub Enterprise（以下GHE）でGitHub Actionsを利用するため、セルフホステッド ランナーを使用していますが、今回はphpの静的解析ツール（phpstan）をGitHub Actionsでインストールなど試みたかった（※）のでGitHubのGitHub ホステッド ランナーで動かしていきます。

※セルフホステッド ランナーではgithub公式が提供しているアクションのみ使用できるため、php関連のアクションはサードパーティーのものしかなく、そちらを使うにはGitHub ホステッド ランナーのみ使用可能

## GitHub Actionsとは

>GitHub Actions は、ビルド、テスト、デプロイのパイプラインを自動化できる継続的インテグレーションと継続的デリバリー (CI/CD) のプラットフォームです。 リポジトリに対するすべての pull request をビルドしてテストしたり、マージされた pull request を運用環境にデプロイしたりするワークフローを作成できます。

[GitHub Docs/GitHub Actions について](https://docs.github.com/ja/actions/learn-github-actions/understanding-github-actions#overview)
というものになり、2019年11月にリリースされたのでもので割と新しい技術になるみたいです。


## フォルダ構成

```
action
   ┣━ .github
   ┃     ┗━ workflows
   ┃            ┗━ PhpCheckTest.yml
   ┣━ test
   ┃     ┗━ test.php
   ┗━ composer.json
```
- 今回は`action`がリポジトリになり、リポジトリ配下にある`.github`があると思うのでそこに`workflows`とymlファイル`PhpCheckTest.yml`を設置
- test/test.phpが今回チェックされるphpファイルになる。
- composer.jsonはphpstanをインストールする際に使うのでaction直下に設置

## 各ファイルの中身
### PhpCheckTest.yml
```yml
name: PHPStanTest
# Github Actionsが動く際のトリガー、ここではプルリクエスト[opened, synchronize, reopend]の際に発火
on: [pull_request]
jobs:
  phpstantest:
    runs-on: ubuntu-latest
    steps:
      #こちらはGithub謹製のアクション
      - uses: actions/checkout@v3
      - name: Setup PHP
        #こちらはサードパーティ製のアクションのアクション
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.2.34'
      #こちらもサードパーティ製のアクションのアクション
      - uses: reviewdog/action-setup@v1
        with:
          reviewdog_version: latest
      - name: Composer install
        run: composer install
      #Phpstanをインストール
      - name: phpstan install
        run: composer require phpstan/phpstan
      - name: run phpstan and reviewdog
        env:
          #Githubにコメントを書きこむため、トークンが必要
          REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: vendor/bin/phpstan analyse test --level max --memory-limit=-1 --error-format=raw --no-progress | reviewdog -reporter=github-pr-review -f=phpstan

```
### test.php
```php5
<?php

class RegularEmployee2
{
    /**
     * @var int
     */
    private $employee_id;
    /**
     * @var string
     */
    private $name;
    /**
     * @param $employee_id
     * @param $name
     */
    public function __construct($employee_id, $name)
    {
        $this->employee_id = $employee_id;
        $this->name = $name;
    }
    /**
     * @return int
     */
    public function getEmployeeId(): int
    {
        return $this->employee_id;
    }
    /**
     * @return mixed
     */
    public function getName(): mixed
    {
        return $this->name;
    }
}
$employee = new RegularEmployee("1","山田");
echo $employee->getEmployeeId();
echo $employee->getName();
```
### composer.json
```javascript
{
    "require": {
        "monolog/monolog": "1.0.*"
    }
}
```
## 動かしてみるでー

準備はできたので、こちらをプルリクにプッシュ、、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840826/73f0d203-66e9-8eaa-507f-ac0bc81a6dcd.png)

>Method RegularEmployee::__construct() has parameter $employee_id with no type specified.

>Method RegularEmployee::__construct() has parameter $name with no type specified.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2840826/e0876557-bd0d-702f-9b0e-46cd49d11818.png)

>Parameter #1 (mixed) of echo cannot be converted to string.

ちゃんと怒られましたね :smile: 
コメントもちゃんとできているのでOKそうですね :smile: 

## はまったとこ
- GHE（セルフホステッド ランナー）で最初は上記のyamlを実行しようとしていましたが、
サードパーティ製のアクションが使えないことを後で知り時間を使ってしまった。


- 地味にはまったのはGithubの設定にあるWorkflow permissionsがreadのみだとコメントが書きこめないのでそこらへんを触る必要があった。
参考記事：[リポジトリの GitHub Actions の設定を管理する/既定の GITHUB_TOKEN のアクセス許可の構成](https://docs.github.com/ja/repositories/managing-your-repositorys-settings-and-features/enabling-features-for-your-repository/managing-github-actions-settings-for-a-repository#configuring-the-default-github_token-permissions)



## まとめ

今回はGitHub Actionsの実行ファイルのyaml上でphpstanを動かしたりしたっかたので、
GHEではなくGithub.comで行いましたが、あらかじめphpstanを落としたりしておけば、
GHEでも解析を行う方法もあるのでまた、機会があればGHEでも挑戦したいと思います :smiley: 
見て頂いてありがとうございますー