diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..c817255 --- /dev/null +++ b/Rakefile @@ -0,0 +1,23 @@ +# "dev" => { +# "host" => "vlad@simone.mayfirst.org", +# "path" => "/var/local/drupal/findit/web", +# "backups" => "/tmp", +# }, +ENVIRONMENTS = { + "test" => { + "host" => "agaric_test@drutopia.org", + "path" => "/home/agaric_test/site/web", + "drush" => "/home/agaric_test/site/vendor/bin/drush", + "backups" => "/tmp", + }, + "live" => { + "host" => "agaric_live@drutopia.org", + "path" => "/home/agaric_live/site/web", + "drush" => "/home/agaric_live/site/vendor/bin/drush", + "backups" => "/tmp", + }, +} +TAGNAMES = %w(stable) +DRUPAL = "web" +PROFILE = "agaric" +BUILDDIR = "/tmp/build" diff --git a/provisioning/box/config.yml b/provisioning/box/config.yml index aff5053..61307a1 100644 --- a/provisioning/box/config.yml +++ b/provisioning/box/config.yml @@ -155,7 +155,7 @@ installed_extras: - nodejs - pimpmylog # - redis - # - ruby + - ruby # - selenium # - solr # - tideways @@ -206,13 +206,6 @@ php_opcache_max_accelerated_files: 4096 php_max_input_vars: "4000" php_packages_extra: ['php7.1-zip'] -# Run specified scripts before or after VM is provisioned. Use {{ playbook_dir }} -# to reference the provisioning/ folder in Drupal VM or {{ config_dir }} to -# reference the directory where your `config.yml` is. -pre_provision_scripts: [] -post_provision_scripts: [] - # - "{{ playbook_dir }}/../examples/scripts/configure-solr.sh" - # MySQL Configuration. mysql_root_password: root mysql_slow_query_log_enabled: true @@ -229,7 +222,7 @@ npm_config_prefix: "/home/{{ drupalvm_user }}/.npm-global" # Ruby Configuration (if enabled above). ruby_install_gems_user: "{{ drupalvm_user }}" -ruby_install_gems: [] +ruby_install_gems: ['rake'] # Varnish Configuration (if enabled above). varnish_listen_port: "81" @@ -272,5 +265,5 @@ hostname_configure: true hostname_fqdn: "{{ vagrant_hostname }}" ssh_home: "{{ drupal_core_path }}" -post_provision_tasks_dir: ../../provisioning/box/post-tasks/*.yml pre_provision_tasks_dir: ../../provisioning/box/pre-tasks/*.yml +post_provision_tasks_dir: ../../provisioning/box/post-tasks/*.yml diff --git a/provisioning/box/post-tasks/10-drupal.yml b/provisioning/box/post-tasks/10-drupal.yml index 7f60da5..d3787e3 100644 --- a/provisioning/box/post-tasks/10-drupal.yml +++ b/provisioning/box/post-tasks/10-drupal.yml @@ -51,7 +51,7 @@ dest: "{{ drupal_core_path }}/sites/default/settings.local.php" - name: Check if site is already installed. - command: "{{ drupal_composer_install_dir }}/vendor/bin/drush --root={{ drupal_core_path}}/ status bootstrap" + command: "{{ drupal_composer_install_dir }}/vendor/bin/drush --root={{ drupal_core_path }}/ status bootstrap" args: chdir: "{{ drupal_core_path }}" register: drupal_site_installed @@ -59,6 +59,16 @@ changed_when: false become: no +- name: create drush.yml + template: + src: "drush.yml.j2" + dest: "{{ drupal_composer_install_dir }}/drush/drush.yml" + +- name: create local.site.yml + template: + src: "local.site.yml.j2" + dest: "{{ drupal_composer_install_dir }}/drush/sites/local.site.yml" + - name: Install Drupal with drush. command: > {{ drupal_composer_install_dir }}/vendor/bin/drush site-install -y diff --git a/provisioning/box/post-tasks/templates/drush.yml.j2 b/provisioning/box/post-tasks/templates/drush.yml.j2 new file mode 100644 index 0000000..01c15aa --- /dev/null +++ b/provisioning/box/post-tasks/templates/drush.yml.j2 @@ -0,0 +1,3 @@ +options: + uri: "http://{{ vagrant_hostname }}" + root: "{{ drupal_core_path }}" diff --git a/provisioning/box/post-tasks/templates/local.site.yml.j2 b/provisioning/box/post-tasks/templates/local.site.yml.j2 new file mode 100644 index 0000000..6e57f9f --- /dev/null +++ b/provisioning/box/post-tasks/templates/local.site.yml.j2 @@ -0,0 +1,7 @@ +dev: + root: "{{ drupal_core_path }}" + uri: "http://{{ vagrant_hostname }}" + +local: + root: "{{ drupal_core_path }}" + uri: "http://{{ vagrant_hostname }}" diff --git a/rakelib/agaric.rake b/rakelib/agaric.rake new file mode 100644 index 0000000..3f82e9d --- /dev/null +++ b/rakelib/agaric.rake @@ -0,0 +1,106 @@ +# As agaric.rake did not know how to deploy to Drutopia, +# all deployment features have been removed. +# Use drutopia_host to deploy. + +require 'date' +require 'rake/clean' + +CLEAN.include("#{BUILDDIR}") + +ENVIRONMENTS.keys.each do |env| + settings_source = "#{BUILDDIR}/#{env}/#{DRUPAL}/sites/default/#{env}.settings.php" + settings_target = "#{BUILDDIR}/#{env}/#{DRUPAL}/sites/default/settings.php" + + release_host = ENVIRONMENTS[env]["host"] + release_path = ENVIRONMENTS[env]["path"] + release_backups = ENVIRONMENTS[env]["backups"] + release_tag = ENVIRONMENTS[env]["tag"] + drush_path = ENVIRONMENTS[env]["drush"] + drush_path = drush_path ? drush_path : "drush" + + db_backup_task = "db_backup_#{env}".to_sym + task db_backup_task do + file = "#{release_backups}/backup-#{env}-#{DateTime.now}.sql.gz" + sh "ssh #{release_host} '#{drush_path} -r #{release_path} sql-dump --structure-tables-key=common --gzip > #{file}'" + end + + db_drop_tables_task = "db_drop_tables_#{env}".to_sym + task db_drop_tables_task => db_backup_task do + sh "ssh #{release_host} #{drush_path} -y -r #{release_path} sql-drop" + end + + file_sync_task = "file_sync_#{env}_to_local".to_sym + desc "Sync files from #{env} to local environment." + task file_sync_task do + sh "rsync -rz --stats --exclude styles --exclude css --exclude js --delete \ + #{release_host}:#{release_path}/sites/default/files/ \ + #{DRUPAL}/sites/default/files/" + end + + db_sync_task = "db_sync_#{env}_to_local".to_sym + desc "Sync database from #{env} to local environment." + task db_sync_task do + sh "drush -y sql-drop" + sh "ssh -C #{release_host} #{drush_path} -r #{release_path} \ + sql-dump --structure-tables-key=common | drush sql-cli" + end + + ENVIRONMENTS.keys.each do |e| + unless e == env then + from_host = ENVIRONMENTS[e]["host"] + from_path = ENVIRONMENTS[e]["path"] + from_drush = ENVIRONMENTS[e]["drush"] + from_drush = from_drush ? from_drush : "drush" + + file_sync_task = "file_sync_#{e}_to_#{env}".to_sym + desc "Sync files from #{e} to #{env} environment." + task file_sync_task do + sh "ssh -A #{from_host} rsync -rz --stats --exclude styles \ + --exclude css --exclude js #{from_path}/sites/default/files/ \ + --delete " + (from_host == release_host ? "" : "#{release_host}:") + "#{release_path}/sites/default/files/" + end + db_sync_task = "db_sync_#{e}_to_#{env}".to_sym + desc "Sync database from #{e} to #{env} environment." + task db_sync_task => db_drop_tables_task do + sh "ssh -C #{from_host} #{from_drush} -r #{from_path} \ + sql-dump --structure-tables-key=common | \ + ssh -C #{release_host} #{drush_path} -r #{release_path} sql-cli" + end + end + end +end + +TAGNAMES.each do |tagname| + desc "Tag a commit with #{tagname}." + task "tag_#{tagname}".to_sym do + sh "git fetch --tags" + num = `git tag`.scan(Regexp.new(tagname + "-")).size + 1 + sh "git tag -am '#{tagname.upcase} Release #{num}' #{tagname}-#{num}" + sh "git tag -afm 'Current #{tagname.upcase} Release' #{tagname}" + sh "git push origin :refs/tags/#{tagname}" + sh "git push origin --tags" + end +end + +desc "Detect coding standard violations in profile and custom modules." +task :sniff do + files = ["web/profiles/#{PROFILE}", 'web/sites/all/modules/custom'].join(' ') + extensions = ['module', 'profile', 'install', 'inc', 'php'].join(',') + sh "phpcs --extensions=#{extensions} #{files}" +end + +namespace :tests do + + desc "Run integration tests." + task "integration" do + sh "phpunit --process-isolation --bootstrap=tests/bootstrap.php tests/integration" + end + +end + +if defined? PROFILE + desc "Delete and re-install a site from its installation profile." + task "site_install" do + sh "#{drush_path} -y site-install #{PROFILE}" + end +end diff --git a/rakelib/init.rake b/rakelib/init.rake new file mode 100644 index 0000000..0784973 --- /dev/null +++ b/rakelib/init.rake @@ -0,0 +1,40 @@ +desc "Create a central bare repository from the local repository." +task :init_repo do + repo_id = File.basename(Dir.getwd) + repo_path = "/srv/git/#{repo_id}.git" + post_receive = "/usr/bin/kgb-client --git-reflog - --conf /etc/kgb-client/kgb.conf --repository git --repo-id #{repo_id}" + + commands = [ + "mkdir #{repo_path}", + "cd #{repo_path}", + "git init --bare", + # For HTTP access such as gitweb + "mv hooks/post-update.sample hooks/post-update", + # For KGB to send commit notifications over IRC. + # This still requires additional server-side configuration, see + # http://my.agaric.com/agaric/node/11694 + "echo #{post_receive} >> hooks/post-receive", + "chmod a+x hooks/post-receive" + ].join(" && ") + sh "ssh git.agaric.com '#{commands}'" + sh "git remote add origin git.agaric.com:#{repo_path}" + sh "git push origin master" +end + +desc "Add .gitignore file with basic project specific patterns." +task ".gitignore" do + open(".gitignore", "a") do |f| + f.puts ".sass-cache/" + f.puts ".vagrant/" + f.puts "build/" + f.puts "web/sites/default/settings.php" + f.puts "web/sites/default/files/" + end +end + +desc "Add .gitattributes file with basic project specific patterns." +task ".gitattributes" do + open(".gitattributes", "a") do |f| + f.puts "etc export-ignore" + end +end