フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援
フリーランスのためのネットビジネス専門学校 ネットで独立開業を目指す人を応援

学生時代に作った学園祭のサイトのお話

やりたいこと

  • 新規プロジェクトをPHPで作ることになりました
  • テストをしっかりやりたく、PHP でのテストには以下が有効だと結論づけました
  • Phan
  • 今回は、このPhanのテストをCircleCIで動かすことを目的とします

早速ですが実装部分

.circleci/config.yml

プログラム

jobs:
  build:
    docker:
      - image: circleci/php:7.1-node-browsers 
    environment:
    working_directory: ~/repo 
    steps:
      - checkout 
      - run: sudo apt install -y zlib1g-dev ruby
      - run: sudo docker-php-ext-install zip
      - run:
          name: Install php-ast
          command: |
            cd ~
            git clone https://github.com/nikic/php-ast
            cd php-ast
            phpize
            ./configure
            make
            sudo make install
            echo -e "extension=ast.so" | sudo tee /usr/local/etc/php/php.ini > /dev/null
            cd ../
      - run: sudo composer self-update
      - run: sudo gem install bundler
      # php cache
      - restore_cache: 
          keys:
            - composer-v1-
            - composer-v1-
      - run: composer install -n --prefer-dist
      - save_cache: 
          key: composer-v1-
          paths:
            - vendor
      # ruby cache
      - restore_cache:
          keys:
            - rails-bundle-v2-
            - rails-bundle-v2-
      - run:
          name: Bundle Install
          command: bundle check || bundle install
      - save_cache:
          key: rails-bundle-v2-
          paths:
            - vendor/bundle

      - run: ./vendor/bin/phpunit tests
      - run: ./bin/phan_inspect.sh
      - store_artifacts:
          path: docs/coverage
          destination: coverage

解説

  • 基本的にCircleCI が用意してくれた物を使ってます
  • php-ast のinstall はcommand を駆使ししてがんばります。
    • 汚いのでいいやり方あれば教えて欲しい
  • saddler を動かすために、ruby 入れたり、bundler いれたりしてます
    • ruby とPHP が入ったimage 作れよという話もありますが、基本的にCircleCIが用意してくれた物を使おうという縛りプレイ中だったので、作りませんでした

composer.json

プログラム

{
    "autoload": {
        "psr-4": {
            "Sample\": "src/"
        }
    },
    "require": {},
    "require-dev": {
        "phpunit/phpunit": "7.0.*",
        "phan/phan": "^1.1"
    },
    "scripts": {
        "update-coverage": "vendor/bin/phpunit --bootstrap tests/bootstrap.php --configuration tests/phpunit.xml --coverage-html=docs/coverage"
    }
}

解説

  • あまり解説することないです
  • phan 書きました

Gemfile

プログラム

source "https://rubygems.org"

gem "checkstyle_filter-git"
gem "saddler"
gem "saddler-reporter-github"

解説

  • dev 限定しなかったのはCircleCI でしか使わないと思ったからです
  • dev 限定してもいいと思います

bin/phan_inspect.sh

プログラム

#!/bin/bash

echo "Start"

TARGET_BRANCH=$CIRCLE_BRANCH
COMMON_PULL_REQUEST=$CIRCLE_PULL_REQUEST

if [[ ${CIRCLE_PULL_REQUEST} =~ ([0-9]+)$ ]]; then
  PULL_REQUEST_NUM=${BASH_REMATCH[1]}
fi

url="https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME/pulls/$PULL_REQUEST_NUM"

TARGET_BRANCH=$(
  curl -s -H "Authorization: token $GITHUB_ACCESS_TOKEN" "$url" | jq '.base.ref' | tr -d '"'
)

TARGET_LIST=`git diff --name-only origin/$TARGET_BRANCH | grep -e '.php$'`

if [ -z "$TARGET_LIST" ]; then
    echo "PHP file not changed."
    exit 0
fi

RESULT=`vendor/bin/phan -f $TARGET_LIST -m checkstyle`

RESULT_TEXT=`echo $RESULT | bundle exec saddler report 
    --require saddler/reporter/text 
    --reporter Saddler::Reporter::Text`
if [ -n "$RESULT_TEXT" ]; then
    if [ -n "$COMMON_PULL_REQUEST" ]; then
        `echo $RESULT | bundle exec saddler report 
            --require saddler/reporter/github 
            --reporter Saddler::Reporter::Github::PullRequestReviewComment`
    fi

    echo ""
    echo "An error has been detected,this following:"
    echo "$RESULT_TEXT"
    exit 1
else
    echo "Passed"
    exit 0
fi

解説

  • Github でプルリクが来たらphan が動き、コメントまでつけてくれます
  • GITHUB_ACCESS_TOKEN をCircleCI 上の管理画面より設定して下さい

    • private リポジトリを想定してるので、public の人はいらないかも
  • 変化部分だけをレビューしてくれます
  • Saddler::Reporter::Text でCircleCIの実行結果にもコメントを残すようにしました

おわりに

  • 初めてCircleCI2.0 触りましたが、凝ったことをしようとすると設定が汚くなるなと思いました
  • 一つの機能を一つのリポジトリに詰め込みすぎず、いい感じに分割できれば使いやすそうですね!
[紹介元] PHPタグが付けられた新着投稿 – Qiita 学生時代に作った学園祭のサイトのお話

コメント

記事に戻る

コメントを残す