IML deployment client :: proof of concept :: WIP
This client is a set of bash scripts to deploy a package that was built on th IML CI server.
This project is related to
- CI deployment web gui https://git-repo.iml.unibe.ch/iml-open-source/imldeployment
- CI package server https://git-repo.iml.unibe.ch/iml-open-source/ci-pkg
License
GNU GPL 3.0
Source
URL: https://git-repo.iml.unibe.ch/iml-open-source/imldeployment-client/
Installation
On a server the client must be deployed i.e. in /opt/deployment-client/
Use git clone if you feel familiar with git. Otherwise download the archive and extract it.
Execution plan
If fully configured the deployment script executes the following steps in that fixed sequence:
- loop over profiles ... and per profile ...
- set profile data by sourcing [profile]/config.js
- download Software archive
- detect if download is newer than the last one
- jump into installation dir of your application
- optional: execute pre installation tasks
- optional: run cleanup
- extract software archive
- create config files
- optional: execute post installation tasks
Set up access to package server
This setting is for all projects on the server. It has to be done once.
- in ./bin directory copy getfile.sh.cfg.dist to getfile.sh.cfg
- edit getfile.sh.cfg and define software endpoint and set the phase:
IMLCI_URL=https://software.example.com
IMLCI_PKG_SECRET=put-secret-here
IMLCI_PHASE=preview
Set up software rollout
Create a profile
- Create a subdirectory in ./profiles/ for each rollout
- The example subdir gives an orientation and can be copied, i.e.
cp -r example myapp
- create a config file named
./profiles/myapp/config.sh
(copy the config.sh.dist from example profile)
# my install dir
installdir=/var/www/myapp
# fileowner
# appowner="user:www-data"
# ----- settings for CI server software package
IMLCI_PROJECT=id-in-ci-server
# override global value
# IMLCI_PHASE=preview
# cleanup after pre install tasks and bevore extracting data
# set both to 0 .. or only one of them to 1
cleanup_preview=0
cleanup_force=0
Config variables:
name | type | description |
---|---|---|
installdir | string | target directory of your application |
appowner | string | if not empty a chown -R will be applied in target directory by chwon -R ${appowner} ${installdir} ; appowner is the parameter behind -R. It is something like "myuser." or "myuser:mygroup". For a web application it should be the user of your webservice (www-data/ apache/ nginx). The command chown requires to run the deploy script as root. |
IMLCI_PROJECT | string | Project id in IML CI server |
IMLCI_PHASE | string | optional: override the global IMLCI_PHASE in ./bin/getfile.sh.cfg; it is one of preview|stage|live |
cleanup_preview | 0 or 1 | Cleanup preview - shows diff between downloaded TGZ and ${installdir}. |
cleanup_force | 0 or 1 | Run cleanup: it deletes all files in target directory that aren't in the last downloaded tgz. To keep runtime data like logs or uploads you can add a file .keep in the directory. |
Make a testrun: ./deploy_app.sh
in application root.
It should download the software package and extract it and install it into you ${installdir}
.
Add hooks
If needed you can create hook scripts. The working directory is ${installdir}
that you can use relative pathes to point to your files in the the extracted sources.
To access other ressources you can user these variables:
${selfdir} application root of deployment scripts
${projectdir} project config dir i.e. [path]/profiles/myapp
For hooks you can create files with pre defined names. A hook script must have executable rights. You get a hint message if it does not exist or has no x permission. A missing hook script does not result in an error.
- profiles/myapp/tasks_preinstall.sh - do something before extracting the archive.
- profiles/myapp/tasks_config.sh - replace config files (see below)
- profiles/myapp/tasks_postinstall.sh - do postinstall actions before finishing
Create configs
The script ./bin/create_config.sh
can read config templates and create an output file.
You need to reference the template, output file and a file for replacement data.
# ----------------------------------------------------------------------
# TASKS :: GENERATE CONFIGS
# ----------------------------------------------------------------------
# create_config.sh template_file target_file replacements (can be multiple files)
# | | | |
# v v v v
"${selfdir}/bin/create_config.sh" hooks/templates/mytemplate.erb config/target.php ${projectdir}/replace.txt
Pre and post install actions
Example: A simple tasks_postinstall.sh can contain the start of a script that is delivered in the tgz archive.
# ----------------------------------------------------------------------
# TASKS :: POST INSTALL ACTIONS
# ----------------------------------------------------------------------
hooks/ondeploy
Scripts
deploy_app.sh
This is the main deployment script.
./deploy_app.sh [PROFILENAME]
If you start it without parameter it will loop over all existing profiles. You can add an existing profile name to limit the execution to that profile only.