EC-CUBE 4.0.3 -> 4.0.4 へのアップデート @ OpenBSD
Tags: eccube, ecommerce, openbsd, migration
Published: 2020-07-10 11:45:57

[EC-CUBE](https://ec-cube.net) [4.0.4](https://github.com/EC-CUBE/ec-cube/releases/tag/4.0.4) が 2020 年 6 月 17 日にリリースされました。
PHP 7.4 のサポートが行われました。さらに Cookie の SameSite 属性への対応なども行われています。

[OpenBSD](https://www.openbsd.org) にインストールしていた EC-CUBE を 4.0.3 -> 4.0.4 にアップデートしました。その手順を記します。
[公式ドキュメント](https://doc4.ec-cube.net/update)をもとにしています。

#### 環境

- OS: OpenBSD 6.7 amd64
- Web サーバー: OpenBSD [httpd](https://man.openbsd.org/httpd.8)
- AP サーバー: [PHP](https://www.php.net/) 7.3 (-> 一部 7.4) + [PHP-FPM](https://php-fpm.org/)
- カートシステム: EC-CUBE 4.0.3 -> 4.0.4
- DB: [MariaDB](https://mariadb.org/) 10.4

#### 4.0.3 -> 4.0.4 変更ファイル一覧

[Github](https://github.com/) で Tag 間の差分を見ることで確認できます:
https://github.com/EC-CUBE/ec-cube/compare/4.0.3...4.0.4?w=1#files_bucket:

差分を整理して、手順用の一覧メモを作成しました:

```
# 変更フォルダ（= フォルダ内複数ファイル）
app/DoctrineMigrations/
app/config/eccube/
html/template/
src/Eccube/

# 変更ファイル
.dockerignore
.env.dist
.htaccess
composer.json
composer.lock
docker-compose.yml
gulpconfig.js.sample
gulpfile.js
nginx.conf.sample
package-lock.json
package.json
symfony.lock
web.config
Dockerfile
var/.htaccess
app/Customize/Resource/config/.gitkeep
app/Customize/Resource/locale/.gitkeep

# Git の変更履歴はあるが、ダウンロードパッケージには含まれないファイル群
codeception/
tests/
.editorconfig
.github/.htaccess
.github/workflows/action.yml
.gitignore
.travis.yml
README.md
```

## アップデート手順

#### 1. メンテナンスモードを有効にする

```console
$ touch eccube/.maintenance
```

ファイルバックアップ時のパフォーマンスを良くするために、事前に cache をクリアしておきます。

```console
$ cd eccube
$ # php-7.4 failed on EC-CUBE 4.0.3
$ doas -u www php-7.3 bin/console cache:clear --no-warmup
$ cd ../
```

#### 2. サイトのバックアップ

```console
$ mkdir eccube-4.0.3-bk
$ cd eccube-4.0.3-bk

$ doas -u www mysqldump $DATABASE -u $DB_USER -p -h $DB_HOST $DATABASE > database-backup.sql
$ gzip database-backup.sql

$ doas tar cfzp eccube-4.0.3.tgz ../eccube
tar: Removing leading "../"
...

$ cd ../
```

以降は `eccube` ディレクトリの中で実施します。

```console
$ cd eccube
```

#### 3. EC-CUBEのソースファイルをバージョンアップしたものに置き換え

開発時のテスト用途である tests / codeception 関連は対象外です。Github の差分には現れますが、ダウンロードしたパッケージには含まれていません。同様に .git / .travis 関連や LICENSE.txt / README.md も対象外です。

##### ディレクトリ

```console
$ set -l arr 'bin' 'vendor' 'dockerbuild'

$ for x in \
    'app/DoctrineMigrations' \
    'app/config/eccube' \
    'html/template' \
    'src/Eccube' \
; \
    echo $x; \
    doas rm -rf ./$x; \
    doas -u www cp -r ~/eccube-4.0.4/$x ./$x; \
    if contains $x $arr; doas chown -R $MY_USER: ./$x; end; \
end
```

<small>
備考: for 文 / if 文は [fish](https://fishshell.com/) シェルの記法です。if contains による存在チェックは、事前に配列を宣言する方法と直接配列を指定する方法の 2 通りで書けます。
</small>

1. <small>事前に配列を宣言する方法</small>
    ```sh
    set -l arr 'bin' 'vendor'
    if contains $x $arr; doas chown -R $MY_USER: ./$x; end
    ```
2. <small>直接配列を指定する方法</small>
    ```sh
    if contains $x {'bin' 'vendor'}; doas chown -R $MY_USER: ./$x; end
    ```

##### ファイル

```console
$ for x in \
    '.dockerignore' \
    '.env.dist' \
    'docker-compose.yml' \
    'gulpconfig.js.sample' \
    'gulpfile.js' \
    'nginx.conf.sample' \
    'package-lock.json' \
    'package.json' \
    'symfony.lock' \
    'web.config' \
    'Dockerfile' \
; \
    echo $x; \
    doas rm $x; \
    doas -u www cp ~/eccube-4.0.4/$x ./$x; \
end
```

#### 4. 個別ファイル差し替え

##### composer.json / composer.lock

```console
$ for x in \
    'composer.json' \
    'composer.lock' \
; \
    echo $x; \
    doas -u www cp -f ~/eccube-4.0.4/$x ./$x; \
    if contains $x {'composer.json' 'composer.lock'}; doas chown $MY_USER: ./$x; end; \
end
```

##### .htaccess

- .htaccess
    - httpd.conf の条件変更: block 対象を追加 = *.sample
- var/.htaccess
    - httpd.conf の変更対象は含まれていませんでした。

##### app/Customize/Resource

```console
$ doas -u www cp -r ~/eccube-4.0.4/app/Customize/Resource ./app/Customize/
```

##### その他（私的な都合によるもの）

'app/config/eccube' が今回の変更対象に含まれていますが 'app/config/eccube/packages/doctrine.yaml' に独自の変更を加えていたので、ファイル更新後に差替えました。

#### 5. composer.json/composer.lockの更新

```console
$ php-7.3 bin/console eccube:composer:require-already-installed
$ # Here, updated: php-7.3 -> php-7.4
$ doas -u www php-7.4 bin/console cache:clear --no-warmup
```

<small>
補足: EC-CUBE 4.0.3 でエラーが出ていた php-7.4 によるキャッシュクリア処理が、4.0.4 にアップデートした後は成功するようになりました。
しかしその後の操作や Web ページ描画時にエラーが出たため、php-7.4 への切替えは行なえませんでした。Web ページ描画時のエラーは `FileLoaderLoadException`: `purchaseflow.yaml" does not contain valid YAML: Unexpected characters` です。別途詳細を確認する必要が残りました。
</small>

#### 6. スキーマ更新/マイグレーション

```console
$ php-7.3 bin/console doctrine:schema:update --force --dump-sql
$ php-7.3 bin/console doctrine:migrations:migrate
```

#### 7. プロキシの再生成

スキップしました。（4.0.2 -> 4.0.3 へのアップデート時のみ必要な手順です。）

#### 8. フロントテンプレートファイルの更新

対象はありませんでした:
https://github.com/EC-CUBE/ec-cube/pulls?q=is%3Apr+label%3Aaffected%3Atemplate+is%3Aclosed+milestone%3A4.0.4

#### 9. メンテナンスモードを無効にする

```console
$ rm ./.maintenance
```

#### 10. その他

特別な操作は必要ありませんでした:

> 4.0.3 -> 4.0.4 のアップデートに特記事項はありません。

以上でアップデートは完了です。