Slide 1

Slide 1 text

Working with Workspace Oliver Davies, Inviqa

Slide 2

Slide 2 text

What is Workspace? • A tool that we use and maintain at Inviqa • Primarily for building and managing Docker Compose environments • Built on Symfony • Create custom commands for your project environments • Alternative to a bash script or a Makefile • And more... @opdavies

Slide 3

Slide 3 text

Features • Commands • Functions • Attributes • Encrypting/decrypting secrets • Generating configuration files • Global services: logging, mail, proxy @opdavies

Slide 4

Slide 4 text

Installation # Download from GitHub. wget https://github.com/my127/workspace/releases/download/0.1.3/ws # Make it executable. chmod +x ws # Make it accessible. mv ws /usr/local/bin @opdavies

Slide 5

Slide 5 text

@opdavies

Slide 6

Slide 6 text

Replacing your Makefile @opdavies

Slide 7

Slide 7 text

Running simple commands 1 # workspace.yml 2 3 workspace('oliverdavies-uk'): 4 description: My personal website codebase. 5 6 command('say-hello'): 7 #!bash 8 echo 'Hello world' 9 10 command('say-hello'): 11 #!php 12 echo 'Hello World'; @opdavies

Slide 8

Slide 8 text

@opdavies

Slide 9

Slide 9 text

'run' vs. 'passthru' command('say-hello'): #!bash run echo 'Hello World' passthru echo 'Hello World' @opdavies

Slide 10

Slide 10 text

Attributes 1 attribute('message'): Hello World! 2 3 command('say-hello'): | 4 #!bash|@ 5 echo @('message') @opdavies

Slide 11

Slide 11 text

Arguments 1 command('say-hello '): | 2 #!bash|= 3 echo ={ @('message') } from ={ input.argument('name') } @opdavies

Slide 12

Slide 12 text

Environment variables 1 command('say-hello '): 2 env: 3 MESSAGE: = @('message') 4 NAME: = input.argument('name') 5 exec: | 6 #!bash|= 7 echo "$MESSAGE from $NAME" @opdavies

Slide 13

Slide 13 text

Managing secrets # ws secret generate-random-key key('default'): 'd38be3b7aa42fdbfb14c0d25f07bc1875edd5f13f640cd76' # ws secret encrypt 'Hello World!' attribute('message'): = decrypt('YTozOntpOjA7czo3OiJkZWZhdWx0Ijt') command('say-hello'): | #!bash|@ echo @('message') @opdavies

Slide 14

Slide 14 text

Example: building slides from rst2pdf @opdavies

Slide 15

Slide 15 text

Attributes attributes: rst2pdf: command: | = 'rst2pdf ' ~ @('rst2pdf.filename.rst') ~ ' --break-level 1 --stylesheets main --fit-background-mode scale --extension-module preprocess --output ' ~ @('rst2pdf.filename.pdf') filename: pdf: slides.pdf rst: slides.rst thumbnail: filename: thumbnail.png @opdavies

Slide 16

Slide 16 text

Generating PDFs command('pdf generate '): | #!bash|= cd ={ input.argument('talk') } passthru ={ @('rst2pdf.command') } command('pdf watch '): | #!bash|= cd ={ input.argument('talk') } passthru nodemon -e rst,style,txt -x "={ @('rst2pdf.command') }" @opdavies

Slide 17

Slide 17 text

Generating thumbnails command('thumbnail '): env: PDF_FILENAME: = @('rst2pdf.filename.pdf') THUMBNAIL_FILENAME: = @('thumbnail.filename') exec: | #!bash|= cd ={ input.argument('talk') } passthru gs -sDEVICE=png16m -r300 -dDownScaleFactor=4 -sOutputFile=$THUMBNAIL_FILENAME -dLastPage=1 $PDF_FILENAME @opdavies

Slide 18

Slide 18 text

Configuration files @opdavies

Slide 19

Slide 19 text

Using confd 1 attributes: 2 drupal: 3 docroot: web 4 5 command('apply config'): | 6 #!php 7 $ws->confd('workspace:/confd')->apply(); 8 9 confd('workspace:/confd'): 10 - src: 'vhost.conf' 11 dst: 'workspace:/.my127ws/docker/nginx/default.conf' @opdavies

Slide 20

Slide 20 text

vhost.conf.twig The source file. 1 server { 2 server_name _; 3 root /app/{{ @('drupal.docroot' )}}; 4 @opdavies

Slide 21

Slide 21 text

default.conf The generated file. 1 server { 2 server_name _; 3 root /app/web; 4 @opdavies

Slide 22

Slide 22 text

Demo: "Workspacing" my site @opdavies

Slide 23

Slide 23 text

Thanks! References: • https://github.com/my127/workspace • https://oliverdavies.link/workspace-demo • https://oliverdavies.link/workspacing-site Me: • https://www.oliverdavies.uk @opdavies