GitLabでcomposerライブラリを公開する話

今回は、PHP言語のcomposerの話ですね

前回、composerでオリジナルパッケージを作成する話にてGitHubにて後悔する方法を紹介しましたが、オフプロミスの場合、私の大好きGitLabを使うわけです。GitHubと同じでしょう?なんて思われるかもしれませんが、全然違います。

GitLabではグループのパッケージリポジトリで管理してくれます

そして、composer以外でmaven(java)とかしてくれるのは嬉しいですね

初めに、公開ライブラリを作成し..

<?php
namespace org\mmpp\util;

class StringUtil
{
    public static function isNull($value) : bool{
        if(empty($value)){
            return true;
        }
        return $value === null;
    }
}

はい、こんなライブラリはいらないシリーズ、入力値が空かを判断していますw

試験は、こち….

<?php
namespace Unit;

use org\mmpp\util\StringUtil;
use PHPUnit\Framework\TestCase;

class StringUtilTest extends TestCase
{
    public function test_isNull(){
        $this->assertTrue(StringUtil::isNull(''));
        $this->assertTrue(StringUtil::isNull(null));
    }
}

うん、動くだけですw

次にポイントですが、.gitlab-ci.ymlを設定します

stages:
  - deploy
deploy:
  only:
    - tags
  stage: deploy
  script:
    - 'curl --header "Job-Token: $CI_JOB_TOKEN" --data "tag=$CI_COMMIT_TAG" $SERVER_URL/api/v4/projects/$CI_PROJECT_ID/packages/composer'

はい!今回はtag作成のみでやってみました。
作業のJob-Tokenは、$CI_JOB_TOKENに入っています。
送るデータのtagは$CI_COMMIT_TAGです。

さて、$SERVER_URLですが、これはrunnerに渡している変数です。

こんな感じで指定します。(サーバ名だから、別のサーバを指定するときに便利なように)

実際動いているJobはこちら

v1.0.1とv1.0.2がOKになっております。

jobのログはこんな感じ

この実行ではちょっとパラメタを確認しましたが、201で正常終了します。

gitでのtagのうち方は… 今回外します

次はこのライブラリを使ってみましょう!

composerを初期化して利用します…初期化は initを使えばOK

次にポイントですがhttp以外を利用する方法ですが次のコマンド…

composer config secure-http false

次に、リポジトリを利用します…

サイトの情報を利用すると… ダメです。(引っかかった!;;)

正しくはこちらです

composer config repositories.4 composer http://192.168.1.203:9080/api/v4/group/4/-/packages/composer/

ここでのポイントは
・「http://192.168.1.203:9080」自分のサーバとポートにしてください
・ 4 : これがポイントグループ番号を利用します。repositoriesとgroupに同じ値を入れます。

グルプ番号の確認方法はこちら

これが一番悩みました

そして、ライブラリを使う系です

composer req mmpp/util

実際に出来上がるソースはこちら
composer.json

{
    "name": "mmpp/util_sample",
    "authors": [
        {
            "name": "wataru",
            "email": "wataru775@gmail.com"
        }
    ],
    "require": {
        "mmpp/util": "^1.0"
    },
    "config": {
        "secure-http": false
    },
    "repositories": [{
            "type": "composer",
            "url": "http://192.168.1.203:9080/api/v4/group/4/-/packages/composer/"
        }]
}

更新すると

$ composer update
Loading composer repositories with package information
Warning: Accessing 192.168.1.203 over http which is an insecure protocol.
Updating dependencies
Lock file operations: 35 installs, 0 updates, 0 removals
  - Locking doctrine/instantiator (1.4.0)
  - Locking mmpp/util (1.0.2)
  - Locking myclabs/deep-copy (1.10.2)
  - Locking nikic/php-parser (v4.10.3)
  - Locking phar-io/manifest (2.0.1)
  - Locking phar-io/version (3.0.3)
  - Locking phpdocumentor/reflection-common (2.2.0)
  - Locking phpdocumentor/reflection-docblock (5.2.2)
  - Locking phpdocumentor/type-resolver (1.4.0)
  - Locking phpspec/prophecy (1.12.1)
  - Locking phpunit/php-code-coverage (9.2.5)
  - Locking phpunit/php-file-iterator (3.0.5)
  - Locking phpunit/php-invoker (3.1.1)
  - Locking phpunit/php-text-template (2.0.4)
  - Locking phpunit/php-timer (5.0.3)
  - Locking phpunit/phpunit (9.5.0)
  - Locking sebastian/cli-parser (1.0.1)
  - Locking sebastian/code-unit (1.0.8)
  - Locking sebastian/code-unit-reverse-lookup (2.0.3)
  - Locking sebastian/comparator (4.0.6)
  - Locking sebastian/complexity (2.0.2)
  - Locking sebastian/diff (4.0.4)
  - Locking sebastian/environment (5.1.3)
  - Locking sebastian/exporter (4.0.3)
  - Locking sebastian/global-state (5.0.2)
  - Locking sebastian/lines-of-code (1.0.3)
  - Locking sebastian/object-enumerator (4.0.4)
  - Locking sebastian/object-reflector (2.0.4)
  - Locking sebastian/recursion-context (4.0.4)
  - Locking sebastian/resource-operations (3.0.3)
  - Locking sebastian/type (2.3.1)
  - Locking sebastian/version (3.0.2)
  - Locking symfony/polyfill-ctype (v1.20.0)
  - Locking theseer/tokenizer (1.2.0)
  - Locking webmozart/assert (1.9.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 35 installs, 0 updates, 0 removals
  - Installing sebastian/version (3.0.2): Extracting archive
  - Installing sebastian/type (2.3.1): Extracting archive
  - Installing sebastian/resource-operations (3.0.3): Extracting archive
  - Installing sebastian/recursion-context (4.0.4): Extracting archive
  - Installing sebastian/object-reflector (2.0.4): Extracting archive
  - Installing sebastian/object-enumerator (4.0.4): Extracting archive
  - Installing sebastian/global-state (5.0.2): Extracting archive
  - Installing sebastian/exporter (4.0.3): Extracting archive
  - Installing sebastian/environment (5.1.3): Extracting archive
  - Installing sebastian/diff (4.0.4): Extracting archive
  - Installing sebastian/comparator (4.0.6): Extracting archive
  - Installing sebastian/code-unit (1.0.8): Extracting archive
  - Installing sebastian/cli-parser (1.0.1): Extracting archive
  - Installing phpunit/php-timer (5.0.3): Extracting archive
  - Installing phpunit/php-text-template (2.0.4): Extracting archive
  - Installing phpunit/php-invoker (3.1.1): Extracting archive
  - Installing phpunit/php-file-iterator (3.0.5): Extracting archive
  - Installing theseer/tokenizer (1.2.0): Extracting archive
  - Installing nikic/php-parser (v4.10.3): Extracting archive
  - Installing sebastian/lines-of-code (1.0.3): Extracting archive
  - Installing sebastian/complexity (2.0.2): Extracting archive
  - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive
  - Installing phpunit/php-code-coverage (9.2.5): Extracting archive
  - Installing symfony/polyfill-ctype (v1.20.0): Extracting archive
  - Installing webmozart/assert (1.9.1): Extracting archive
  - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive
  - Installing phpdocumentor/type-resolver (1.4.0): Extracting archive
  - Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive
  - Installing doctrine/instantiator (1.4.0): Extracting archive
  - Installing phpspec/prophecy (1.12.1): Extracting archive
  - Installing phar-io/version (3.0.3): Extracting archive
  - Installing phar-io/manifest (2.0.1): Extracting archive
  - Installing myclabs/deep-copy (1.10.2): Extracting archive
  - Installing phpunit/phpunit (9.5.0): Extracting archive
  - Installing mmpp/util (1.0.2): Extracting archive
5 package suggestions were added by new dependencies, use `composer suggest` to see details.
Generating autoload files
26 packages you are using are looking for funding.
Use the `composer fund` command to find out more!

はい、入りましたね。
Installing mmpp/util (1.0.2): Extracting archive

使ってみましょう

<?php
namespace Unit;

use org\mmpp\util\StringUtil;
use PHPUnit\Framework\TestCase;

class StringUtilTest extends TestCase
{
    public function test_isNull(){
        $this->assertTrue(StringUtil::isNull(''));
        $this->assertTrue(StringUtil::isNull(null));
    }
}
$ ./vendor/bin/phpunit tests/
PHPUnit 9.5.0 by Sebastian Bergmann and contributors.

..                                                                  2 / 2 (100%)

Time: 00:00.004, Memory: 4.00 MB

OK (2 tests, 10 assertions)

試験通りました!ちょっと多いですがw

はい、こんな感じで今回はGitLabでcomposerのライブラリを公開してみました。結構、おもしろいなぁ〜なんて思いました。
ちなみに、tag単位での公開方法がわかったのでci環境のもう少し勉強できるかな。
あと… phpunit走っていないやw
ついでに、レポートをタグ単位で公開スレば結構便利な情報になるね。