CIのComposerバージョンが2になる(composer self-updateさせてた)せいでテストがコケてた話

今回の目標

CIをphp7.4に対応したい
(Herokuでは既に7.4.7だったので)

 

.circleci/config.ymlのimageをcircleci/php:7.4-node-browsers
にしたところ、composer-plugin-apiに関するエラーが発生しました。

Composer2でcomposer installを実行したのに、composer.lockでcomposer-plugin-apiは1系って書いてあるから互換性ないやないかーみたいなこと言ってる、おそらく。Composer2はcomposer-plugin-api2系使えってこと?

($ composer install -n –prefer-dist以下)

$ php --version
PHP 7.4.9 (cli) (built: Dec 26 2020 23:21:06) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Zend OPcache v7.4.9, Copyright (c), by Zend Technologies
with Xdebug v3.0.1, Copyright (c) 2002-2020, by Derick Rethans

$ composer --version
Composer version 2.0.8 2020-12-03 17:20:38

$ composer install -n --prefer-dist
Installing dependencies from lock file (including require-dev)
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

Problem 1
- ocramius/package-versions is locked to version 1.4.2 and an update of this package was not requested.
- ocramius/package-versions 1.4.2 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
Problem 2
- symfony/flex is locked to version v1.5.3 and an update of this package was not requested.
- symfony/flex v1.5.3 requires composer-plugin-api ^1.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
Problem 3
- ocramius/package-versions 1.4.2 requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.
- ocramius/proxy-manager 2.1.1 requires ocramius/package-versions ^1.1.1 -> satisfiable by ocramius/package-versions[1.4.2].
- ocramius/proxy-manager is locked to version 2.1.1 and an update of this package was not requested.

ocramius/package-versions only provides support for Composer 2 in 1.8+, which requires PHP 7.4.
If you can not upgrade PHP you can require composer/package-versions-deprecated to resolve this with PHP 7.0+.

You are using Composer 2, which some of your plugins seem to be incompatible with. Make sure you update your plugins or report a plugin-issue to ask them to support Composer 2.

 

そもそもCircleCIを導入しようとしてましたが、すでにTravis導入済みだったのでCircleCI導入はやめました。すみません💦(ただエラー内容はだいたい一緒だったと思います。)

当時設定していた.travis.ymlのPHPバージョンが7.1~7.3だったので7.4にしようと思います。

ローカルではcomposer1.8系を使っていたのでエラーはみられませんでしたが、
.travis.yamlではbefore_install: composer self-updateにしてたのでcomposer2系でcomposer installを実行しようとしていました。

エラー内容:

xxx/yyy n.n.n requires composer-plugin-api ^1.0.0 -> found composer-plugin-api[2.0.0] but it does not match the constraint.

composer.jsonのrequireにcomposer-plugin-api: "^1.0 || ^2.0"を追記で↑のエラーは回避できました!!!

参考:https://github.com/composer/composer/issues/8726

 

[おまけ]composer validate追記したらエラーでた

実際にでてたエラーログです。

$ composer validate
./composer.json is valid for simple usage with composer but has
strict errors that make it unable to be published as a package:
See https://getcomposer.org/doc/04-schema.md for details on the schema
name : The property name is required
description : The property description is required
symfony/debug-pack, symfony/maker-bundle, symfony/profiler-pack, symfony/test-pack are required both in require and require-dev, this can lead to unexpected behavior
require.symfony/debug-pack : unbound version constraints (*) should be avoided
require.symfony/orm-pack : unbound version constraints (*) should be avoided
require.symfony/profiler-pack : unbound version constraints (*) should be avoided
require.symfony/serializer-pack : unbound version constraints (*) should be avoided
require.symfony/test-pack : unbound version constraints (*) should be avoided
require.symfony/twig-pack : unbound version constraints (*) should be avoided

 

1) エラー内容:
xxx/yyy are required both in require and require-dev, this can lead to unexpected behavior

→ requireとrequire-devに同じpackageが書いてあるのがダメみたいなのでrequire-devから重複削除しました。

 

2) エラー内容:
name : The property name is required
description : The property description is required

→ composer.jsonにnameとdescriptionが必要とのことなので、追加しました。

 

3) エラー内容:
require.xxx/yyy: unbound version constraints (*) should be avoided

→ xxx/yyy: "*"はやめるべきとのことなのでバージョン指定をしました。

 

すべて(今回は3つ)のエラーを解消させ、

composer updateでcomposer.lockを更新して再度composer validateするvalidになりました〜🙌

$ composer validate
./composer.json is valid

 

メモ

  • 今回対応での差分

https://github.com/kin29/dj-kin29/pull/10/files

 

 

  • 後々考えてみたら、ローカル環境のcomposerバージョンを2にして、composer updateでcomposer.lockを更新してcommitで良かったのかも😅

composer-plugin-api:^2.0に対応してないpackageだったら、composer.jsonのrequireにcomposer-plugin-api: "^1.0 || ^2.0"追記が必要なのかも。

 

 

Travis CIで自動テスト(PHPUnit)をしてもらう。〜 入門編〜

やっと、テストコード…PHPUnitの使い方をわかってきた今日この頃です。
さらに、テストは自分でもやりますが、コミットしたら勝手にテストしてくれるCIがいると、頼れるうって思います。


↑これを(「passing」になってるのを)README.mdに貼りたかっただけなんですけどね!!

ということで
PHPUnit と Travis CI
の使い方を書きたいと思います。(自己流)

https://github.com/kin29/ci-test ←ここにソース置いています。

PHPUnit

テストコードにそって、テストしてくれるツール。

Travis CI

テスト/ビルド環境を作ってくれるツール。
ただし、環境を用意してくれるだけなのでビルド/テスト内容は「.travis.yml」に記述しなければならない。
CIツールの代表的なものである、Jenkinsさんはテストのための環境構築が必要となるが、その手間が省ける。(=>SaaS)

実践!GithubでコミットしたらTravisCIに自動でテスト(PHPUnit)をしてもらう。

PHPUnitの準備

$ mkdir ci-test 
$ cd ci-test/

composer.json をつくる。composer initだと対話式でできます。
依存関係も適切に設定してくれるので、自分で生にcomposer.json書くより安全な気がします。
今回でいうとPHPとPHPunitのバージョン関係もここでいい感じにしてくれました。

$ composer init
                                            
  Welcome to the Composer config generator  
                                          

This command will guide you through creating your composer.json config.

Package name (/) [kin29/ci-test]:
Description []: it is ci-test.
Author [kin29 <kin29.com@gmail.com>, n to skip]: 
Minimum Stability []: 
Package Type []: 
License []: MIT

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? 
Search for a package: php
Enter the version constraint to require (or leave blank to use the latest version): >=7.0.0
Search for a package: 
Would you like to define your dev dependencies (require-dev) interactively [yes]? 
Search for a package: phpunit/phpunit
Enter the version constraint to require (or leave blank to use the latest version): 
Using version ^7.3 for phpunit/phpunit
Search for a package: 

{
    "name": "kin29/ci-test",
    "description": "it is ci-test.",
    "require": {
        "php": ">=7.0.0"
    },
    "require-dev": {
        "phpunit/phpunit": "^7.3"
    },
    "license": "MIT",
    "authors": [
        {
            "name": "kin29",
            "email": "kin29.com@gmail.com"
        }
    ]
}

Do you confirm generation [yes]? 
Would you like the vendor directory added to your .gitignore [yes]? 

$ ls
composer.json   //できた!!autoloadとかはあとで追加する。
$ composer install
$ ls
composer.json   composer.lock   vendor
$ vi composer.json  //autoload追加
//以下を追記
  "autoload": {
      "psr-4": {
            "App\\": "src/"
        }
  },
  "autoload-dev": {
      "psr-4": {
            "Test\\": "tests/"
      }
  }
$ composer update   //autoloadを適用させる
//実装とテストを書く。構成こんな感じ
$ tree src/ tests/ bootstrap.php
src/
└── Kin29.php
tests/
└── Kin29Test.php
bootstrap.php 

0 directories, 2 files
//phpunit.xmlを作る。
$ vi phpunit.xml

<phpunit bootstrap="./bootstrap.php">
    <testsuites>
        <testsuite name="Ci Test">
            <file>tests/Kin29Test.php</file>
        </testsuite>
    </testsuites>
</phpunit>
//テスト実行→成功!
//これを、コミットした時、自動でテスト実行してもらうようにする(→CIの役目)
$ phpunit tests/
PHPUnit 7.2.4 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

Time: 296 ms, Memory: 10.00MB

OK (1 test, 1 assertion)

Travis CIの準備

$ vi .travis.yml //ビルド・テストの設定ファイルを作成
language: php
php:
 - 7.1
 - 7.2

before_script:
 - composer install

script:
 - phpunit tests/
$ git add .
$ git commit -m 'travis-ci,phpunit追加'
$ git push origin master

ビルド・テスト開始!!!

Githubのリポジトリにコミットすると、ビルド・テストが始まります。
↑trigger word設定で変更可能です。

「passing」になれば、テスト合格です!
「failed」になってもコンソールのログが見れるので、原因を突き止めやすいです!
PHPとPHPUnitのバージョンがあってないって、何回も言われました。
CIが自分では知らないことも気づいてくれて教えてくれて助かります。