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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

 長期運用のための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