Compare commits
33 commits
Author | SHA1 | Date | |
---|---|---|---|
b3ad73513f | |||
12b8b089ba | |||
ca10d38c79 | |||
5e90535248 | |||
9decb1ec43 | |||
1cf3c711c3 | |||
9eb333da90 | |||
0f22c4e8ba | |||
24ffbe4fc0 | |||
ce94945655 | |||
96e1ca8d7c | |||
e9d18939b5 | |||
d8f3cbf76b | |||
74e75ac8a6 | |||
60880f668b | |||
69f094523a | |||
96f4752d2e | |||
74839b539d | |||
b402df87af | |||
62a9b204a0 | |||
43e80fa822 | |||
35d72e4210 | |||
1f9756cc00 | |||
d1d88526b2 | |||
e239e43e6b | |||
7152ebc412 | |||
80dcc8a215 | |||
ed32463a57 | |||
199bc8f0ed | |||
e11d7e669a | |||
57e8aa59fa | |||
5b4c91091e | |||
fe1640c5b8 |
21 changed files with 198 additions and 190 deletions
150
README.md
150
README.md
|
@ -1,143 +1,21 @@
|
|||
# Composer template for Drupal projects
|
||||
# Dransible
|
||||
|
||||
[](https://travis-ci.org/drupal-composer/drupal-project)
|
||||
A demo [Drupal] application for demonstrating PHP application deployment with [Ansible][], [Ansible Vault][] and [Ansistrano][].
|
||||
|
||||
This project template provides a starter kit for managing your site
|
||||
dependencies with [Composer](https://getcomposer.org/).
|
||||
[Ansible]: https://www.ansible.com
|
||||
[Ansible Vault]: https://docs.ansible.com/ansible/ansible-vault.html
|
||||
[Ansistrano]: https://ansistrano.com
|
||||
[Drupal]: https://drupal.org
|
||||
|
||||
If you want to know how to use it as replacement for
|
||||
[Drush Make](https://github.com/drush-ops/drush/blob/8.x/docs/make.md) visit
|
||||
the [Documentation on drupal.org](https://www.drupal.org/node/2471553).
|
||||
## Prerequisites
|
||||
|
||||
## Usage
|
||||
- [Ansible][]
|
||||
- [Vagrant][]
|
||||
- [VirtualBox][]
|
||||
|
||||
First you need to [install composer](https://getcomposer.org/doc/00-intro.md#installation-linux-unix-osx).
|
||||
[Vagrant]: https://www.vagrantup.com
|
||||
[VirtualBox]: https://www.virtualbox.or
|
||||
|
||||
> Note: The instructions below refer to the [global composer installation](https://getcomposer.org/doc/00-intro.md#globally).
|
||||
You might need to replace `composer` with `php composer.phar` (or similar)
|
||||
for your setup.
|
||||
## Installation
|
||||
|
||||
After that you can create the project:
|
||||
|
||||
```
|
||||
composer create-project drupal-composer/drupal-project:8.x-dev some-dir --stability dev --no-interaction
|
||||
```
|
||||
|
||||
With `composer require ...` you can download new dependencies to your
|
||||
installation.
|
||||
|
||||
```
|
||||
cd some-dir
|
||||
composer require drupal/devel:~1.0
|
||||
```
|
||||
|
||||
The `composer create-project` command passes ownership of all files to the
|
||||
project that is created. You should create a new git repository, and commit
|
||||
all files not excluded by the .gitignore file.
|
||||
|
||||
## What does the template do?
|
||||
|
||||
When installing the given `composer.json` some tasks are taken care of:
|
||||
|
||||
* Drupal will be installed in the `web`-directory.
|
||||
* Autoloader is implemented to use the generated composer autoloader in `vendor/autoload.php`,
|
||||
instead of the one provided by Drupal (`web/vendor/autoload.php`).
|
||||
* Modules (packages of type `drupal-module`) will be placed in `web/modules/contrib/`
|
||||
* Theme (packages of type `drupal-theme`) will be placed in `web/themes/contrib/`
|
||||
* Profiles (packages of type `drupal-profile`) will be placed in `web/profiles/contrib/`
|
||||
* Creates default writable versions of `settings.php` and `services.yml`.
|
||||
* Creates `web/sites/default/files`-directory.
|
||||
* Latest version of drush is installed locally for use at `vendor/bin/drush`.
|
||||
* Latest version of DrupalConsole is installed locally for use at `vendor/bin/drupal`.
|
||||
* Creates environment variables based on your .env file. See [.env.example](.env.example).
|
||||
|
||||
## Updating Drupal Core
|
||||
|
||||
This project will attempt to keep all of your Drupal Core files up-to-date; the
|
||||
project [drupal-composer/drupal-scaffold](https://github.com/drupal-composer/drupal-scaffold)
|
||||
is used to ensure that your scaffold files are updated every time drupal/core is
|
||||
updated. If you customize any of the "scaffolding" files (commonly .htaccess),
|
||||
you may need to merge conflicts if any of your modified files are updated in a
|
||||
new release of Drupal core.
|
||||
|
||||
Follow the steps below to update your core files.
|
||||
|
||||
1. Run `composer update drupal/core webflo/drupal-core-require-dev symfony/* --with-dependencies` to update Drupal Core and its dependencies.
|
||||
1. Run `git diff` to determine if any of the scaffolding files have changed.
|
||||
Review the files for any changes and restore any customizations to
|
||||
`.htaccess` or `robots.txt`.
|
||||
1. Commit everything all together in a single commit, so `web` will remain in
|
||||
sync with the `core` when checking out branches or running `git bisect`.
|
||||
1. In the event that there are non-trivial conflicts in step 2, you may wish
|
||||
to perform these steps on a branch, and use `git merge` to combine the
|
||||
updated core files with your customized files. This facilitates the use
|
||||
of a [three-way merge tool such as kdiff3](http://www.gitshah.com/2010/12/how-to-setup-kdiff-as-diff-tool-for-git.html). This setup is not necessary if your changes are simple;
|
||||
keeping all of your modifications at the beginning or end of the file is a
|
||||
good strategy to keep merges easy.
|
||||
|
||||
## Generate composer.json from existing project
|
||||
|
||||
With using [the "Composer Generate" drush extension](https://www.drupal.org/project/composer_generate)
|
||||
you can now generate a basic `composer.json` file from an existing project. Note
|
||||
that the generated `composer.json` might differ from this project's file.
|
||||
|
||||
|
||||
## FAQ
|
||||
|
||||
### Should I commit the contrib modules I download?
|
||||
|
||||
Composer recommends **no**. They provide [argumentation against but also
|
||||
workrounds if a project decides to do it anyway](https://getcomposer.org/doc/faqs/should-i-commit-the-dependencies-in-my-vendor-directory.md).
|
||||
|
||||
### Should I commit the scaffolding files?
|
||||
|
||||
The [drupal-scaffold](https://github.com/drupal-composer/drupal-scaffold) plugin can download the scaffold files (like
|
||||
index.php, update.php, …) to the web/ directory of your project. If you have not customized those files you could choose
|
||||
to not check them into your version control system (e.g. git). If that is the case for your project it might be
|
||||
convenient to automatically run the drupal-scaffold plugin after every install or update of your project. You can
|
||||
achieve that by registering `@composer drupal:scaffold` as post-install and post-update command in your composer.json:
|
||||
|
||||
```json
|
||||
"scripts": {
|
||||
"post-install-cmd": [
|
||||
"@composer drupal:scaffold",
|
||||
"..."
|
||||
],
|
||||
"post-update-cmd": [
|
||||
"@composer drupal:scaffold",
|
||||
"..."
|
||||
]
|
||||
},
|
||||
```
|
||||
### How can I apply patches to downloaded modules?
|
||||
|
||||
If you need to apply patches (depending on the project being modified, a pull
|
||||
request is often a better solution), you can do so with the
|
||||
[composer-patches](https://github.com/cweagans/composer-patches) plugin.
|
||||
|
||||
To add a patch to drupal module foobar insert the patches section in the extra
|
||||
section of composer.json:
|
||||
```json
|
||||
"extra": {
|
||||
"patches": {
|
||||
"drupal/foobar": {
|
||||
"Patch description": "URL or local path to patch"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
### How do I switch from packagist.drupal-composer.org to packages.drupal.org?
|
||||
|
||||
Follow the instructions in the [documentation on drupal.org](https://www.drupal.org/docs/develop/using-composer/using-packagesdrupalorg).
|
||||
|
||||
### How do I specify a PHP version ?
|
||||
|
||||
Currently Drupal 8 supports PHP 5.5.9 as minimum version (see [Drupal 8 PHP requirements](https://www.drupal.org/docs/8/system-requirements/drupal-8-php-requirements)), however it's possible that a `composer update` will upgrade some package that will then require PHP 7+.
|
||||
|
||||
To prevent this you can add this code to specify the PHP version you want to use in the `config` section of `composer.json`:
|
||||
```json
|
||||
"config": {
|
||||
"sort-packages": true,
|
||||
"platform": {"php": "5.5.9"}
|
||||
},
|
||||
```
|
||||
See [installation.md](docs/installation.md)
|
||||
|
|
7
Vagrantfile
vendored
7
Vagrantfile
vendored
|
@ -8,6 +8,8 @@ Vagrant.configure("2") do |config|
|
|||
|
||||
config.vm.provider "virtualbox" do |vb|
|
||||
vb.name = 'dransible'
|
||||
vb.memory = 2048
|
||||
vb.cpus = 1
|
||||
end
|
||||
|
||||
# Set the name of the VM. See: http://stackoverflow.com/a/17864388/100134
|
||||
|
@ -16,9 +18,10 @@ Vagrant.configure("2") do |config|
|
|||
|
||||
config.vm.provision "ansible" do |ansible|
|
||||
ansible.compatibility_mode = "2.0"
|
||||
ansible.playbook = "ansible/provisioning/main.yml"
|
||||
ansible.inventory_path = "ansible/hosts.ini"
|
||||
ansible.playbook = "tools/ansible/provision.yml"
|
||||
ansible.inventory_path = "tools/ansible/hosts.yml"
|
||||
ansible.become = true
|
||||
ansible.ask_vault_pass = true
|
||||
end
|
||||
|
||||
end
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
[defaults]
|
||||
inventory = ./ansible/hosts.ini
|
||||
inventory = ./tools/ansible/hosts.yml
|
||||
nocows = True
|
||||
private_key_file = .vagrant/machines/dransible/virtualbox/private_key
|
||||
remote_user = vagrant
|
||||
retry_files_enabled = False
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
---
|
||||
- hosts: dransible
|
||||
become: true
|
||||
|
||||
tasks:
|
||||
- name: Creating project directory
|
||||
file:
|
||||
path: /var/www/app
|
||||
state: directory
|
||||
|
||||
- name: Uploading application
|
||||
synchronize:
|
||||
src: ../../../../
|
||||
dest: /var/www/app
|
||||
|
||||
- name: Installing Composer dependencies
|
||||
composer:
|
||||
command: install
|
||||
working_dir: /var/www/app
|
|
@ -1 +0,0 @@
|
|||
dransible ansible_ssh_host=192.168.33.10 ansible_ssh_port=22
|
|
@ -1,21 +0,0 @@
|
|||
---
|
||||
apache_vhosts:
|
||||
- servername: dransible
|
||||
documentroot: "/var/www/app/web"
|
||||
|
||||
php_packages:
|
||||
- libapache2-mod-php{{ php_default_version_debian }}
|
||||
- libpcre3-dev
|
||||
- php-apcu
|
||||
- php-sqlite3
|
||||
- php{{ php_default_version_debian }}-cli
|
||||
- php{{ php_default_version_debian }}-common
|
||||
- php{{ php_default_version_debian }}-curl
|
||||
- php{{ php_default_version_debian }}-dev
|
||||
- php{{ php_default_version_debian }}-fpm
|
||||
- php{{ php_default_version_debian }}-gd
|
||||
- php{{ php_default_version_debian }}-imap
|
||||
- php{{ php_default_version_debian }}-json
|
||||
- php{{ php_default_version_debian }}-mbstring
|
||||
- php{{ php_default_version_debian }}-opcache
|
||||
- php{{ php_default_version_debian }}-xml
|
|
@ -1,6 +0,0 @@
|
|||
---
|
||||
- src: geerlingguy.apache
|
||||
- src: geerlingguy.composer
|
||||
- src: geerlingguy.mysql
|
||||
- src: geerlingguy.php
|
||||
- src: geerlingguy.php-mysql
|
BIN
docs/images/after-deploy.png
Normal file
BIN
docs/images/after-deploy.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 675 KiB |
BIN
docs/images/before-deploy.png
Normal file
BIN
docs/images/before-deploy.png
Normal file
Binary file not shown.
After ![]() (image error) Size: 554 KiB |
19
docs/installation.md
Normal file
19
docs/installation.md
Normal file
|
@ -0,0 +1,19 @@
|
|||
# Installation
|
||||
|
||||
1. Run `vagrant up` or `vagrant up --provision` if needed, to start Vagrant and provision the virtual machine using the `tools/ansible/provision.yml` playbook. This will set up a LAMP stack with Apache, MySQL, PHP and Composer.
|
||||
|
||||
If you try loading the site at this point you will see a `The requested URL was not found on this server` message as the site has not yet been deployed.
|
||||
|
||||

|
||||
|
||||
1. Run the deploy playbook to deploy the application code to the virtual machine. The Vault password, which is `dransible`, is stored in `tools/ansible/vault-password.txt` as this is an example project.
|
||||
|
||||
```
|
||||
ansible-playbook tools/ansible/deploy.yml \
|
||||
-i tools/ansible/hosts.yml \
|
||||
--vault-password-file=tools/ansible/vault-password.txt
|
||||
```
|
||||
|
||||
1. Load `http://dransible` in a browser, and you should see a Drupal 8 website.
|
||||
|
||||

|
25
tools/ansible/deploy.yml
Normal file
25
tools/ansible/deploy.yml
Normal file
|
@ -0,0 +1,25 @@
|
|||
---
|
||||
- hosts: dransible
|
||||
become: true
|
||||
|
||||
roles:
|
||||
- drupal-settings
|
||||
- ansistrano.deploy
|
||||
|
||||
vars_files:
|
||||
- vars/vault.yml
|
||||
- vars/vars.yml
|
||||
|
||||
vars:
|
||||
release_drupal_path: "{{ ansistrano_release_path.stdout }}/web"
|
||||
release_drush_path: "{{ ansistrano_release_path.stdout }}/vendor/bin/drush"
|
||||
|
||||
ansistrano_deploy_via: "rsync"
|
||||
ansistrano_deploy_from: "{{ playbook_dir }}/../../"
|
||||
ansistrano_deploy_to: "{{ project_deploy_dir }}"
|
||||
ansistrano_keep_releases: 5
|
||||
ansistrano_after_symlink_shared_tasks_file: "{{ playbook_dir }}/deploy/after-symlink-shared.yml"
|
||||
ansistrano_after_symlink_tasks_file: "{{ playbook_dir }}/deploy/after-symlink.yml"
|
||||
ansistrano_after_update_code_tasks_file: "{{ playbook_dir }}/deploy/after-update-code.yml"
|
||||
ansistrano_shared_paths:
|
||||
- "{{ project_subdir }}/sites/default/files"
|
11
tools/ansible/deploy/after-symlink-shared.yml
Normal file
11
tools/ansible/deploy/after-symlink-shared.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
---
|
||||
- name: Fix files directory permissions
|
||||
become: true
|
||||
file:
|
||||
path: '{{ project_deploy_dir }}/shared/web/sites/default/files'
|
||||
state: directory
|
||||
mode: 0775
|
||||
recurse: true
|
||||
|
||||
- name: Install Drupal
|
||||
command: '{{ release_drush_path }} --root {{ release_drupal_path }} site-install -y --account-pass=admin123 --site-name="PHP South Wales"'
|
1
tools/ansible/deploy/after-symlink.yml
Normal file
1
tools/ansible/deploy/after-symlink.yml
Normal file
|
@ -0,0 +1 @@
|
|||
---
|
22
tools/ansible/deploy/after-update-code.yml
Normal file
22
tools/ansible/deploy/after-update-code.yml
Normal file
|
@ -0,0 +1,22 @@
|
|||
---
|
||||
- name: Remove settings.php
|
||||
file:
|
||||
path: '{{ ansistrano_release_path.stdout }}/web/sites/{{ item.1.name|default("default")}}/settings.php'
|
||||
state: absent
|
||||
with_subelements:
|
||||
- '{{ drupal_settings }}'
|
||||
- sites
|
||||
|
||||
- name: Link settings.php
|
||||
file:
|
||||
src: '/tmp/app/sites/{{ item.1.name|default("default")}}/settings.php'
|
||||
dest: '{{ ansistrano_release_path.stdout }}/web/sites/{{ item.1.name|default("default")}}/settings.php'
|
||||
state: link
|
||||
with_subelements:
|
||||
- '{{ drupal_settings }}'
|
||||
- sites
|
||||
|
||||
- name: Install Composer dependencies
|
||||
composer:
|
||||
command: install
|
||||
working_dir: '{{ ansistrano_release_path.stdout }}'
|
5
tools/ansible/hosts.yml
Normal file
5
tools/ansible/hosts.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
all:
|
||||
hosts:
|
||||
dransible:
|
||||
ansible_ssh_host: 192.168.33.10
|
||||
ansible_ssh_port: 22
|
|
@ -10,17 +10,18 @@
|
|||
- geerlingguy.composer
|
||||
|
||||
vars_files:
|
||||
- vars/main.yml
|
||||
- vars/vault.yml
|
||||
- vars/vars.yml
|
||||
|
||||
tasks:
|
||||
- name: Create a database
|
||||
mysql_db:
|
||||
name: drupal
|
||||
name: '{{ database_name }}'
|
||||
state: present
|
||||
|
||||
- name: Add the database user
|
||||
mysql_user:
|
||||
name: drupal
|
||||
password: drupal
|
||||
name: '{{ database_user }}'
|
||||
password: '{{ database_password }}'
|
||||
priv: '*.*:ALL'
|
||||
state: present
|
15
tools/ansible/requirements.yml
Normal file
15
tools/ansible/requirements.yml
Normal file
|
@ -0,0 +1,15 @@
|
|||
---
|
||||
- src: ansistrano.deploy
|
||||
version: 3.0.1
|
||||
- src: ansistrano.rollback
|
||||
version: 3.0.0
|
||||
- src: geerlingguy.apache
|
||||
version: 3.0.3
|
||||
- src: geerlingguy.composer
|
||||
version: 1.7.3
|
||||
- src: geerlingguy.mysql
|
||||
version: 2.9.4
|
||||
- src: geerlingguy.php
|
||||
version: 3.7.0
|
||||
- src: geerlingguy.php-mysql
|
||||
version: 2.0.2
|
12
tools/ansible/rollback.yml
Normal file
12
tools/ansible/rollback.yml
Normal file
|
@ -0,0 +1,12 @@
|
|||
---
|
||||
- hosts: dransible
|
||||
become: true
|
||||
|
||||
roles:
|
||||
- ansistrano.rollback
|
||||
|
||||
vars_files:
|
||||
- vars/vars.yml
|
||||
|
||||
vars:
|
||||
ansistrano_deploy_to: "{{ project_deploy_dir }}"
|
49
tools/ansible/vars/vars.yml
Normal file
49
tools/ansible/vars/vars.yml
Normal file
|
@ -0,0 +1,49 @@
|
|||
---
|
||||
apache_vhosts:
|
||||
- servername: dransible
|
||||
documentroot: "{{ project_docroot }}"
|
||||
|
||||
php_packages:
|
||||
- libapache2-mod-php{{ php_default_version_debian }}
|
||||
- libpcre3-dev
|
||||
- php-apcu
|
||||
- php-sqlite3
|
||||
- php{{ php_default_version_debian }}-cli
|
||||
- php{{ php_default_version_debian }}-common
|
||||
- php{{ php_default_version_debian }}-curl
|
||||
- php{{ php_default_version_debian }}-dev
|
||||
- php{{ php_default_version_debian }}-fpm
|
||||
- php{{ php_default_version_debian }}-gd
|
||||
- php{{ php_default_version_debian }}-imap
|
||||
- php{{ php_default_version_debian }}-json
|
||||
- php{{ php_default_version_debian }}-mbstring
|
||||
- php{{ php_default_version_debian }}-opcache
|
||||
- php{{ php_default_version_debian }}-xml
|
||||
|
||||
ansistrano_current_dir: current
|
||||
|
||||
project_deploy_dir: /var/www/app
|
||||
project_subdir: web
|
||||
project_docroot: "{{ project_deploy_dir }}/{{ ansistrano_current_dir }}/{{ project_subdir }}"
|
||||
|
||||
database_name: "{{ vault_database_name }}"
|
||||
database_password: "{{ vault_database_password }}"
|
||||
database_user: "{{ vault_database_user }}"
|
||||
hash_salt: "{{ vault_hash_salt }}"
|
||||
|
||||
drupal_settings:
|
||||
- drupal_root: /tmp/app
|
||||
sites:
|
||||
- name: default
|
||||
settings:
|
||||
databases:
|
||||
default:
|
||||
default:
|
||||
driver: mysql
|
||||
host: localhost
|
||||
database: '{{ database_name }}'
|
||||
username: '{{ database_user }}'
|
||||
password: '{{ database_password }}'
|
||||
hash_salt: '{{ hash_salt }}'
|
||||
config_directories:
|
||||
sync: ../config/sync
|
12
tools/ansible/vars/vault.yml
Normal file
12
tools/ansible/vars/vault.yml
Normal file
|
@ -0,0 +1,12 @@
|
|||
$ANSIBLE_VAULT;1.1;AES256
|
||||
61653737643939333936636566323038316561323033633831656536643733343639356232356538
|
||||
3238306433353165626531646366646132626233646561390a386534373066346234373237373865
|
||||
64363663323662666261616136663239366634643135386433613639313532653262373932386166
|
||||
3736626562653963390a666566643537356436303166356130616530306562303565323637343631
|
||||
31333837303166623130353530636366663464346431643837303637343863353764373236303861
|
||||
65623364383839623063393466303637653865393031626234366361333261633238383261646233
|
||||
31313131393933636236326463313830346534613862333733306265633962663964386638623435
|
||||
64323437373262653862383063343436633237353865386539653263623935626431363362363436
|
||||
37306338313134383334316232383238663830346231393638353834663730663663626465353862
|
||||
34366132653430326230613164333533326463346638393866636465343237613263346232663538
|
||||
306164366133323334373862353238343834
|
1
tools/ansible/vault-password.txt
Normal file
1
tools/ansible/vault-password.txt
Normal file
|
@ -0,0 +1 @@
|
|||
dransible
|
Loading…
Add table
Add a link
Reference in a new issue