<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stephan Maximilian Huber</title>
    <description>The latest articles on DEV Community by Stephan Maximilian Huber (@stmh).</description>
    <link>https://dev.to/stmh</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F204921%2F8e508102-0a4e-40ac-8b0e-0a35570530ae.jpeg</url>
      <title>DEV Community: Stephan Maximilian Huber</title>
      <link>https://dev.to/stmh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stmh"/>
    <language>en</language>
    <item>
      <title>What's new in phabalicious 3.8?</title>
      <dc:creator>Stephan Maximilian Huber</dc:creator>
      <pubDate>Mon, 22 Aug 2022 12:36:52 +0000</pubDate>
      <link>https://dev.to/factorial-io/whats-new-in-phabalicious-38-4g3h</link>
      <guid>https://dev.to/factorial-io/whats-new-in-phabalicious-38-4g3h</guid>
      <description>&lt;h2&gt;
  
  
  What has changed?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  PHP 7.3 required
&lt;/h3&gt;

&lt;p&gt;Phabalicious requires now PHP version 7.3. It should work with newer versions, including 8.1&lt;/p&gt;

&lt;h3&gt;
  
  
  Better integration with 1Password cli/ connect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Support for version 2 of the cli&lt;/li&gt;
&lt;li&gt;added new script callback &lt;code&gt;get_file_from_1password&lt;/code&gt; which will retrieve an encrypted file from 1password,
decrypt it and store it somewhere, suitable when scaffolding.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Encryption and decryption
&lt;/h3&gt;

&lt;p&gt;Phab supports now encryption and decryption of files and strings. It uses &lt;a href="https://github.com/defuse/php-encryption"&gt;defuse/php-encryption&lt;/a&gt;,&lt;br&gt;
a widely used library for encryption  under the hood. You can encrypt files in a script with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;secrets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name-of-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;question&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;What is the password?&lt;/span&gt;

&lt;span class="na"&gt;scripts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;encrypt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;encrypt_files(path/to/files/or/folders/to/encrypt/*.ext, path/to/folder/to/store/encrypted/files, name-of-secret)&lt;/span&gt;
  &lt;span class="na"&gt;decrypt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;decrypt_files(path/to/files/or/folders/to/decrypt/*.enc, path/to/folder/to/store/decrypted/files, name-of-secret)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The scaffolder has a new callback called &lt;code&gt;decrypt_assets&lt;/code&gt; which works the same as &lt;code&gt;copy_assets&lt;/code&gt; but with an additional&lt;br&gt;
decryption step&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;scaffold&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;decrypt_assets(targetFolder, dataKey, secretName, twigExtension)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;You can also use &lt;code&gt;decrypt()&lt;/code&gt; and &lt;code&gt;encrypt()&lt;/code&gt; in your scaffold templates using the provided twig-functions:&lt;/p&gt;

&lt;p&gt;test.yml&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight twig"&gt;&lt;code&gt;data:
  my_secret_data: "&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;decrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;my_secret_data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'name-of-secret'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;"
  encrypted: "&lt;span class="cp"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;encrypt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"Hello world"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'name-of-secret'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="cp"&gt;}}&lt;/span&gt;"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  New command &lt;code&gt;install:from-sql-file&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;The command &lt;code&gt;install:from&lt;/code&gt; and the new command &lt;code&gt;install:from-sql-file&lt;/code&gt; get reworked to prevent double-work and to&lt;br&gt;
streamline the process. You can now install the app from an existing sql-file, which translates into an optimized&lt;br&gt;
flow of&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; &lt;span class="nb"&gt;install
&lt;/span&gt;phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; restore:sql-from-file sql.gz
phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; reset
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Instead run&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; &lt;span class="nb"&gt;install&lt;/span&gt;:from-sql-file sql.gz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Refactoring of data-handling
&lt;/h3&gt;

&lt;p&gt;Phab now handles data differently, by storing from which file or url a piece of data was loaded. This enables phab to&lt;br&gt;
use relative includes, even for remote configurations. Now you can do things like&lt;/p&gt;

&lt;p&gt;base.yml&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hello world&lt;/span&gt;
    &lt;span class="na"&gt;bar&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hello from base.yml&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;fabfile.yml:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;inheritsFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./base.yml&lt;/span&gt;

&lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;local&lt;/span&gt;

&lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;foo&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Hello mars&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Running &lt;code&gt;output&lt;/code&gt; will show the resolved inheritances:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ phab38 &lt;span class="nt"&gt;-ctest&lt;/span&gt; output &lt;span class="nt"&gt;--what&lt;/span&gt; host


Output of host-configuration &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nb"&gt;test&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;
&lt;span class="o"&gt;===================================&lt;/span&gt;

  &lt;span class="nb"&gt;test&lt;/span&gt;:
    foo: &lt;span class="s1"&gt;'Hello mars'&lt;/span&gt;
    bar: &lt;span class="s1"&gt;'Hello from base.yml'&lt;/span&gt;
    needs:
      - &lt;span class="nb"&gt;local&lt;/span&gt;
      - script
    &lt;span class="nb"&gt;type&lt;/span&gt;: dev
    &lt;span class="nb"&gt;.&lt;/span&gt;
    &lt;span class="nb"&gt;.&lt;/span&gt;
    &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This enhances also the introspection possibilities:&lt;/p&gt;
&lt;h3&gt;
  
  
  The about command got a &lt;code&gt;-v&lt;/code&gt; flag
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;about&lt;/code&gt; command has another trick up its sleeve now. When inheriting configurations from multiple files, it can now&lt;br&gt;
display the exact location from which a particular parameter is being picked. Thus, finding out if a value is coming from an inherited file from a remote server or some sensible defaults is at your fingertip.&lt;/p&gt;

&lt;p&gt;Let's have a look at an example to see this in action. The command displays not only the active value for a particular&lt;br&gt;
key but also the location from which it is picked up.&lt;/p&gt;

&lt;p&gt;In our case the ouput of &lt;code&gt;phab -ctest about&lt;/code&gt; will show the inheritance very in the second column:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;❯ phab about -v -ctest

Configuration of test
=====================

+-----------------------------+-------------------------------------+---------------------------------------------------+
| Key                         | Value                               | Inherited from                                    |
+-----------------------------+-------------------------------------+---------------------------------------------------+
|   foo                       | Hello mars                          | /Users/stephan/Desktop/phab-38-blog/.fabfile.yaml |
|   bar                       | Hello from base.yml                 | /Users/stephan/Desktop/phab-38-blog/base.yml      |
|   needs                     |                                     | /Users/stephan/Desktop/phab-38-blog/.fabfile.yaml |
|     needs.0                 | local                               | /Users/stephan/Desktop/phab-38-blog/.fabfile.yaml |
|     needs.1                 | script                              | /Users/stephan/Desktop/phab-38-blog/.fabfile.yaml |
|   type                      | dev                                 | host defaults                                     |
.
.
.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  New command &lt;code&gt;find:property&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Phab 3.8 contains a new command named &lt;code&gt;find:property&lt;/code&gt; which provides a visual prompt where the user can start typing the&lt;br&gt;
name of a property they are interested in. Phab supports you by offering properties via autocomplete. As an alternative&lt;br&gt;
you can hit enter to get a list of suggestions. After you found the property you are interested in, hit return, and phab&lt;br&gt;
will display the actual value of that property, its ancestors and from where it got read.&lt;/p&gt;

&lt;p&gt;Here's a short walkthrough using the files and their config from above.&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;a href="https://docs.phab.io/assets/img/phab-38-find-property.405edd1b.svg" rel="noopener noreferrer"&gt;
      docs.phab.io
    &lt;/a&gt;
&lt;/div&gt;



&lt;h3&gt;
  
  
  Enhancements to the database command
&lt;/h3&gt;

&lt;p&gt;There's a new subcommand available &lt;code&gt;db:query&lt;/code&gt; where you can run a query against the database of a given configuration&lt;br&gt;
without starting a database-shell and run the query manually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; db:query &lt;span class="s2"&gt;"show tables"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It will try to get the database credentials from the configuration and apply them. This command is only implemented for&lt;br&gt;
mysql/mariadb for now.&lt;/p&gt;
&lt;h3&gt;
  
  
  New command &lt;code&gt;restic&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Phab 3.7 got support for offsite backups via &lt;a href="https://github.com/restic/restic"&gt;restic&lt;/a&gt;. But it was still a bit cumbersome to interact with the restic&lt;br&gt;
repository for a given configuration using restic alone. That's why phab now has the restic command. It is applying the&lt;br&gt;
configuration and options from the fabfile and you can concentrate on the commands you want to pass to restic. Some&lt;br&gt;
examples:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; restic snapshots
phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; restic &lt;span class="nt"&gt;--&lt;/span&gt; snapshots &lt;span class="nt"&gt;--host-name&lt;/span&gt; my-config
phab &lt;span class="nt"&gt;-cmy-host-config&lt;/span&gt; restic &lt;span class="nt"&gt;--&lt;/span&gt; forget &lt;span class="nt"&gt;--keep-daily&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;14 &lt;span class="nt"&gt;--keep-weekly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4 &lt;span class="nt"&gt;--keep-monthly&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;6 &lt;span class="nt"&gt;--group-by&lt;/span&gt; host &lt;span class="nt"&gt;--prune&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Experimental integration with ddev
&lt;/h3&gt;

&lt;p&gt;ddev is a superb tool for managing local development environments and provides similar features as phabalicious. As it&lt;br&gt;
takes a lot of time to maintain a local development stack (like multibasebox) we thought it might make more sense to&lt;br&gt;
embrace existing open-source tools.&lt;/p&gt;

&lt;p&gt;As ddev is also using docker and docker-compose under the hood it was very unproblematic to integrate ddev with phabalicious.&lt;br&gt;
Phab will read the ddev configuration from &lt;code&gt;.ddev/config.yaml&lt;/code&gt; and provide it under the global property &lt;code&gt;ddev&lt;/code&gt;. So it's&lt;br&gt;
very easy to provide a phab configuration for your local ddev instance. Instead of copy-pasting the boilerplate into&lt;br&gt;
every project we store it on a central place and inherit from it in the fabfile:&lt;/p&gt;

&lt;p&gt;Store this file in a central place, e.g. in your user-folder or on a remote-server. For demonstration purposes we store&lt;br&gt;
this in the same folder as the fabfile&lt;/p&gt;

&lt;p&gt;the &lt;code&gt;ddev.yml&lt;/code&gt;-file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;3.8.0&lt;/span&gt;

&lt;span class="na"&gt;dockerHosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ddev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;rootFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
    &lt;span class="na"&gt;runLocally&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;true&lt;/span&gt;


&lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ddev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;additionalNeeds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ddev&lt;/span&gt;
    &lt;span class="na"&gt;info&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Local ddev instance&lt;/span&gt;
      &lt;span class="na"&gt;publicUrls&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://%settings.ddev.name%.ddev.site"&lt;/span&gt;
      &lt;span class="na"&gt;category&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;01-local&lt;/span&gt;
        &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Local development&lt;/span&gt;
    &lt;span class="na"&gt;executables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;drush&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html/vendor/bin/drush&lt;/span&gt;

    &lt;span class="na"&gt;shellProvider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-exec&lt;/span&gt;
    &lt;span class="na"&gt;composerRootFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;gitRootFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html&lt;/span&gt;
    &lt;span class="na"&gt;rootFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html/web&lt;/span&gt;
    &lt;span class="na"&gt;backupFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/backups&lt;/span&gt;
    &lt;span class="na"&gt;docker&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;configuration&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ddev&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ddev-%settings.ddev.name%-web&lt;/span&gt;
      &lt;span class="na"&gt;projectFolder&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the actual &lt;code&gt;.fabfile.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;inheritsFrom&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;./ddev.yml&lt;/span&gt;

&lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ddev&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# its a drupal installation, so add the drupal-specfic stuff&lt;/span&gt;
    &lt;span class="na"&gt;adminPass&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
    &lt;span class="na"&gt;replaceSettingsFile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;alterSettingsFile&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="no"&gt;false&lt;/span&gt;
    &lt;span class="na"&gt;executables&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;drush&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/var/www/html/vendor/bin/drush&lt;/span&gt;
    &lt;span class="na"&gt;needs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;git&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;docker&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;drush&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;files&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;running &lt;code&gt;phab list:hosts&lt;/code&gt; will show sth like this for your ddev-project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;❯ phab list:hosts &lt;span class="nt"&gt;-v&lt;/span&gt;

Available configurations &lt;span class="k"&gt;for &lt;/span&gt;your project
&lt;span class="o"&gt;=========================================&lt;/span&gt;

Local development
&lt;span class="nt"&gt;-----------------&lt;/span&gt;

 ‣ ddev
   Local ddev instance
   → https://my-ddev-site.ddev.site
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can run any command against the ddev site as usual. For controlling app lifetime please use ddev, e.g. &lt;code&gt;ddev start&lt;/code&gt;&lt;br&gt;
or &lt;code&gt;ddev stop&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  New run contexts for yarn, npm and others
&lt;/h3&gt;

&lt;p&gt;The configs for &lt;code&gt;yarn&lt;/code&gt;, &lt;code&gt;npm&lt;/code&gt;, &lt;code&gt;composer&lt;/code&gt; and &lt;code&gt;laravel&lt;/code&gt; changed. The composite property name like &lt;code&gt;yarnBuildCommand&lt;/code&gt; is&lt;br&gt;
deprecated, please move the config under a section named &lt;code&gt;yarn&lt;/code&gt;. This allows us to add more options for the respective&lt;br&gt;
commands by keeping a structure. Phab will support the old property-names until the next major release, for now you'll&lt;br&gt;
get a friendly reminder.&lt;/p&gt;

&lt;p&gt;One of the reasons for this change is the extension of the runContext, which got renamed into &lt;code&gt;context&lt;/code&gt; which will adapt&lt;br&gt;
the existing functionality of the script execution contexts. Build commands can now be multiline, but then please&lt;br&gt;
provide the executable-name by yourself:&lt;/p&gt;

&lt;p&gt;Old:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;yarnBuildCommand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;build:production&lt;/span&gt;
    &lt;span class="na"&gt;yarnRunContext&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-host&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;New:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;hosts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;test&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;yarn&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;buildCommand&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;yarn build:production&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;yarn build:assets&lt;/span&gt;
      &lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;docker-image&lt;/span&gt;
      &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;node:16&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are two new contexts available which pigypack on the existing functionality of script execution contexts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;docker-image&lt;/code&gt; will execute the yarn build in a docker image (see script execution contexts for configuration options)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;docker-image-on-docker-host&lt;/code&gt; same as above, but it will be executed on the same instance where docker-commands are
executed, usually where your dockerConfig points to.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Smaller enhancements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Passwords are now obfuscated in phabs output.&lt;/li&gt;
&lt;li&gt;Update-check is now using a maintained [php&lt;/li&gt;
&lt;li&gt;library](&lt;a href="https://github.com/consolidation/self-update"&gt;https://github.com/consolidation/self-update&lt;/a&gt;) and works more reliably. Please that the name of the option for getting a beta-version
changed too.&lt;/li&gt;
&lt;li&gt;When importing a sql-dump phab freezes the app, and unfreezes it afterwards. For drupal applications the site will be put in
maintenance mode and back.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Switch to conventional commits and semi-automated releases
&lt;/h3&gt;

&lt;p&gt;We switched to the conventional commits convention and introduced &lt;code&gt;standard-release&lt;/code&gt; to help us creating proper releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to get it
&lt;/h2&gt;

&lt;p&gt;See the &lt;a href="https://docs.phab.io/installation.html"&gt;documentation&lt;/a&gt; for installation &lt;/p&gt;

</description>
      <category>phab</category>
      <category>phabalicious</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to test a beta version of phabalicious in parallel</title>
      <dc:creator>Stephan Maximilian Huber</dc:creator>
      <pubDate>Sat, 13 Aug 2022 11:42:00 +0000</pubDate>
      <link>https://dev.to/factorial-io/how-to-test-a-beta-version-of-phabalicious-in-parallel-1kn0</link>
      <guid>https://dev.to/factorial-io/how-to-test-a-beta-version-of-phabalicious-in-parallel-1kn0</guid>
      <description>&lt;p&gt;Sometimes it would be neat to test if a new beta version of phabalicious works with my local projects, without breaking&lt;br&gt;
my productivity if I encounter problems. Fortunately it is rather safe to have two phab versions installed on your local&lt;br&gt;
computer.&lt;/p&gt;

&lt;p&gt;Usually you keep phabalicious up-to-date by running &lt;code&gt;phab self-update&lt;/code&gt;. The easiest way to install a beta-version side&lt;br&gt;
by side to the official version are the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt;  https://github.com/factorial-io/phabalicious/releases/download/3.8.0-beta.16/phabalicious.phar &lt;span class="nt"&gt;--output&lt;/span&gt; /usr/local/bin/phab38
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;chmod&lt;/span&gt; +x /usr/local/bin/phab38
&lt;span class="nv"&gt;$ &lt;/span&gt;phab38 &lt;span class="nt"&gt;--version&lt;/span&gt;
phabalicious 3.8.0-beta.16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please adapt the version in the url to your likings. After a successfull installation you can update the beta version using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phab38 self-update &lt;span class="nt"&gt;--preview&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you want to test if your project is still working with the new beta version, just substitute &lt;code&gt;phab&lt;/code&gt; with &lt;code&gt;phab38&lt;/code&gt;, e.g.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;phab38 &lt;span class="nt"&gt;-cmbb&lt;/span&gt; docker run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;If you encounter any problems with a beta or a stable version please create an &lt;a href="https://github.com/factorial-io/phabalicious/issues"&gt;issue&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;To remove the beta-version just run &lt;code&gt;rm /usr/local/bin/phab38&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>phabalicious</category>
      <category>phab</category>
    </item>
    <item>
      <title>About the importance of including DevOps in your team</title>
      <dc:creator>Stephan Maximilian Huber</dc:creator>
      <pubDate>Thu, 17 Dec 2020 16:17:42 +0000</pubDate>
      <link>https://dev.to/factorial-io/about-the-importance-of-including-devops-in-your-team-2k2c</link>
      <guid>https://dev.to/factorial-io/about-the-importance-of-including-devops-in-your-team-2k2c</guid>
      <description>

&lt;p&gt;Developers working on client projects are taking care of numerous tasks. When you think the list gets shorter, new things are added at the bottom. What you can do is provide an infrastructure that lets them tackle their issues. But this doesn’t include only the administrative side but also the technical requirements for the developers to work properly. What’s missing is someone who is familiar with the IT area of the developers and has the capacity to assist in operative processes aside from the usual management. This is where the DevOps enter the field.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbo.factorial.io%2Fsites%2Fdefault%2Ffiles%2F2020-12%2FFAC_Blogartikel_DevOps_v1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fbo.factorial.io%2Fsites%2Fdefault%2Ffiles%2F2020-12%2FFAC_Blogartikel_DevOps_v1.png" alt="Devops illustration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The DevOps work to hold the development team’s back. They appear as the merge between operations and development, supporting the team by managing the software and applications, deployment of tools in order to simplify procedures and smoothen the development process. With his work the DevOps face delays and other performance interferences by reducing downtimes and system failures. The use of DevOps in your team not only assures quality and an optimized workflow, you also stick to the latest development trends and keep yourself and your team up to date.&lt;/p&gt;

&lt;h2&gt;
  
  
  What skill set do the DevOps need?
&lt;/h2&gt;

&lt;p&gt;Let’s start with the most obvious one: The development skills. The differentiation element of the DevOps in comparison to an administrative manager are their skills regarding programming and scripting. This includes various programming languages, open source technologies and tools as well as knowledge in server systems and security concepts. The DevOps prove their expertise for the position through their understanding of source control systems, infrastructure automation tools, cloud services and testing skills. Aside from the technological competences required in this area, the DevOps need to combine this with a set of soft skills that they can come up with. &lt;/p&gt;

&lt;p&gt;As they stand for the binding component between different teams an excellent communication is indispensable. Bearing in mind the amount of possible issues the DevOps need to solve, which is a challenge for itself, and to keep a cool head and show empathy and integrity is not easy. Last but not least the job requires more than any other the willingness to educate yourself. The digital environment is in a continuous change and so are the skills the DevOps have to maintain in order to stay an expert in their area. Being well-informed about new technologies, systems and procedures will prepare the DevOps for the never ending wave of issues and errors they need to solve to support their team.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do we implement the DevOps role at Factorial?
&lt;/h2&gt;

&lt;p&gt;We at Factorial divide the tasks of the development operations on various shoulders. In this case we not only have specific members of the team dealing with specific tasks, we also use administrative development programs in order to automate workflows. We established a way to centralise logging and monitoring and also administer our zoo of hosted applications like Jira, Confluence and Mattermost to constantly improve our corporate infrastructure. With this we work on new ways of streamlining our processes and think about new features like rapid rollouts of dev instances.&lt;/p&gt;

&lt;p&gt;In addition to that we enhance and develop our local dev stack based on &lt;a href="https://github.com/factorial-io/multibasebox" rel="noopener noreferrer"&gt;MultiBaseBox&lt;/a&gt;. Our devs are using docker for spinning up the needed dependencies for their projects. We are using MultiBaseBox and &lt;a href="https://docs.phab.io/" rel="noopener noreferrer"&gt;phabalicious&lt;/a&gt; for local development. The underlying haproxy container with automatic configuration is also used as an easy way to spin up remote dev instances, so clients can test new features. Our team is constantly enhancing and extending these tools. &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://docs.phab.io/" rel="noopener noreferrer"&gt;phabalicious&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;By using phabalicious our devs are equipped with all necessary and project related information within one single configuration file. With this program our devs can connect to the actual app installation, be it locally installed, behind a ssh-jump-host or part of a kubernetes cluster and can execute common, every-day tasks as getting a database dump, deploying a new version of the application or just get a shell on that particular instance. Recently our engineers added support for kubernetes. It’s actively maintained by our team, and adapted to the ever changing needs of our developers and clients, while trying to be as open as possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  kubernetes
&lt;/h3&gt;

&lt;p&gt;Our devs can rely on kubernetes as a valuable tool to administer and create definition files for our clusters and the clients’ clusters. They can bring Drupal-, Laravel- or Node-based websites and applications into a kubernetes based cluster and monitor the applications over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitLab &amp;amp; docker
&lt;/h3&gt;

&lt;p&gt;As passionate developers we work with GitLab as our main code repository and make full use of its strong integration capabilities provided by Pipelines. In addition to that we use docker to provide the best working environment for our developers all across the globe.  &lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;The DevOps appear as the perfect match to your development team. In fact, as we at Factorial see it, the development team isn’t complete without someone uniting the understanding of development processes and programs with the administrative knowledge that ties all together. The true value this role can bring to your business, is not only from an economical standpoint but also in terms of stress reduction and process optimization. If you haven’t thought working with this role yet, you might be surprised about the value it can contribute to your company. &lt;/p&gt;

</description>
      <category>devops</category>
    </item>
  </channel>
</rss>
