With just a command:
# terminal
$ ENV=PROD ./do.sh deploy
I have many projects using my script named DOSH and the parameters are mostly in common; deploy
, start
, stop
, runtests
, etc. It can be a .NET Core or a Django project, or just a website using any static site generator like this one but I run all the projects with the same command: dosh start
.
In Windows, the command may be a bit longer than in the other operating systems. So it’s a good idea to shorten the command using some aliases, the default environment is DEV
:
# ~/.bash_profile
alias dosh="winpty bash do.sh" # or just type "./do.sh" in Linux or MacOS.
# terminal
$ dosh start # in DEV
$ ENV=PROD dosh deploy # in PROD, my deploy parameter works only in production.
Do you use PowerShell? No problem, I think it’s better to do the same thing in PowerShell, you can find the sample codes below, but let me show you how I use that, it’s a bit different than BASH:
# powershell
~\Workspace\website [master ≡]> $env:ENV = "PROD"
~\Workspace\website [master ≡]> dosh deploy
Environment: production
Deploying updates to GitHub...
Building sites …
| EN | TR
+------------------+----+----+
Pages | 13 | 67
Paginator pages | 0 | 0
Non-page files | 0 | 0
Static files | 63 | 63
Processed images | 0 | 0
Aliases | 1 | 12
Sitemaps | 2 | 1
Cleaned | 0 | 0
Total in 748 ms
[master 1686121] rebuilding site 12/30/2018 15:02:32
1 file changed, 3 insertions(+), 3 deletions(-)
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 12 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 628 bytes | 628.00 KiB/s, done.
Total 5 (delta 3), reused 0 (delta 0)
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
To github.com:gkmngrgn/gkmngrgn.github.io.git
733793b..1686121 master -> master
DONE.
Code samples
You can find many sample codes here to write a deployment script and I didn’t think of this idea first but still, I’m sharing my scripts to be an alternative:
./do.sh
#!/usr/bin/env bash
BLUE="\\033[1;34m"
GREEN="\\033[1;32m"
NORMAL="\\033[0;39m"
RED="\\033[1;31m"
print_help() {
echo -e "${BLUE}Available environments${NORMAL}"
echo " - DEV (default)"
echo " - PROD"
echo " - STAGING"
echo ""
echo -e "${BLUE}Available commands${NORMAL}"
echo -e " > deploy [:message] Deploy the changes"
echo -e " > start Run development server"
}
deploy() {
case ${ENV} in
"PROD")
echo -e "${BLUE}Deploying updates to GitHub...${NORMAL}"
;;
*)
echo -e "${RED}This command only works in production.${NORMAL}"
exit
;;
esac
if [ $# -eq 1 ]
then msg="${1}"
else msg="rebuilding site `date`"
fi
hugo
cd public
git add .
git commit -m "${msg}"
git push origin master
cd ..
echo -e "${GREEN}DONE.${NORMAL}"
}
start() {
hugo server -D
}
if [ -z "$1" ]
then
print_help
else
case $ENV in
"PROD")
env_str="production"
;;
"STAGING")
env_str="staging"
;;
*)
env_str="development"
;;
esac
echo -e "${BLUE}Environment:${NORMAL} $env_str"
"$@"
fi
./do.ps1
<# Variables #>
if ($env:ENV -eq "PROD") {
$env_str = "production"
}
elseif ($env:ENV -eq "STAGING") {
$env_str = "staging"
}
else {
if ($env:ENV -ne "DEV") {
$env:ENV = "DEV"
}
$env_str = "development"
}
<# Functions #>
function Get-Help {
Write-Host -ForegroundColor Cyan "Available Environments"
Write-Output " - DEV (default)"
Write-Output " - PROD"
Write-Output " - STAGING"
Write-Output ""
Write-Host -ForegroundColor Cyan "Available commands"
Write-Output " > deploy [:message] Deploy the changes"
Write-Output " > start Run development server"
}
function Start-Deploy ([string] $subParams) {
if ($env:ENV -eq "PROD") {
Write-Host -ForegroundColor Blue "Deploying updates to GitHub..."
}
else {
Write-Host -ForegroundColor Red "This command only works in production."
exit
}
if ($subParams -eq "") {
$msg = "rebuilding site $(Get-Date)"
} else {
$msg = $subParams
}
Invoke-Expression "hugo"
Invoke-Expression "cd public"
Invoke-Expression "git add ."
Invoke-Expression "git commit -m '$msg'"
Invoke-Expression "git push origin master"
Invoke-Expression "cd .."
Write-Host -ForegroundColor Green "DONE."
}
function Start-Server () {
Invoke-Expression "hugo server -D"
}
<# Set default parameter as help. #>
if ($args.Length -eq 0) {
$param = "help"
$subParams = ""
}
else {
$param, $subParams = $args
}
if ($param -ne "help") {
Write-Host -ForegroundColor Cyan -NoNewLine "Environment: "
Write-Output $env_str
}
<# We use switch instead of alias because there are some constant variables like `start`. #>
switch ($param) {
"deploy" { Start-Deploy $subParams }
"start" { Start-Server }
Default { Get-Help }
}
Don’t forget to set the alias in your config file, for example:
# ~\Documents\PowerShell\profile.ps1
$env:ENV = "DEV"
Set-Alias dosh .\do.ps1