{"id":376008,"date":"2023-04-10T05:03:19","date_gmt":"2023-04-10T05:03:19","guid":{"rendered":"https:\/\/webkul.com\/blog\/?p=376008"},"modified":"2023-04-12T11:48:39","modified_gmt":"2023-04-12T11:48:39","slug":"grumphp-implementation-in-adobe-commerce","status":"publish","type":"post","link":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/","title":{"rendered":"GrumPHP Implementation in Adobe Commerce"},"content":{"rendered":"\n<p>Today, we will learn how to add code quality checks in Adobe Commerce Module Development. We will be achieving this by automating the code quality checks using the GrumPHP library.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Why should we Automate?<\/strong><\/h2>\n\n\n\n<p>For the quality control of the code in <a href=\"https:\/\/store.webkul.com\/Magento-2.html\">Magento 2 modules<\/a>, we have to manually run 6-7 tools which can be overburdening, I would try to skip these assuming the code will pass from the development pipeline. <\/p>\n\n\n\n<p>Another main reason is that we developers are a bit lazy kind of person.\ud83d\ude42<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How we will Automate?<\/strong><\/h2>\n\n\n\n<p>GrumPHP will do it for you! This composer plugin will register some git hooks in your package repository. When somebody commits changes, GrumPHP will run some tests on the committed code. If the tests fail, you won&#8217;t be able to commit your changes.<\/p>\n\n\n\n<p>It will also teach your co-workers to write better code following the best practices you&#8217;ve determined as a team. You may also <a href=\"https:\/\/webkul.com\/hire-magento-developers\/\">Hire Magento 2 Developers<\/a> for your upcoming projects. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Which tools we will Automate?<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/squizlabs\/PHP_CodeSniffer\" target=\"_blank\" rel=\"noreferrer noopener\">PHP Code Sniffer<\/a><\/li>\n\n\n\n<li>PHP Code Beautifier<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/FriendsOfPHP\/PHP-CS-Fixer\" target=\"_blank\" rel=\"noreferrer noopener\">PHP Coding Standards Fixer<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/phpmd.org\/\" target=\"_blank\" rel=\"noreferrer noopener\">PHP Mess Detector<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/phpstan\/phpstan\" target=\"_blank\" rel=\"noreferrer noopener\">PHP Stan<\/a><\/li>\n\n\n\n<li>Custom Keywords<\/li>\n<\/ol>\n\n\n\n<p>Most of the tools are recommended by the <a href=\"https:\/\/developer.adobe.com\/commerce\/testing\/guide\/#code-quality-tests\" target=\"_blank\" rel=\"noreferrer noopener\">Adobe Commerce Test Guide<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>How to automate?<\/strong><\/h2>\n\n\n\n<p><strong>Installation of GrumPHP and Dependencies( tools )<\/strong><\/p>\n\n\n\n<p>We will install the following tools, in the Magento root directory. By running the following commands for the respective tools.<\/p>\n\n\n\n<p>1. Install GrumPHP by running<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">composer require --dev phpro\/grumphp<\/pre>\n\n\n\n<p>2. Install PHP CodeSniffer<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">composer require --dev &quot;squizlabs\/php_codesniffer=*&quot;<\/pre>\n\n\n\n<p>3. Install PHP Coding Standards Fixer<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">composer require --dev friendsofphp\/php-cs-fixer<\/pre>\n\n\n\n<p>4. Install PHP Stan<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">composer require --dev phpstan\/phpstan<\/pre>\n\n\n\n<p>5. Install PHPMD (PHP Mess Detector)<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">composer require --dev phpmd\/phpmd<\/pre>\n\n\n\n<p>6. Install PHP Lint<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">composer require --dev php-parallel-lint\/php-parallel-lint<\/pre>\n\n\n\n<p>Initialize the git repository on the module level i.e &lt;<code>magento-2-root&gt;\/app\/code\/MyVendor\/MyModule<\/code>, by running the following command.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">git init<\/pre>\n\n\n\n<p>Then go to the module directory and run the command:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">php ..\/..\/..\/..\/vendor\/bin\/grumphp git:init<\/pre>\n\n\n\n<p>This above command will add the hooks to run the test (which configuration is stored in  grumphp.yml ) on the files we are committing to the git repository. If all the tests pass then only it will allow the developer to commit the code.<\/p>\n\n\n\n<p>Add bin path&nbsp;&lt;<code>magento2-root&gt;\/vendor\/bin<\/code>&nbsp;to your module&nbsp;<code>composer.json<\/code> . <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">{\n    &quot;config&quot;: {\n            &quot;bin-dir&quot;: &quot;..\/..\/..\/..\/vendor\/bin&quot;\n        }\n}<\/pre>\n\n\n\n<p>GrumPHP auto detect&nbsp;<code>git commit<\/code>&nbsp;command but you can manually test by running&nbsp;<code>php ..\/..\/..\/..\/vendor\/bin\/grumphp<\/code>&nbsp;run inside the module.<\/p>\n\n\n\n<p>Add the following code in the grumphp.yml file created on the Module directory structure.                          i.e &lt;<code>magento-2-root&gt;\/app\/code\/MyVendor\/MyModule<\/code><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\"># GrumPHP configuration for Magento 2\ngrumphp:\n  hide_circumvention_tip: true\n  process_timeout: 120\n  stop_on_failure: false\n  ignore_unstaged_changes: false\n  tasks:\n    jsonlint:\n      detect_key_conflicts: true\n      metadata:\n        priority: 100\n    xmllint:\n      ignore_patterns:\n        - &quot;#test\/(.*).xml#&quot;\n      metadata:\n        priority: 100\n    phplint:\n      triggered_by: &#091;&#039;php&#039;, &#039;phtml&#039;]\n      metadata:\n        priority: 200\n    yamllint:\n      ignore_patterns:\n        - &quot;#test\/(.*).yml#&quot;\n        - &quot;#charts\/.*#&quot;\n      metadata:\n        priority: 100\n    composer:\n      file: .\/composer.json\n      no_check_all: true\n      no_check_lock: false\n      no_check_publish: false\n      with_dependencies: false\n      strict: false\n      metadata:\n        priority: 80\n    # validate git commit message\n    git_commit_message:\n      allow_empty_message: false\n      enforce_capitalized_subject: false\n      enforce_no_subject_punctuations: false\n      enforce_no_subject_trailing_period: true\n      enforce_single_lined_subject: true\n      type_scope_conventions: &#091;]\n      max_body_width: 80\n      max_subject_width: 80\n      matchers:\n        &quot;Commit message must be alphabet or number&quot;: \/&#091;aA-zZ | 0-9]\/\n      case_insensitive: true\n      multiline: false\n      additional_modifiers: &#039;&#039;\n    # validate git branch names\n    git_branch_name:\n      whitelist:        \n        - &quot;\/(&#091;a-z]&#091;^0-9]+)$\/&quot;\n      blacklist:\n        - &quot;master&quot;        \n      allow_detached_head: true\n    # catch not allowed keywords\n    git_blacklist:\n      keywords:\n        - &quot;\\\\.dev&quot;\n        - &quot;\\\\.local&quot;\n        - &quot;\\\\.test&quot;\n        - &quot;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&quot;\n        - &quot;=======&quot;\n        - &quot;DebuggerUtility&quot;\n        - &quot;ObjectManager::getInstance&quot;\n        - &quot;_GET\\\\&#091;&quot;\n        - &quot;_POST\\\\&#091;&quot;\n        - &quot;_REQUEST\\\\&#091;&quot;\n        - &quot;console.log(&quot;\n        - &quot;die(&quot;\n        - &quot;die;&quot;\n        - &quot;exit(&quot;\n        - &quot;exit;&quot;\n        - &quot;fileadmin&quot;\n        - &quot;localhost&quot;\n        - &quot;phpinfo&quot;\n        - &quot;phpinfo(&quot;\n        - &quot;print_r(&quot;\n        - &quot;var_dump(&quot;\n        - &quot;_objectManager&quot;\n        - &quot;ObjectManagerInterface&quot;\n      triggered_by: &#091;&#039;php&#039;, &#039;js&#039;, &#039;html&#039;, &#039;phtml&#039;]\n      metadata:\n        priority: 90\n    # https:\/\/devdocs.magento.com\/guides\/v2.4\/coding-standards\/code-standard-php.html\n    phpcs:\n      standard: Magento2\n      tab_width: 4\n      severity: 10 # can remove this to dis allow all level of severity.\n      error_severity: 10\n      warning_severity: ~\n      report: full\n      triggered_by: &#091;phtml, php]\n      metadata:\n        priority: 70\n    phpcsfixer2:\n      allow_risky: false\n      config: &#039;..\/..\/..\/..\/.php-cs-fixer.dist.php&#039;\n      triggered_by: &#091;&#039;php&#039;, &#039;phtml&#039;]\n      using_cache: true\n      cache_file: &#039;.\/.php_cs.cache&#039;\n      # config_contains_finder: false - to skip fixing all Magento 2 directory\n      config_contains_finder: false\n      verbose: true\n    phpmd:\n      ruleset: &#091;&#039;..\/..\/..\/..\/dev\/tests\/static\/testsuite\/Magento\/Test\/Php\/_files\/phpmd\/ruleset.xml&#039;]\n      triggered_by: &#091;&#039;php&#039;]\n      exclude:\n        - &quot;.\/app\/code\/Magento\/&quot;\n        - &quot;.\/app\/code\/*\/*\/Setup\/&quot;\n      metadata:\n        priority: 70\n    # https:\/\/devdocs.magento.com\/guides\/v2.4\/test\/testing.html#phpstan\n    phpstan:\n      autoload_file: ~\n      configuration: &#039;..\/..\/..\/..\/dev\/tests\/static\/testsuite\/Magento\/Test\/Php\/_files\/phpstan\/phpstan.neon&#039;\n      level: 6\n      triggered_by: &#091;&#039;php&#039;]\n      force_patterns: &#091;]\n      ignore_patterns: &#091;]\n      memory_limit: &quot;-1&quot;\n      metadata:\n            priority: 90<\/pre>\n\n\n\n<p>Now, let&#8217;s take an example to demonstrate the automation test, made to check the code Quality of the module DemoModule.<\/p>\n\n\n\n<p>First, we will initialize the git repository in the Module directory i.e app\/code\/Webkul\/DemoModule.<\/p>\n\n\n\n<p>We will add all the files of the module in the staging state by running the following command<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">git add .<\/pre>\n\n\n\n<p>Now, we can run the command<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\">php ..\/..\/..\/..\/vendor\/bin\/grumphp run<\/pre>\n\n\n\n<p>NOPE, errors occurred which must be resolved before the code is pushed into the development pipeline. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"623\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png\" alt=\"grumPHP failed test\" class=\"wp-image-376021\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png 1200w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-300x156.png 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-250x130.png 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-768x399.png 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1536x798.png 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test.png 1919w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<p>After going through the issues, we resolved them in the module and then again ran the command to test the code quality, and this time it passed all the checks.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1200\" height=\"623\" src=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/grumPHP-success-1200x623.png\" alt=\"grumPHP-success\" class=\"wp-image-376024\" srcset=\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/grumPHP-success-1200x623.png 1200w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/grumPHP-success-300x156.png 300w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/grumPHP-success-250x130.png 250w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/grumPHP-success-768x399.png 768w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/grumPHP-success-1536x798.png 1536w, https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/grumPHP-success.png 1919w\" sizes=\"(max-width: 1200px) 100vw, 1200px\" loading=\"lazy\" \/><\/figure>\n\n\n\n<p>That\u2019s it In this article we tried to cover to Setup of the GrumPHP in the module development of <a href=\"https:\/\/webkul.com\/adobe-commerce-cloud\/\">Adobe Commerce<\/a>. Hope it helps. Please share your feedback in the comments.<\/p>\n\n\n\n<p>Happy Coding \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Today, we will learn how to add code quality checks in Adobe Commerce Module Development. We will be achieving this by automating the code quality checks using the GrumPHP library. Why should we Automate? For the quality control of the code in Magento 2 modules, we have to manually run 6-7 tools which can be <a href=\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\">[&#8230;]<\/a><\/p>\n","protected":false},"author":381,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9121],"tags":[12967,6484,13957,13958,2070,13959],"class_list":["post-376008","post","type-post","status-publish","format-standard","hentry","category-magento-2","tag-adobe-commerce","tag-automate","tag-grumphp","tag-magento-2-tools","tag-magento2","tag-module-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>GrumPHP Implementation in Adobe Commerce - Webkul Blog<\/title>\n<meta name=\"description\" content=\"GrumPHP will do it for you! This composer plugin will register some git hooks in your package repository. When somebody commits changes, GrumPHP will run some tests on the committed code.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GrumPHP Implementation in Adobe Commerce - Webkul Blog\" \/>\n<meta property=\"og:description\" content=\"GrumPHP will do it for you! This composer plugin will register some git hooks in your package repository. When somebody commits changes, GrumPHP will run some tests on the committed code.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\" \/>\n<meta property=\"og:site_name\" content=\"Webkul Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/webkul\/\" \/>\n<meta property=\"article:published_time\" content=\"2023-04-10T05:03:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-04-12T11:48:39+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png\" \/>\n<meta name=\"author\" content=\"Shivek Sahay\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@webkul\" \/>\n<meta name=\"twitter:site\" content=\"@webkul\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Shivek Sahay\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\"},\"author\":{\"name\":\"Shivek Sahay\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/e9320a6013c3703174a133243b4ff02f\"},\"headline\":\"GrumPHP Implementation in Adobe Commerce\",\"datePublished\":\"2023-04-10T05:03:19+00:00\",\"dateModified\":\"2023-04-12T11:48:39+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\"},\"wordCount\":509,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png\",\"keywords\":[\"Adobe Commerce\",\"automate\",\"GrumPHP\",\"Magento 2 Tools\",\"Magento2\",\"Module Development\"],\"articleSection\":[\"Magento 2\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\",\"url\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\",\"name\":\"GrumPHP Implementation in Adobe Commerce - Webkul Blog\",\"isPartOf\":{\"@id\":\"https:\/\/webkul.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png\",\"datePublished\":\"2023-04-10T05:03:19+00:00\",\"dateModified\":\"2023-04-12T11:48:39+00:00\",\"description\":\"GrumPHP will do it for you! This composer plugin will register some git hooks in your package repository. When somebody commits changes, GrumPHP will run some tests on the committed code.\",\"breadcrumb\":{\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test.png\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test.png\",\"width\":1919,\"height\":997,\"caption\":\"failed-test\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/webkul.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GrumPHP Implementation in Adobe Commerce\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/webkul.com\/blog\/#website\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"name\":\"Webkul Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/webkul.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/webkul.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/webkul.com\/blog\/#organization\",\"name\":\"WebKul Software Private Limited\",\"url\":\"https:\/\/webkul.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"contentUrl\":\"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png\",\"width\":380,\"height\":380,\"caption\":\"WebKul Software Private Limited\"},\"image\":{\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/webkul\/\",\"https:\/\/x.com\/webkul\",\"https:\/\/www.instagram.com\/webkul\/\",\"https:\/\/www.linkedin.com\/company\/webkul\",\"https:\/\/www.youtube.com\/user\/webkul\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/e9320a6013c3703174a133243b4ff02f\",\"name\":\"Shivek Sahay\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bcb4ce262a6c04c3fc3427801682d8c64cb42dc15a6b79566ed58c087332d41b?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bcb4ce262a6c04c3fc3427801682d8c64cb42dc15a6b79566ed58c087332d41b?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g\",\"caption\":\"Shivek Sahay\"},\"description\":\"Shivek Sahay, a Magento Certified Developer, is highly skilled in Magento development, particularly in Shipping and Payment Method customization. With a deep understanding of Magento's core, he crafts tailored solutions, optimizing eCommerce functionality, and elevating the customer experience.\",\"url\":\"https:\/\/webkul.com\/blog\/author\/shivek-sahay567\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GrumPHP Implementation in Adobe Commerce - Webkul Blog","description":"GrumPHP will do it for you! This composer plugin will register some git hooks in your package repository. When somebody commits changes, GrumPHP will run some tests on the committed code.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/","og_locale":"en_US","og_type":"article","og_title":"GrumPHP Implementation in Adobe Commerce - Webkul Blog","og_description":"GrumPHP will do it for you! This composer plugin will register some git hooks in your package repository. When somebody commits changes, GrumPHP will run some tests on the committed code.","og_url":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/","og_site_name":"Webkul Blog","article_publisher":"https:\/\/www.facebook.com\/webkul\/","article_published_time":"2023-04-10T05:03:19+00:00","article_modified_time":"2023-04-12T11:48:39+00:00","og_image":[{"url":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png","type":"","width":"","height":""}],"author":"Shivek Sahay","twitter_card":"summary_large_image","twitter_creator":"@webkul","twitter_site":"@webkul","twitter_misc":{"Written by":"Shivek Sahay","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#article","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/"},"author":{"name":"Shivek Sahay","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/e9320a6013c3703174a133243b4ff02f"},"headline":"GrumPHP Implementation in Adobe Commerce","datePublished":"2023-04-10T05:03:19+00:00","dateModified":"2023-04-12T11:48:39+00:00","mainEntityOfPage":{"@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/"},"wordCount":509,"commentCount":0,"publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"image":{"@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage"},"thumbnailUrl":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png","keywords":["Adobe Commerce","automate","GrumPHP","Magento 2 Tools","Magento2","Module Development"],"articleSection":["Magento 2"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/","url":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/","name":"GrumPHP Implementation in Adobe Commerce - Webkul Blog","isPartOf":{"@id":"https:\/\/webkul.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage"},"image":{"@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage"},"thumbnailUrl":"https:\/\/webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test-1200x623.png","datePublished":"2023-04-10T05:03:19+00:00","dateModified":"2023-04-12T11:48:39+00:00","description":"GrumPHP will do it for you! This composer plugin will register some git hooks in your package repository. When somebody commits changes, GrumPHP will run some tests on the committed code.","breadcrumb":{"@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#primaryimage","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test.png","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2023\/04\/failed-test.png","width":1919,"height":997,"caption":"failed-test"},{"@type":"BreadcrumbList","@id":"https:\/\/webkul.com\/blog\/grumphp-implementation-in-adobe-commerce\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/webkul.com\/blog\/"},{"@type":"ListItem","position":2,"name":"GrumPHP Implementation in Adobe Commerce"}]},{"@type":"WebSite","@id":"https:\/\/webkul.com\/blog\/#website","url":"https:\/\/webkul.com\/blog\/","name":"Webkul Blog","description":"","publisher":{"@id":"https:\/\/webkul.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/webkul.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/webkul.com\/blog\/#organization","name":"WebKul Software Private Limited","url":"https:\/\/webkul.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","contentUrl":"https:\/\/cdnblog.webkul.com\/blog\/wp-content\/uploads\/2021\/08\/webkul-logo-accent-sq.png","width":380,"height":380,"caption":"WebKul Software Private Limited"},"image":{"@id":"https:\/\/webkul.com\/blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/webkul\/","https:\/\/x.com\/webkul","https:\/\/www.instagram.com\/webkul\/","https:\/\/www.linkedin.com\/company\/webkul","https:\/\/www.youtube.com\/user\/webkul\/"]},{"@type":"Person","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/e9320a6013c3703174a133243b4ff02f","name":"Shivek Sahay","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/webkul.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/bcb4ce262a6c04c3fc3427801682d8c64cb42dc15a6b79566ed58c087332d41b?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bcb4ce262a6c04c3fc3427801682d8c64cb42dc15a6b79566ed58c087332d41b?s=96&d=https%3A%2F%2Fcdnblog.webkul.com%2Fblog%2Fwp-content%2Fuploads%2F2019%2F10%2Fmike.png&r=g","caption":"Shivek Sahay"},"description":"Shivek Sahay, a Magento Certified Developer, is highly skilled in Magento development, particularly in Shipping and Payment Method customization. With a deep understanding of Magento's core, he crafts tailored solutions, optimizing eCommerce functionality, and elevating the customer experience.","url":"https:\/\/webkul.com\/blog\/author\/shivek-sahay567\/"}]}},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/376008","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/users\/381"}],"replies":[{"embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/comments?post=376008"}],"version-history":[{"count":26,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/376008\/revisions"}],"predecessor-version":[{"id":376521,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/posts\/376008\/revisions\/376521"}],"wp:attachment":[{"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/media?parent=376008"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/categories?post=376008"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/webkul.com\/blog\/wp-json\/wp\/v2\/tags?post=376008"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}