Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Robo command to clone and scaffold subsites #5

Draft
wants to merge 19 commits into
base: master
Choose a base branch
from
Draft
7 changes: 3 additions & 4 deletions .ddev/config.local.yaml.example
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,8 @@ hooks:
- exec: drush @self.ddev uli
- exec: mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS basic; GRANT ALL ON basic.* to 'db'@'%';"
service: db
auto-generated: true
- exec: drush @basic.ddev site-install server -y --existing-config --sites-subdir=basic
auto-generated: true
- exec: drush @basic.ddev uli
- exec: mysql -uroot -proot -e "CREATE DATABASE IF NOT EXISTS umami; GRANT ALL ON umami.* to 'db'@'%';"
service: db
# - exec: drush @umami.ddev site-install server -y --existing-config --sites-subdir=umami
# - exec: drush @umami.ddev uli
auto-generated: true
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,7 @@
web/modules/contrib/
web/themes/contrib/
vendor/
web/sites/*
!web/sites/default
config/*
!config/sync
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,28 @@
cd multi-repo
ddev composer install
cp .ddev/config.local.yaml.example .ddev/config.local.yaml
# Allow git inside the container to work, with your hosts's credentials.
ddev auth ssh
# Fetch subsites
ddev exec "cd .. && ./vendor/bin/robo fetch ./robo/sites-collection1.csv"
ddev restart

Every time you want to re-install:

ddev restart

To re-fetch subsites

ddev exec "cd .. && ./vendor/bin/robo fetch ./robo/sites-collection1.csv" && ddev restart

Note it is possibly to execute this also from the host, with

./vendor/bin/robo fetch ./robo/sites-collection1.csv && ddev restart


To clean the working directory after a re-fetch

ddev exec "cd .. && ./vendor/bin/robo reset"

Notice that in the end of the `ddev restart` we get a one time admin link to login, to two sites:

Expand Down
201 changes: 201 additions & 0 deletions RoboFile.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
<?php

use Symfony\Component\Finder\Finder;
use Symfony\Component\Yaml\Yaml;

/**
* This is project's console commands configuration for Robo task runner.
*
* @see http://robo.li/
*/
class RoboFile extends \Robo\Tasks
{

public function fetch(string $filename)
{
$result = $this
->taskExec('git status -s')
->printOutput(FALSE)
->run();

if ($result->getMessage()) {
throw new Exception('The working directory is dirty. Please commit any pending changes.');
}

// Remove directories under web/sites.
$finder = new Finder();
$finder
->directories()
->in('web/sites')
->exclude('default')
// Don't search sub-directories.
->depth('== 0');

if ($finder->hasResults()) {
$task = $this
->taskExecStack()
->stopOnFail();

foreach ($finder as $fileInfo) {
$name = $fileInfo->getFilename();
$task->exec("rm -rf web/sites/$name");
}

$task->run();
}

// Remove symlinks under config.
$finder = new Finder();
$finder
->files()
->in('config')
->exclude('sync')
// Don't search sub-directories.
->depth('== 0');

if ($finder->hasResults()) {
$task = $this
->taskExecStack()
->stopOnFail();

foreach ($finder as $fileInfo) {
$name = $fileInfo->getFilename();
$task->exec("rm config/$name");
}

$task->run();
}

// Remove Drush aliases.
$finder = new Finder();
$finder
->files()
->in('drush/sites')
->notName('self.site.yml')
// Don't search sub-directories.
->depth('== 0');

if ($finder->hasResults()) {
$task = $this
->taskExecStack()
->stopOnFail();

foreach ($finder as $fileInfo) {
$name = $fileInfo->getFilename();
$task->exec("rm drush/sites/$name");
}

$task->run();
}

// Get new subsites from file.
$subSites = [];
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($data = fgetcsv($handle)) !== FALSE) {
$subSites[] = $data;
}
fclose($handle);
}

// Add sub-modules
$task = $this
->taskExecStack()
->stopOnFail();

foreach ($subSites as $row) {
list($name, $git, $branch) = $row;

$branch = $branch ?: 'master';

$path = "web/sites/$name";

// Clone sub-site.
$task->exec("git clone $git $path --branch=$branch");
}

$task->run();

// Adapt DDEV config
$ddevFilename = '.ddev/config.local.yaml.example';
$ddevConfig = Yaml::parseFile($ddevFilename);
$ddevConfig['additional_hostnames'] = [];

foreach ($subSites as $row) {
list($name,,) = $row;
$path = "web/sites/$name";

// Create symlink. We have `../path`, as the symlink needs a relative
// path.
$this->_symlink("../$path/config/$name", "config/$name");

// Copy an adapted `settings.php`
$this->_copy('robo/settings.php', $path.'/settings.php', true);

$this->taskReplaceInFile("$path/settings.php")
->from('{{ name }}')
->to($name)
->run();

// Copy an adapted Drush alias.
$drushAliasFilename = "drush/sites/$name.site.yml";
$this->_copy('robo/drush.site.yml', "drush/sites/$name.site.yml", true);

$this->taskReplaceInFile($drushAliasFilename)
->from('{{ name }}')
->to($name)
->run();

$ddevConfig['additional_hostnames'][] = $name;
}

// Remove previous DDEV `post-start` commands.
foreach ($ddevConfig['hooks']['post-start'] as $index => $row) {
if (!empty($row['auto-generated'])) {
unset($ddevConfig['hooks']['post-start'][$index]);
}
}

// Add new DDEV `post-start` commands.
foreach ($subSites as $row) {
list($name,,) = $row;

$newRows = [
[
'exec' => "mysql -uroot -proot -e \"CREATE DATABASE IF NOT EXISTS $name; GRANT ALL ON basic.* to 'db'@'%';\"",
'service' => 'db',
'auto-generated' => true,
],

[
'exec' => "drush @$name.ddev site-install server -y --existing-config --sites-subdir=$name",
'auto-generated' => true,
],

[
'exec' => "drush @$name.ddev uli",
'auto-generated' => true,
],
];

$ddevConfig['hooks']['post-start'] = array_merge($ddevConfig['hooks']['post-start'], $newRows);
}

$yaml = Yaml::dump($ddevConfig);
file_put_contents($ddevFilename, $yaml);

$this->_copy($ddevFilename, '.ddev/config.local.yaml', true);
}

/**
* Reset directory and git after running the `fetch` command.
*/
public function reset() {
$this
->taskExecStack()
->stopOnFail()
->exec('git reset --hard HEAD')
->exec('git clean -fd')
->exec('git status')
->run();
}
}
1 change: 1 addition & 0 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
"drush/drush": "^10.2"
},
"require-dev": {
"consolidation/robo": "^1.0.0"
},
"conflict": {
"drupal/drupal": "*"
Expand Down
1 change: 0 additions & 1 deletion config/basic

This file was deleted.

2 changes: 2 additions & 0 deletions drush/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
!sites/self.site.yml
sites/
3 changes: 0 additions & 3 deletions drush/sites/basic.site.yml

This file was deleted.

3 changes: 0 additions & 3 deletions drush/sites/umami.site.yml

This file was deleted.

3 changes: 3 additions & 0 deletions robo/drush.site.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
ddev:
root: /var/www/html/web/sites/{{ name }}
uri: https://{{ name }}.ddev.site:4443
3 changes: 2 additions & 1 deletion web/sites/umami/settings.php → robo/settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,5 @@
if (file_exists($app_root . '/sites/default/settings.ddev.php')) {
include $app_root . '/sites/default/settings.ddev.php';
}
$databases['default']['default']['database'] = 'umami';
$databases['default']['default']['database'] = '{{ name }}';
$config['config_split.config_split.{{ name }}']['status'] = TRUE;
1 change: 1 addition & 0 deletions robo/sites-collection1.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
basic,[email protected]:Gizra/multi-repo-basic.git,remove-settings
1 change: 0 additions & 1 deletion web/sites/basic
Submodule basic deleted from 823896