mirror of
https://gitlab.com/psuapp/psu.git
synced 2024-08-30 18:12:34 +00:00
Merge pull request #8 from tortuetorche/patch-1
Add custom stack environment variables
This commit is contained in:
commit
d90eb42ab5
@ -10,6 +10,7 @@ ENV LANG="en_US.UTF-8" \
|
|||||||
PORTAINER_URL="" \
|
PORTAINER_URL="" \
|
||||||
PORTAINER_STACK_NAME="" \
|
PORTAINER_STACK_NAME="" \
|
||||||
DOCKER_COMPOSE_FILE="" \
|
DOCKER_COMPOSE_FILE="" \
|
||||||
|
ENVIRONMENT_VARIABLES_FILE="" \
|
||||||
PORTAINER_PRUNE="false" \
|
PORTAINER_PRUNE="false" \
|
||||||
PORTAINER_ENDPOINT="1" \
|
PORTAINER_ENDPOINT="1" \
|
||||||
HTTPIE_VERIFY_SSL="yes" \
|
HTTPIE_VERIFY_SSL="yes" \
|
||||||
|
18
README.md
18
README.md
@ -44,6 +44,7 @@ This is particularly useful for CI/CD pipelines.
|
|||||||
- `PORTAINER_URL` (string, required): URL to Portainer
|
- `PORTAINER_URL` (string, required): URL to Portainer
|
||||||
- `PORTAINER_STACK_NAME` (string, required): Stack name
|
- `PORTAINER_STACK_NAME` (string, required): Stack name
|
||||||
- `DOCKER_COMPOSE_FILE` (string, required if action=deploy): Path to doker-compose file
|
- `DOCKER_COMPOSE_FILE` (string, required if action=deploy): Path to doker-compose file
|
||||||
|
- `ENVIRONMENT_VARIABLES_FILE` (string, optional, only used when action=deploy or action=update): Path to file with environment variables to be used by the stack. See [stack environment variables](#stack-environment-variables) below.
|
||||||
- `PORTAINER_PRUNE` ("true" or "false", optional): Whether to prune unused containers or not. Defaults to `"false"`.
|
- `PORTAINER_PRUNE` ("true" or "false", optional): Whether to prune unused containers or not. Defaults to `"false"`.
|
||||||
- `PORTAINER_ENDPOINT` (int, optional): Which endpoint to use. Defaults to `1`.
|
- `PORTAINER_ENDPOINT` (int, optional): Which endpoint to use. Defaults to `1`.
|
||||||
- `HTTPIE_VERIFY_SSL` ("yes" or "no", optional): Whether to verify SSL certificate or not. Defaults to `"yes"`.
|
- `HTTPIE_VERIFY_SSL` ("yes" or "no", optional): Whether to verify SSL certificate or not. Defaults to `"yes"`.
|
||||||
@ -60,6 +61,7 @@ export PORTAINER_PASSWORD="password"
|
|||||||
export PORTAINER_URL="http://portainer.local"
|
export PORTAINER_URL="http://portainer.local"
|
||||||
export PORTAINER_STACK_NAME="mystack"
|
export PORTAINER_STACK_NAME="mystack"
|
||||||
export DOCKER_COMPOSE_FILE="/path/to/docker-compose.yml"
|
export DOCKER_COMPOSE_FILE="/path/to/docker-compose.yml"
|
||||||
|
export ENVIRONMENT_VARIABLES_FILE="/path/to/env_vars_file"
|
||||||
|
|
||||||
./psu
|
./psu
|
||||||
```
|
```
|
||||||
@ -84,6 +86,7 @@ This is more suitable for standalone script usage.
|
|||||||
- `-l` (string, required): URL to Portainer
|
- `-l` (string, required): URL to Portainer
|
||||||
- `-n` (string, required): Stack name
|
- `-n` (string, required): Stack name
|
||||||
- `-c` (string, required if action=deploy): Path to doker-compose file
|
- `-c` (string, required if action=deploy): Path to doker-compose file
|
||||||
|
- `-g` (string, optional, only used when action=deploy or action=update): Path to file with environment variables to be used by the stack. See [stack environment variables](#stack-environment-variables) below.
|
||||||
- `-r` ("true" or "false", optional): Whether to prune unused containers or not. Defaults to `"false"`.
|
- `-r` ("true" or "false", optional): Whether to prune unused containers or not. Defaults to `"false"`.
|
||||||
- `-e` (int, optional): Which endpoint to use. Defaults to `1`.
|
- `-e` (int, optional): Which endpoint to use. Defaults to `1`.
|
||||||
- `-s` ("yes" or "no", optional): Whether to verify SSL certificate or not. Defaults to `"yes"`.
|
- `-s` ("yes" or "no", optional): Whether to verify SSL certificate or not. Defaults to `"yes"`.
|
||||||
@ -94,13 +97,26 @@ This is more suitable for standalone script usage.
|
|||||||
#### Examples
|
#### Examples
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./psu -a deploy -u admin -p password -l http://portainer.local -n mystack -c /path/to/docker-compose.yml
|
./psu -a deploy -u admin -p password -l http://portainer.local -n mystack -c /path/to/docker-compose.yml -g /path/to/env_vars_file
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
./psu -a undeploy -u admin -p password -l http://portainer.local -n mystack
|
./psu -a undeploy -u admin -p password -l http://portainer.local -n mystack
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Stack environment variables
|
||||||
|
|
||||||
|
There can be set environment variables for each stack, be it a new deployment or an update. For example:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
touch .env
|
||||||
|
echo "MYSQL_ROOT_PASSWORD=agoodpassword" >> .env
|
||||||
|
echo "ALLOWED_HOSTS=*" >> .env
|
||||||
|
./psu -a deploy -u admin -p password -l http://portainer.local -n django-stack -c /path/to/docker-compose.yml -g env_vars
|
||||||
|
```
|
||||||
|
|
||||||
|
Stack environment variables can be enabled through [ENVIRONMENT_VARIABLES_FILE envvar](#with-envvars) or [-g flag](#with-flags).
|
||||||
|
|
||||||
### Verbose mode
|
### Verbose mode
|
||||||
|
|
||||||
In verbose mode the script prints execution steps.
|
In verbose mode the script prints execution steps.
|
||||||
|
51
psu
51
psu
@ -66,7 +66,7 @@ main() {
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
##########################
|
################################
|
||||||
# Set globals #
|
# Set globals #
|
||||||
# Globals: #
|
# Globals: #
|
||||||
# ACTION #
|
# ACTION #
|
||||||
@ -75,6 +75,7 @@ main() {
|
|||||||
# PORTAINER_URL #
|
# PORTAINER_URL #
|
||||||
# PORTAINER_STACK_NAME #
|
# PORTAINER_STACK_NAME #
|
||||||
# DOCKER_COMPOSE_FILE #
|
# DOCKER_COMPOSE_FILE #
|
||||||
|
# ENVIRONMENT_VARIABLES_FILE #
|
||||||
# PORTAINER_ENDPOINT #
|
# PORTAINER_ENDPOINT #
|
||||||
# PORTAINER_PRUNE #
|
# PORTAINER_PRUNE #
|
||||||
# HTTPIE_VERIFY_SSL #
|
# HTTPIE_VERIFY_SSL #
|
||||||
@ -85,7 +86,7 @@ main() {
|
|||||||
# None #
|
# None #
|
||||||
# Returns: #
|
# Returns: #
|
||||||
# None #
|
# None #
|
||||||
##########################
|
################################
|
||||||
set_globals() {
|
set_globals() {
|
||||||
# Set arguments through envvars
|
# Set arguments through envvars
|
||||||
ACTION=${ACTION}
|
ACTION=${ACTION}
|
||||||
@ -94,6 +95,7 @@ set_globals() {
|
|||||||
PORTAINER_URL=${PORTAINER_URL}
|
PORTAINER_URL=${PORTAINER_URL}
|
||||||
PORTAINER_STACK_NAME=${PORTAINER_STACK_NAME}
|
PORTAINER_STACK_NAME=${PORTAINER_STACK_NAME}
|
||||||
DOCKER_COMPOSE_FILE=${DOCKER_COMPOSE_FILE}
|
DOCKER_COMPOSE_FILE=${DOCKER_COMPOSE_FILE}
|
||||||
|
ENVIRONMENT_VARIABLES_FILE=${ENVIRONMENT_VARIABLES_FILE}
|
||||||
PORTAINER_ENDPOINT=${PORTAINER_ENDPOINT:-"1"}
|
PORTAINER_ENDPOINT=${PORTAINER_ENDPOINT:-"1"}
|
||||||
PORTAINER_PRUNE=${PORTAINER_PRUNE:-"false"}
|
PORTAINER_PRUNE=${PORTAINER_PRUNE:-"false"}
|
||||||
HTTPIE_VERIFY_SSL=${HTTPIE_VERIFY_SSL:-"yes"}
|
HTTPIE_VERIFY_SSL=${HTTPIE_VERIFY_SSL:-"yes"}
|
||||||
@ -102,7 +104,7 @@ set_globals() {
|
|||||||
STRICT_MODE=${STRICT_MODE:-"false"}
|
STRICT_MODE=${STRICT_MODE:-"false"}
|
||||||
|
|
||||||
# Set arguments through flags (overwrite envvars)
|
# Set arguments through flags (overwrite envvars)
|
||||||
while getopts a:u:p:l:n:c:e:rsvdt option; do
|
while getopts a:u:p:l:n:c:e:g:rsvdt option; do
|
||||||
case "${option}" in
|
case "${option}" in
|
||||||
a) ACTION=${OPTARG} ;;
|
a) ACTION=${OPTARG} ;;
|
||||||
u) PORTAINER_USER=${OPTARG} ;;
|
u) PORTAINER_USER=${OPTARG} ;;
|
||||||
@ -111,6 +113,7 @@ set_globals() {
|
|||||||
n) PORTAINER_STACK_NAME=${OPTARG} ;;
|
n) PORTAINER_STACK_NAME=${OPTARG} ;;
|
||||||
c) DOCKER_COMPOSE_FILE=${OPTARG} ;;
|
c) DOCKER_COMPOSE_FILE=${OPTARG} ;;
|
||||||
e) PORTAINER_ENDPOINT=${OPTARG} ;;
|
e) PORTAINER_ENDPOINT=${OPTARG} ;;
|
||||||
|
g) ENVIRONMENT_VARIABLES_FILE=${OPTARG} ;;
|
||||||
r) PORTAINER_PRUNE="true" ;;
|
r) PORTAINER_PRUNE="true" ;;
|
||||||
s) HTTPIE_VERIFY_SSL="no" ;;
|
s) HTTPIE_VERIFY_SSL="no" ;;
|
||||||
v) VERBOSE_MODE="true" ;;
|
v) VERBOSE_MODE="true" ;;
|
||||||
@ -130,6 +133,7 @@ set_globals() {
|
|||||||
echo_debug "PORTAINER_URL -> $PORTAINER_URL"
|
echo_debug "PORTAINER_URL -> $PORTAINER_URL"
|
||||||
echo_debug "PORTAINER_STACK_NAME -> $PORTAINER_STACK_NAME"
|
echo_debug "PORTAINER_STACK_NAME -> $PORTAINER_STACK_NAME"
|
||||||
echo_debug "DOCKER_COMPOSE_FILE -> $DOCKER_COMPOSE_FILE"
|
echo_debug "DOCKER_COMPOSE_FILE -> $DOCKER_COMPOSE_FILE"
|
||||||
|
echo_debug "ENVIRONMENT_VARIABLES_FILE -> $ENVIRONMENT_VARIABLES_FILE"
|
||||||
echo_debug "PORTAINER_ENDPOINT -> $PORTAINER_ENDPOINT"
|
echo_debug "PORTAINER_ENDPOINT -> $PORTAINER_ENDPOINT"
|
||||||
echo_debug "PORTAINER_PRUNE -> $PORTAINER_PRUNE"
|
echo_debug "PORTAINER_PRUNE -> $PORTAINER_PRUNE"
|
||||||
echo_debug "HTTPIE_VERIFY_SSL -> $HTTPIE_VERIFY_SSL"
|
echo_debug "HTTPIE_VERIFY_SSL -> $HTTPIE_VERIFY_SSL"
|
||||||
@ -145,6 +149,10 @@ set_globals() {
|
|||||||
check_argument "$PORTAINER_STACK_NAME" "portainer stack name" "PORTAINER_STACK_NAME" "n"
|
check_argument "$PORTAINER_STACK_NAME" "portainer stack name" "PORTAINER_STACK_NAME" "n"
|
||||||
if [ $ACTION == "deploy" ]; then
|
if [ $ACTION == "deploy" ]; then
|
||||||
check_argument "$DOCKER_COMPOSE_FILE" "docker compose file" "DOCKER_COMPOSE_FILE" "c"
|
check_argument "$DOCKER_COMPOSE_FILE" "docker compose file" "DOCKER_COMPOSE_FILE" "c"
|
||||||
|
if [ -n "$ENVIRONMENT_VARIABLES_FILE" ] && [[ ! -f "$ENVIRONMENT_VARIABLES_FILE" ]]; then
|
||||||
|
echo_error "Error: File path \"$ENVIRONMENT_VARIABLES_FILE\" not found for \"ENVIRONMENT_VARIABLES_FILE\" environment variable or the \"-g\" flag."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -254,13 +262,14 @@ echo_debug() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
##########################
|
################################
|
||||||
# Create/update a stack #
|
# Create/update a stack #
|
||||||
# Globals: #
|
# Globals: #
|
||||||
# STACK #
|
# STACK #
|
||||||
# DOCKER_COMPOSE_FILE #
|
# DOCKER_COMPOSE_FILE #
|
||||||
# PORTAINER_STACK_NAME #
|
# PORTAINER_STACK_NAME #
|
||||||
# PORTAINER_URL #
|
# PORTAINER_URL #
|
||||||
|
# ENVIRONMENT_VARIABLES_FILE #
|
||||||
# HTTPIE_VERIFY_SSL #
|
# HTTPIE_VERIFY_SSL #
|
||||||
# PORTAINER_ENDPOINT #
|
# PORTAINER_ENDPOINT #
|
||||||
# AUTH_TOKEN #
|
# AUTH_TOKEN #
|
||||||
@ -268,7 +277,7 @@ echo_debug() {
|
|||||||
# None #
|
# None #
|
||||||
# Returns: #
|
# Returns: #
|
||||||
# None #
|
# None #
|
||||||
##########################
|
################################
|
||||||
deploy() {
|
deploy() {
|
||||||
# Read docker-compose file content
|
# Read docker-compose file content
|
||||||
local docker_compose_file_content
|
local docker_compose_file_content
|
||||||
@ -310,8 +319,13 @@ deploy() {
|
|||||||
echo_verbose "Swarm cluster not found."
|
echo_verbose "Swarm cluster not found."
|
||||||
|
|
||||||
echo_verbose "Preparing stack JSON..."
|
echo_verbose "Preparing stack JSON..."
|
||||||
|
local stack_envvars
|
||||||
|
stack_envvars="[]"
|
||||||
|
if [ -n "$ENVIRONMENT_VARIABLES_FILE" ]; then
|
||||||
|
stack_envvars=$(env_file_to_json)
|
||||||
|
fi
|
||||||
local data_prefix="{\"Name\":\"$PORTAINER_STACK_NAME\",\"StackFileContent\":\""
|
local data_prefix="{\"Name\":\"$PORTAINER_STACK_NAME\",\"StackFileContent\":\""
|
||||||
local data_suffix="\"}"
|
local data_suffix="\",\"Env\":"$stack_envvars"}"
|
||||||
echo "$data_prefix$docker_compose_file_content$data_suffix" > json.tmp
|
echo "$data_prefix$docker_compose_file_content$data_suffix" > json.tmp
|
||||||
echo_debug "Stack JSON -> $(echo $data_prefix$docker_compose_file_content$data_suffix | jq -C .)"
|
echo_debug "Stack JSON -> $(echo $data_prefix$docker_compose_file_content$data_suffix | jq -C .)"
|
||||||
|
|
||||||
@ -335,8 +349,13 @@ deploy() {
|
|||||||
echo_verbose "Swarm cluster found."
|
echo_verbose "Swarm cluster found."
|
||||||
|
|
||||||
echo_verbose "Preparing stack JSON..."
|
echo_verbose "Preparing stack JSON..."
|
||||||
|
local stack_envvars
|
||||||
|
stack_envvars="[]"
|
||||||
|
if [ -n "$ENVIRONMENT_VARIABLES_FILE" ]; then
|
||||||
|
stack_envvars=$(env_file_to_json)
|
||||||
|
fi
|
||||||
local data_prefix="{\"Name\":\"$PORTAINER_STACK_NAME\",\"SwarmID\":\"$swarm_id\",\"StackFileContent\":\""
|
local data_prefix="{\"Name\":\"$PORTAINER_STACK_NAME\",\"SwarmID\":\"$swarm_id\",\"StackFileContent\":\""
|
||||||
local data_suffix="\"}"
|
local data_suffix="\",\"Env\":"$stack_envvars"}"
|
||||||
echo "$data_prefix$docker_compose_file_content$data_suffix" > json.tmp
|
echo "$data_prefix$docker_compose_file_content$data_suffix" > json.tmp
|
||||||
echo_debug "Stack JSON -> $(echo $data_prefix$docker_compose_file_content$data_suffix | jq -C .)"
|
echo_debug "Stack JSON -> $(echo $data_prefix$docker_compose_file_content$data_suffix | jq -C .)"
|
||||||
|
|
||||||
@ -371,6 +390,11 @@ deploy() {
|
|||||||
stack_id="$(echo "$STACK" | jq -j ".Id")"
|
stack_id="$(echo "$STACK" | jq -j ".Id")"
|
||||||
local stack_envvars
|
local stack_envvars
|
||||||
stack_envvars="$(echo -n "$STACK" | jq ".Env" -jc)"
|
stack_envvars="$(echo -n "$STACK" | jq ".Env" -jc)"
|
||||||
|
if [ -n "$ENVIRONMENT_VARIABLES_FILE" ]; then
|
||||||
|
local new_stack_envvars
|
||||||
|
new_stack_envvars=$(env_file_to_json)
|
||||||
|
stack_envvars="$(echo -n "${new_stack_envvars}${stack_envvars}" | jq -sjc 'add | unique_by(.name)')"
|
||||||
|
fi
|
||||||
local data_prefix="{\"Id\":\"$stack_id\",\"StackFileContent\":\""
|
local data_prefix="{\"Id\":\"$stack_id\",\"StackFileContent\":\""
|
||||||
local data_suffix="\",\"Env\":"$stack_envvars",\"Prune\":$PORTAINER_PRUNE}"
|
local data_suffix="\",\"Env\":"$stack_envvars",\"Prune\":$PORTAINER_PRUNE}"
|
||||||
echo "$data_prefix$docker_compose_file_content$data_suffix" > json.tmp
|
echo "$data_prefix$docker_compose_file_content$data_suffix" > json.tmp
|
||||||
@ -436,4 +460,17 @@ undeploy() {
|
|||||||
echo_debug "Delete action response -> $(echo $delete | jq -C .)"
|
echo_debug "Delete action response -> $(echo $delete | jq -C .)"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
###################################################
|
||||||
|
# Convert environment variables from file to JSON #
|
||||||
|
# Globals: #
|
||||||
|
# ENVIRONMENT_VARIABLES_FILE #
|
||||||
|
# Arguments: #
|
||||||
|
# None #
|
||||||
|
# Returns: #
|
||||||
|
# JSON string #
|
||||||
|
###################################################
|
||||||
|
env_file_to_json() {
|
||||||
|
echo "$(env -i $(cat $ENVIRONMENT_VARIABLES_FILE) jq -n 'env | to_entries | map({name: .key, value: .value})')"
|
||||||
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
Loading…
Reference in New Issue
Block a user