TravisCI で PHP7 のビルドがエラーになる #TravisCI #php

(2022/03/17 追記)

フォーラムで話題になっており、サポートからも連携されたようなので、そのうち直りそう。 travis-ci.community

問題

php7.4 で TravisCI が突然コケるようになってしまった。

php: error while loading shared libraries: libargon2.so.1: cannot open shared object file: No such file or directory

.travis.yml では 7.4 を指定していた。

language: php
php:
  - 7.4

最後にうまくいったときのビルドと比べてみると、どうも PHP のパッチバージョンが異なっているようだ。

成功した時は 7.4.22 だったが、 7.4.28 になっている。

デバッグビルドをしてみると、 phpenv が 7.4.28 をインストールしていることが分かる。

ログをよく見ると、そもそも php がうまくインストール出来ていないようだ。

$ phpenv versions
  system
  5.6
  5.6.40
  7.1
  7.1.27
  7.2
  7.2.15
* 7.4 (set by /home/travis/.phpenv/version)
  7.4.28
  hhvm-stable
  hhvm
$ phpenv global 7.4.28 2>/dev/null
7.4.28 is not pre-installed; installing
Downloading archive: https://storage.googleapis.com/travis-ci-language-archives/php/binaries/ubuntu/16.04/x86_64/php-7.4.28.tar.bz2
9.39s$ curl -sSf --retry 5 -o archive.tar.bz2 $archive_url && tar xjf archive.tar.bz2 --directory /
0.01s0.02s$ phpenv global 7.4.28
php: error while loading shared libraries: libargon2.so.1: cannot open shared object file: No such file or directory

検証

Travis はパッチバージョンも指定できるので実際に試してみると、7.4.27 以降は同様のエラーが発生してしまうようだ。

version result
7.4.22 成功
7.4.26 そもそも Travis で指定不可なので、エラー(404)
7.4.27 エラー
7.4.28 エラー
language: php
php:
  - 7.4.22
  - 7.4.26
  - 7.4.27
  - 7.4.28
script:
  - php -v

検証結果は↓

https://app.travis-ci.com/github/su-kun1899/sandbox-travisci/builds/247900433

対応

とりあえず、 7.4.22 のバージョンをベタ指定することで暫定回避できる。

根本原因がどこにあるか分からないけど、 PHP8 にするなり GitHub Actions にお引越しするなりした方がよさそう。。

Building a PHP project - Travis CI

AWS SDK for PHP を Mock する #php

AWS SDK を使って Amazon SNS 使用箇所のテストを書こうとしていたところ、 PHPUnit の Mock を無邪気に使ったら怒られてしまった。

phpunit Trying to configure method "publish" which cannot be configured because it does not exist, has not been specified, is final, or is static

どうやら PHPUnit で簡単には Mock できない構造のようだが、調べてみると MockHandler を使えば良さそうだ。

Handlers and Middleware in the AWS SDK for PHP Version 3 - AWS SDK for PHP

<?php
// handler を作成
$mock = new MockHandler();

// mock の中身を定義
$mock->append(new Result(['foo' => 'bar']));

// 例外も返せる
$mock->appendException(
    new SnsException('Mock exception', $this->createStub(Command::class))
);

// client を生成
$client = new SnsClient(
    [
        'version' => cr('ExServices.Sns.version'),
        'region' => cr('ExServices.Sns.region'),
        // handler を渡してあげる
        'handler' => $mock,
    ]
);

// mock した結果は queue 方式で実行される
$client->publish(['Message' => 'dummy']);

// queue 方式なので、2回目は例外が発生する
$client->publish(['Message' => 'dummy']);

ここまではドキュメントの通りなのだが、認証情報が未設定だと CredentialsException が発生してしまう。

Aws\Exception\CredentialsException : Error retrieving credentials from the instance profile metadata service. (cURL error 7: Failed to connect to 169.254.169.254 port 80 after 0 ms: Connection refused (see https://curl.haxx.se/libcurl/c/libcurl-errors.html))

どこまで何をテストしたいかによるが、手軽に SnsClient を Mock したいだけなら匿名クライアントにすれば回避できる。

Creating Anonymous Clients - AWS SDK for PHP

<?php
// client を生成
$client = new SnsClient(
    [
        'version' => cr('ExServices.Sns.version'),
        'region' => cr('ExServices.Sns.region'),
        'handler' => $mock,
        // credentials を false にすれば匿名クライアントになる
        'credentials' => false,
    ]
);

Goland でファイル名が main じゃないとブレークポイントが貼れない? #Goland #golang

問題

docker-compose を使って Goland でリモートデバッグを試していた。

エントリポイント (main関数) のあるファイルだけブレークポイントを貼れない。

Cannot find debugger path for /path/to/server.go みたいなメッセージが出て、ブレークポイントが無効にされてしまう。

他のファイルにはブレークポイント貼れるし、実際に実行すると止まる。

f:id:su-kun1899:20220222235452p:plain

解決策

main関数のあるファイルの名前が server.go だったので、 main.go に名前を変えたところ問題は解消した。

原因

分からない。。

エントリポイントのファイル名は main.go じゃないとダメなんだろうか?

Goland の問題なのか、 delve の問題なのか、自分が何か間違っているのか。。

clasp の push で package.json が求められる #gas

GAS の実装や管理には clasp が便利なんですが、いざ clasp push で反映しようとしたらエラーが出て怒られた。

ENOENT: no such file or directory, open 'package.json'

複数の App Script をまとめて管理するために、下記のようなディレクトリ構造にしていたのが原因っぽい。

※ルートには package.json があるが、スクリプト本体のディレクトリにはない状態

.
├── HogeScript
│   ├── clasp.json
│   ├── appscript.json
│   └── hoge.ts
├── FugaScript
│   ├── clasp.json
│   ├── appscript.json
│   └── fuga.ts
└── package.json

clasp のリポジトリ同じ問題と思われる Issue があって、「空の package.json 作ると解消」とのことなので、試してみると解消した。

https://github.com/google/clasp/issues/875

空の package.json

{}
.
├── HogeScript
│   ├── clasp.json
│   ├── appscript.json
│   ├── hoge.ts
│   └── package.json    ←ここにも作ってあげる
├── FugaScript
│   ├── clasp.json
│   ├── appscript.json
│   ├── fuga.ts
│   └── package.json    ←ここにも作ってあげる
└── package.json
$ cd HogeScript
$ clasp push

Go の Web アプリケーションを Heroku にデプロイしたメモ #golang #heroku

概要

基本的な流れは公式に従ってやってみれば問題ないのだろうけど、自分で作ったものをデプロイしようとしたらちょこちょこ詰まったので備忘録。

https://devcenter.heroku.com/articles/getting-started-with-go https://github.com/heroku/go-getting-started

サブディレクトリのみ対象のときは subtree で push

これは自分がディレクトリ構造をコネてたのが原因なのだが、 git リポジトリとアプリケーションのディレクトリ構造があってないと、うまくデプロイできない。

デプロイ対象がサブディレクトリにあるようなケースでは subtree を使って push する。

git subtree push --prefix my-app/ heroku main

subtree では force push できない

いわゆる force-push ができない状況になると、 heroku に push できなくなる。

subtree には force オプションがないので、 subtree split でどうにかする。

git push heroku `git subtree split --prefix myapp mainr`:main --force

stackoverflow.com

main 以外のブランチをデプロイするとき

my-branch:main のようにしてあげないと skip される。

Postgres への接続

接続情報を Config Vars に設定

Postgres add-on だと DATABASE_URL という変数に格納されるが、接続文字列をそのまま使わなかったので、バラして別名の変数に入れ直した。

DATABASE_URL は下記の形式なので、それぞれ設定し直した。

postgres://{user}:{password}@{hostname}:{port}/{database-name}

ちなみに heroku config で Config Vars は取得できる。

Heroku CLI のインストール

Mac だと homebrew で入る。

<200b>brew tap heroku/brew && brew install heroku

heroku autocomplete しておくと補完をしてくれるようになる。

おまけ

homebrew で入れたやつの completion シュッとやる方法がドキュメントにあった。

docs.brew.sh

heroku run

heroku run bash やると直接コマンド叩ける。

調査のとき便利。

ssh-add コマンドの -K オプションが deprecated になってた

無邪気に ssh-add -K したら、 WARNING が出てることに気づいた。

WARNING: The -K and -A flags are deprecated and have been replaced
         by the --apple-use-keychain and --apple-load-keychain
         flags, respectively.  To suppress this warning, set the
         environment variable APPLE_SSH_ADD_BEHAVIOR as described in
         the ssh-add(1) manual page.

メッセージの通りだけれど、 -K は deprecated になったようだ。

代わりに --apple-use-keychain を使えば OK 。

「先延ばしと挫折をなくす計画術 無敵の法則」を読んだ

Twitter のタイムラインで言及されてて少し気になり、 Kindle でセールだったのもあり読んでみた。

著者のドヤと煽りが満載な雰囲気はあまり好みではないのだが、この類の本を何冊か読んで、自己啓発本というのはそういうものなんだなと理解してきた。

徹底的にスケジュール管理していくアプローチは、同意できるところや参考になる点もあるものの、かなり極端ではあるので、価値観は正直共感できないところも多かった。

それでも「ここまでは流石にやらないけど、これくらいはやってみるかなぁ」という気持ちになったので、読んでよかったかな。