Upgrade to Pro — share decks privately, control downloads, hide ads and more …

長期運用のためのDrupal開発入門

 長期運用のためのDrupal開発入門

DrupalCon Nara で発表しました。

Avatar for kazukomurata

kazukomurata

November 14, 2025
Tweet

More Decks by kazukomurata

Other Decks in Technology

Transcript

  1. セマンティックバージョニング バージョン番号を MAJOR . MINOR . PATCH で表すルール MAJOR(メジャー): 後方互換性を壊す変更

    10 → 11 MINOR(マイナー): 後方互換性を保ったまま新機能を追加 10.2 → 10.3 PATCH(パッチ) バグ修正やセキュリティ修正(10.2.5 → 10.2.6) 13
  2. Drupal Core リリースの大枠 メジャーバージョンのリリース ・・・ 2年に1回 (偶数年) マイナーバージョンのリリース ・・・ 半年に1回

    (6月, 12月) 新マイナーバージョンリリースされると、2つ前のバージョンがEOL [1] https://www.drupal.org/about/core/policies/core-release-cycles/release-process-overview 14
  3. リリース参考 例: 2025/11/16 現在、サポートバージョン 10系 ・・・ 10.4, 10.5 11系 ・・・

    11.1, 11.2 10.6 と 11.3 がリリースされたら、10.4 と 11.1 は EOL 15
  4. 16

  5. 22

  6. 23

  7. 30

  8. 31

  9. ローカル開発環境 DDEV 自由に壊して戻せる開発環境を持つとお試ししやすい 2025年の今、ローカル環境はDDEV がおすすめ Docker、Docker Composeベース アドオンが豊富、Docker Compose ライクにコンテナ追加も可能

    MailPit でメール捕捉が可能 Composer、Node コマンドがコンテナ内で実行可能 ローカルマシンにPHP、Nodeインストールしなくていい [1] https://ddev.com/ 32
  10. DDEVでのDrupalの環境作成 # composerでソース取得 composer create-project drupal/recommended-project my-project cd my-project #

    DDEVセットアップ・スタート ddev config ddev start # 環境情報確認 ddev status Drupal公式: https://www.drupal.org/docs/getting-started/installing-drupal/install-drupal-using-ddev-for-local- development 34
  11. .ddev/config.yaml サンプル name: drupal-example-2025 type: drupal11 docroot: ./docroot php_version: "8.4"

    webserver_type: nginx-fpm xdebug_enabled: false additional_hostnames: [] additional_fqdns: [] database: type: mariadb version: "10.11" use_dns_when_possible: true composer_version: "2" web_environment: [] corepack_enable: true 35
  12. composer.json その1 repositories には、メインリポジトリ Packagist 以外から配信さ れているパッケージ元のURLを定義 "repositories": [ {

    "type": "composer", "url": "https://packages.drupal.org/8" } ], 参考 https://github.com/drupal/recommended-project/blob/11.x/composer.json [1] https://packagist.org/ 39
  13. 再掲:セマンティックバージョニング バージョン番号を MAJOR.MINOR.PATCH で表すルール MAJOR(メジャー): 後方互換性を壊す変更 10 → 11 MINOR(マイナー):

    後方互換性を保ったまま新機能を追加 10.2 → 10.3 PATCH(パッチ) バグ修正やセキュリティ修正(10.2.5 → 10.2.6) [1] https://semver.org/lang/ja/ [2] https://www.drupal.org/docs/getting-started/understanding-drupal/understanding-drupal-version-numbers 41
  14. バージョン範囲指定 バージョンアップデートしたい時の挙動がバージョン先頭の ^ と ~ で変わることに注意 ^ (キャレット) 次のメジャー未満で更新 ^10.4.0

    は、同じメジャー、マイナー/パッチバージョンが更新 composer update で 10.5系最新まで上がる可能性あり ~ (チルダ) : 同じマイナー、パッチバージョンだけ更新 ~10.4.0 は、10.4系内までバージョンアップ可能 composer update で 10.4系最新まで上がる可能性あり 42
  15. バージョン指定 個人的おすすめ Drupal Core のパッケージ(drupal/core-から始まるパッケージ)は ~ をつけて管理。急なセキュリティによるバージョンアップが楽。 "require": { "drupal/core-composer-scaffold":

    "~11.2.3", "drupal/core-recipe-unpack": "~11.2.3", "drupal/core-recommended": "~11.2.3", "drush/drush": "^13.6" }, Coreのセキュリティアップデート時 ddev composer update "drupal/core-*" 43
  16. composer 主なコマンド DDEV版 3 composer.lock に基づくインストール dev版 ddev composer install

    composer.lock に基づくインストール 本番向け ddev composer install --no-dev 47
  17. core-composer-scaffold 設定値 "drupal-scaffold": { "locations": { "web-root": "docroot/" } },

    "installer-paths": { "docroot/core": [ "type:drupal-core" ], "docroot/modules/contrib/{$name}": [ "type:drupal-module" ], 参考 https://www.drupal.org/docs/develop/using-composer/using-drupals-composer-scaffold 50
  18. パッチ追加例 "patches": { "drupal/core": { "#3530597": "./patches/core/date-field-default-value.patch", } } >

    参考: https://www.bulblub.com/2018/08/composer_patch_pulugin/ パッチファイルはURL参照も可能。 ただしGitLabのマージリクエストでの修正の場合、パッチファイルを ダウンロードした上で適用した方がいい。 52
  19. Configuration Split 使い方 1. サブセットを作成する ローカル用、開発環境用、検証環境用、本番環境用など 2. settings.php に有効化するサブセットを指定する //

    サンプル if (開発環境の場合) { $config['config_split.config_split.dev']['status'] = TRUE; } if (本番環境の場合) { $config['config_split.config_split.live']['status'] = TRUE; } 67
  20. Configuration Split 使い方のポイント モジュールの有効化を環境ごとに分けたい場合、 メインは無効化 + サブで有効化 Database Logging は基本無効化

    + 開発環境用だけ有効化 サブセットのステータスはOFFで設定 サブセットのconfigにステータスがあるが無効化する 有効化は settings.php のみで指定する 69
  21. 74

  22. drupal/core-dev パッケージ 静的解析、テストコード実行をしたいなら drupal/core-dev パッケージを導入すると簡単 ddev composer require --dev drupal/core-dev:~11.2.1

    -W バージョンは drupal/core のバージョンと合わせる require-dev として扱う [1] https://packagist.org/packages/drupal/core-dev 76
  23. PHP CodeSniffer セットアップ プロジェクトルートに phpcs.xml を作成 <?xml version="1.0" encoding="UTF-8"?> <ruleset

    name="Custom"> <description>Drupal コーディング標準用の PHP_CodeSniffer 設定</description> <arg name="extensions" value="engine,inc,install,module,php,profile,test,theme,yml"/> <rule ref="Drupal"/> <file>docroot/modules/custom</file> <file>docroot/themes/custom</file> </ruleset> 実行 ddev exec phpcs 78
  24. PHP CodeSniffer エラー例 FILE: /var/www/html/docroot/modules/custom/site_notice/tests/src/Unit/SiteNoticeBlockTest.php ------------------------------------------------------------------------------------------------------------------------------- FOUND 3 ERRORS AND

    1 WARNING AFFECTING 14 LINES ------------------------------------------------------------------------------------------------------------------------------- 13 | ERROR | [x] Missing class doc comment 16 | ERROR | [x] Missing function doc comment 19 | ERROR | [x] Inline comments must end in full-stops, exclamation marks, question marks, colons, or closing parentheses 132 | WARNING | [ ] Line exceeds 80 characters; contains 83 characters ------------------------------------------------------------------------------------------------------------------------------- PHPCBF CAN FIX THE 3 MARKED SNIFF VIOLATIONS AUTOMATICALLY ------------------------------------------------------------------------------------------------------------------------------- Time: 63ms; Memory: 6MB Failed to execute command `phpcs`: exit status 2 79
  25. PHPStan セットアップ プロジェクトルートに phpstan.neon を作成 parameters: phpVersion: 80300 # PHP8.3

    level: 5 paths: - docroot/modules/custom ignoreErrors: - "#^Unsafe usage of new static#" 実行 ddev exec phpstan 82
  26. PHPStan エラー例 Note: Using configuration file /var/www/html/phpstan.neon. 3/3 [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] 100%

    ------ -------------------------------------------------------------------------------------------------------------------------------------- Line site_notice/tests/src/Unit/SiteNoticeBlockTest.php ------ -------------------------------------------------------------------------------------------------------------------------------------- 80 Call to method PHPUnit\Framework\Assert::assertIsArray() with array will always evaluate to true. method.alreadyNarrowedType Because the type is coming from a PHPDoc, you can turn off this check by setting treatPhpDocTypesAsCertain: false in your phpstan .neon. ------ -------------------------------------------------------------------------------------------------------------------------------------- [ERROR] Found 1 error Failed to execute command `phpstan`: exit status 1 83
  27. PHPStan 導入ポイント レベルは0から始めて最大5までがおすすめ レベル6とDrupalのRender Array定義が相性が悪い Rule Levels 補足 :Drupal11.3でレンダリング要素をオブジェクトで作成できる機 能が登場

    します。オブジェクトでの実装が浸透して、メソッドの引 数もオブジェクトになったらこの問題は解消します。 [1] https://www.drupal.org/node/3532720 84
  28. PHPUnit セットアップ core/phpunit.xml.distをプロジェクトルートにコピー 設定値変更 bootstrapのパス ・・・ docroot/core/bootstrap.php や web/core/bootstrap.php など

    SIMPLETEST_BASE_URL ・・・ http://localhost SIMPLETEST_DB の変更 ・・・ DDEV例: mysql://db:db@db/test テスト対象の設定 <testsuites></testsuites> のカスタマイズ [1] https://github.com/kazukomurata/drupal-example-2025/blob/main/phpunit.xml 86
  29. PHPUnit エラー例 PHPUnit 11.5.34 by Sebastian Bergmann and contributors. Runtime:

    PHP 8.4.10 Configuration: /var/www/html/phpunit.xml F.. 3 / 3 (100%) Time: 00:00.017, Memory: 6.00 MB There was 1 failure: 1) Drupal\Tests\site_notice\Unit\SiteNoticeBlockTest::testBuildBeforeStartReturnsEmptyWithCacheUntilStart Failed asserting that Array &0 [] is null. /var/www/html/docroot/modules/custom/site_notice/tests/src/Unit/SiteNoticeBlockTest.php:80 FAILURES! Tests: 3, Assertions: 11, Failures: 1. Failed to execute command `phpunit docroot/modules/custom/`: exit status 1 88
  30. GitHub Actions の CodeQL Settings > Advanced Security で Code

    scanning を設定、 CodeQL による静的解析が可能 [1] https://docs.github.com/ja/code-security/code-scanning/introduction-to-code-scanning/about-code-scanning- with-codeql 98
  31. GitHub Actions セルフホステッドランナー の場合 GitHub の Settings > Actions >

    Runners で 新規追加で表示さ れる指示に従ってランナー追加 & サービス常時起動 [1] https://docs.github.com/ja/actions/how-tos/manage-runners/self-hosted-runners/add-runners 100
  32. .github/workflows/deploy.yml 作成 name: Deploy on: push: branches: - main permissions:

    contents: read jobs: deploy: runs-on: self-hosted defaults: run: shell: bash working-directory: ${{ vars.APP_ROOT }} steps: - name: "Update" run: | git pull origin main composer install --no-dev vendor/bin/drush cr vendor/bin/drush cim -y vendor/bin/drush cr vendor/bin/drush updb -y 101