Making local environment and deployments easier using Docksal and Bitbucket Pipelines

About us

Taras Tsiuper - Senior php/Drupal developer

Nikita Pogrebnyak - Senior php/Drupal developer

  • Founded in 2006, with headquarters in Vancouver, Canada
  • Named #1 Drupal Agency by clutch.co
  • Active Drupal Community Participant
  • Working with clients such as Apple, Samsung, Disney, Warner Brothers, Adobe, and multiple universities.

Plan

  • What is Docksal
  • How to install and setup first project
  • Examples how to add different tools
  • What is Bitbucket pipelines
  • What we can do using pipelines
  • How we implement delivery integration using pipelines

What is Docksal

Docksal is an open-source tool created by FFW for defining and managing development environments. It brings together common tools (drush, Drupal Console, composer, PHP Code Sniffer), minimizes time spent on configuration, and ensures environment consistency throughout your continuous integration workflow.

 

Docksal uses Docker to create fully containerized environments. It also uses VirtualBox  to support MacOS and Windows.

How to install Docksal

curl -fsSL get.docksal.io | sh

fin vm start

With Docksal you also get fin, the command line tool used to manage your projects. Fin has built-in commands for every day tasks, like starting and stopping services, importing and exporting databases, initializing projects, executing bash commands inside the containers, and adding ssh keys. Fin is also easily extended with custom commands that can be universal to your computer, or unique for each project.

Setup new project

// See the list of commands.
fin help

// Create new project from scratch.
fin project create

Rebuild project

// Rebuild project.
fin init
#!/usr/bin/env bash

# Project initialization steps
echo -e "${green_bg} Step 1 ${NC}${green} Initializing local project configuration...${NC}"
echo-green "Making site directory 
chmod 755 "${SITEDIR_PATH}"

copy_settings_file "${SITEDIR_PATH}/example.settings.local.php" 
    "${SITEDIR_PATH}/settings.local.php"

if [[ $DOCKER_RUNNING == "true" ]]; then
	echo -e "${green_bg} Step 2 ${NC}${green} Recreating services...${NC}"
	fin reset -f
else
	echo -e "${green_bg} Step 2 ${NC}${green} Creating services...${NC}"
	fin up
fi

echo "Waiting 10s for MySQL to initialize...";
sleep 10

echo -e "${green_bg} Step 3 ${NC}${green} Installing site...${NC}"
fin exec "PHP_OPTIONS="'"-d sendmail_path=`which true`"'" 
    drush site-install -y --site-name='My Drupal 7 Site'"

if is_windows; then
	echo-green "Add ${VIRTUAL_HOST} to your hosts file (/etc/hosts), e.g.:"
	echo-green "192.168.64.100 ${VIRTUAL_HOST}"
	echo
fi

echo -en "${green_bg} DONE! ${NC} "
echo -e "Open ${yellow}http://${VIRTUAL_HOST}${NC} in your browser to verify the setup."
#!/usr/bin/env bash

site_install ()
{
    cd "$PROJECT_ROOT"

    # Download db.
    echo-green "Download db..."
    scp -i ./files/ci_server_key -o StrictHostKeyChecking=no 
        example@example.com:/var/backups/backup.sql.gz ./backup/prod.sql.gz

    # Import db.
    echo-green "Import db..."
    fin exec "gunzip < backup/dump.sql.gz | mysql -hdb -uuser -ppasswword database_name"

    cd "$DOCROOT_PATH"
    # Reset admin password
    echo-green "Reset admin password"
    fin drush upwd --password='123' 'admin'

    # Update db.
    echo-green "Run update db"
    fin drush updb -y

    # Clear cache.
    echo-green "Clear caches"
    fin drush cc all
}

Examples of how to add different tools

version: "2.1"
services:
  web:
    hostname: web
    image: docksal/web:1.0-apache2.2
    volumes:
      - project_root:/var/www:ro
    labels:
      - io.docksal.virtual-host=${VIRTUAL_HOST}
      - io.docksal.project-root=${PROJECT_ROOT}
    environment:
      - VIRTUAL_HOST=${VIRTUAL_HOST}
      - APACHE_DOCUMENTROOT=/var/www/${DOCROOT}
    depends_on:
      - cli

  # DB node
  db:
    hostname: db
    image: docksal/db:1.0-mysql-5.5
    ports:
      - ${MYSQL_PORT}
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}

  # CLI node
  cli:
    hostname: cli
    image: docksal/cli:1.0-php7
    volumes:
      - project_root:/var/www:rw
  

Bitbucket Pipelines

a continuous delivery service in Bitbucket's UI that lets you build, test and deploy your code.

Alternative to

  • Jenkins
  • Bamboo
  • TeamCity
  • Travis
  • ...

Main things you can do using Bitbucket Pipelines:

  • Build
  • Test
  • Deploy

Builds

Bitbucket Pipelines runs all your builds in Docker containers using an image that you specify at the beginning of your configuration file.

pipelines:
  branches:
    master:
      - step:
          script:
            - ./files/dev-deploy.sh
    staging:
      - step:
          script:
            - ./files/stage-deploy.sh
    production:
      - step:
          script:
            - ./files/prod-deploy.sh

Builds

#!/bin/bash

git remote add live repo@example:repo.git
git fetch live
git checkout live_dev
git merge master
git push live live_dev

# Wait for updating acquia server.
sleep 30

# Download backup from prod.
echo "Download backup."
scp -i ./files/ci_server_key -o StrictHostKeyChecking=no 
    prod@example.acquia.com:/var/backups/prod.sql.gz ./backup/prod.sql.gz

# Upload backup on dev.
echo "Upload backup."
ssh -i ./files/ci_server_key -o StrictHostKeyChecking=no dev@example.acquia.com 
    "rm /tmp/prod.sql.gz"
scp -i ./files/ci_server_key -o StrictHostKeyChecking=no ./backup/prod.sql.gz 
    dev@example.acquia.com:/tmp

echo "Import db."
ssh -i ./files/ci_server_key -o StrictHostKeyChecking=no 
tcrc.dev@staging-5808.prod.hosting.acquia.com "cd /tmp && gunzip -f prod.sql.gz 
    && cd /var/www/html/dev/docroot/ && drush sql-drop -y && \`drush sql-connect\` < /tmp/prod.sql"

# Connect to server and run updates.
ssh -i ./files/ci_server_key -o StrictHostKeyChecking=no 
    dev@example.acquia.com "cd /var/www/html/dev/docroot 
    && drush cc all && drush updb -y && drush upwd --password='123' 'admin'"

Builds

Questions ?