Skip to content

Commit 1f3f598

Browse files
authored
Merge pull request #2479 from semaphoreui/refactor_server_wrapper
Refactor server wrapper
2 parents d4a2713 + 850efac commit 1f3f598

File tree

3 files changed

+96
-46
lines changed

3 files changed

+96
-46
lines changed

deployment/docker/server/Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ ENV ANSIBLE_VERSION 9.4.0
5353
ARG ANSIBLE_VENV_PATH=/opt/semaphore/apps/ansible/${ANSIBLE_VERSION}/venv
5454

5555
RUN apk add --no-cache -U \
56-
bash curl git gnupg mysql-client openssh-client-default python3 py3-pip rsync sshpass tar tini tzdata unzip wget zip && \
56+
bash curl git gnupg mysql-client openssh-client-default python3 py3-pip rsync sshpass tar tini tzdata unzip wget zip jq && \
5757
rm -rf /var/cache/apk/* && \
5858
adduser -D -u 1001 -G root semaphore && \
5959
mkdir -p /tmp/semaphore && \

deployment/docker/server/server-wrapper

Lines changed: 93 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
set -e
33
echoerr() { printf "%s\n" "$*" >&2; }
44

5+
#
6+
# Read environment variables from file if envrionment variable ${1}_FILE is set
7+
#
58
file_env() {
69
local var=""
710
local fileVar=""
@@ -32,19 +35,15 @@ file_env() {
3235
}
3336

3437
export SEMAPHORE_CONFIG_PATH="${SEMAPHORE_CONFIG_PATH:-/etc/semaphore}"
35-
export SEMAPHORE_TMP_PATH="${SEMAPHORE_TMP_PATH:-/tmp/semaphore}"
36-
export SEMAPHORE_DB_DIALECT="${SEMAPHORE_DB_DIALECT:-mysql}"
37-
export SEMAPHORE_DB_HOST="${SEMAPHORE_DB_HOST:-0.0.0.0}"
3838
export SEMAPHORE_DB_PATH="${SEMAPHORE_DB_PATH:-/var/lib/semaphore}"
3939
export SEMAPHORE_DB_PORT="${SEMAPHORE_DB_PORT:-}"
40-
export SEMAPHORE_DB="${SEMAPHORE_DB:-semaphore}"
4140

42-
file_env 'SEMAPHORE_DB_USER' 'semaphore'
43-
file_env 'SEMAPHORE_DB_PASS' 'semaphore'
44-
file_env 'SEMAPHORE_ADMIN' 'admin'
41+
file_env 'SEMAPHORE_DB_USER'
42+
file_env 'SEMAPHORE_DB_PASS'
43+
file_env 'SEMAPHORE_ADMIN'
4544
export SEMAPHORE_ADMIN_EMAIL="${SEMAPHORE_ADMIN_EMAIL:-admin@localhost}"
4645
export SEMAPHORE_ADMIN_NAME="${SEMAPHORE_ADMIN_NAME:-Semaphore Admin}"
47-
file_env 'SEMAPHORE_ADMIN_PASSWORD' 'semaphorepassword'
46+
file_env 'SEMAPHORE_ADMIN_PASSWORD'
4847
export SEMAPHORE_LDAP_ACTIVATED="${SEMAPHORE_LDAP_ACTIVATED:-no}"
4948
export SEMAPHORE_LDAP_HOST="${SEMAPHORE_LDAP_HOST:-}"
5049
export SEMAPHORE_LDAP_PORT="${SEMAPHORE_LDAP_PORT:-}"
@@ -56,10 +55,6 @@ export SEMAPHORE_LDAP_MAPPING_FULLNAME="${SEMAPHORE_LDAP_MAPPING_FULLNAME:-cn}"
5655
export SEMAPHORE_LDAP_MAPPING_EMAIL="${SEMAPHORE_LDAP_MAPPING_EMAIL:-mail}"
5756
file_env 'SEMAPHORE_ACCESS_KEY_ENCRYPTION'
5857

59-
[ -d "${SEMAPHORE_TMP_PATH}" ] || mkdir -p "${SEMAPHORE_TMP_PATH}" || {
60-
echo "Can't create Semaphore tmp path ${SEMAPHORE_TMP_PATH}."
61-
exit 1
62-
}
6358

6459
[ -d "${SEMAPHORE_CONFIG_PATH}" ] || mkdir -p "${SEMAPHORE_CONFIG_PATH}" || {
6560
echo "Can't create Semaphore config path ${SEMAPHORE_CONFIG_PATH}."
@@ -71,7 +66,27 @@ file_env 'SEMAPHORE_ACCESS_KEY_ENCRYPTION'
7166
exit 1
7267
}
7368

74-
# Check if $SEMAPHORE_DB_HOST contains port number.
69+
70+
#
71+
# Extract database host and port from config.json if they are not set
72+
#
73+
if [ -f "${SEMAPHORE_CONFIG_PATH}/config.json" ]; then
74+
if [ -z "${SEMAPHORE_DB_DIALECT}" ]; then
75+
SEMAPHORE_DB_DIALECT=$(cat "${SEMAPHORE_CONFIG_PATH}/config.json" | jq ".dialect" -r)
76+
fi
77+
78+
if [ -z "${SEMAPHORE_DB_HOST}" ]; then
79+
SEMAPHORE_DB_HOST=$(cat "${SEMAPHORE_CONFIG_PATH}/config.json" | jq ".${SEMAPHORE_DB_DIALECT}.host" -r)
80+
fi
81+
fi
82+
83+
export SEMAPHORE_DB_DIALECT="${SEMAPHORE_DB_DIALECT:-mysql}"
84+
export SEMAPHORE_DB_HOST="${SEMAPHORE_DB_HOST:-0.0.0.0}"
85+
86+
87+
#
88+
# Remove port number from SEMAPHORE_DB_HOST and put it to SEMAPHORE_DB_PORT
89+
#
7590
case "$SEMAPHORE_DB_HOST" in
7691
*:*)
7792
SEMAPHORE_DB_PORT=$(echo "$SEMAPHORE_DB_HOST" | cut -d ':' -f 2)
@@ -80,6 +95,10 @@ case "$SEMAPHORE_DB_HOST" in
8095
*)
8196
esac
8297

98+
99+
#
100+
# Set SEMAPHORE_DB_PORT if it is not set
101+
#
83102
if [ -z "${SEMAPHORE_DB_PORT}" ]; then
84103
case ${SEMAPHORE_DB_DIALECT} in
85104
mysql)
@@ -97,9 +116,12 @@ if [ -z "${SEMAPHORE_DB_PORT}" ]; then
97116
esac
98117
fi
99118

119+
120+
#
100121
# Ping database if it is not BoltDB
122+
#
101123
if [ "${SEMAPHORE_DB_DIALECT}" != 'bolt' ]; then
102-
echoerr "Attempting to connect to database ${SEMAPHORE_DB} on ${SEMAPHORE_DB_HOST}:${SEMAPHORE_DB_PORT} with user ${SEMAPHORE_DB_USER} ..."
124+
echoerr "Pinging database on ${SEMAPHORE_DB_HOST} port ${SEMAPHORE_DB_PORT}..."
103125
TIMEOUT=30
104126

105127

@@ -116,47 +138,64 @@ if [ "${SEMAPHORE_DB_DIALECT}" != 'bolt' ]; then
116138
done
117139
fi
118140

119-
if [ -n "${SEMAPHORE_DB_PORT}" ]; then
120-
SEMAPHORE_DB_HOST="${SEMAPHORE_DB_HOST}:${SEMAPHORE_DB_PORT}"
121-
fi
122141

123-
case ${SEMAPHORE_DB_DIALECT} in
124-
mysql)
125-
SEMAPHORE_DB_DIALECT_ID=1
126-
;;
127-
bolt)
128-
SEMAPHORE_DB_DIALECT_ID=2
129-
SEMAPHORE_DB_HOST=${SEMAPHORE_DB_PATH}/database.boltdb
130-
;;
131-
postgres)
132-
SEMAPHORE_DB_DIALECT_ID=3
133-
;;
134-
*)
135-
echoerr "Unknown database dialect: ${SEMAPHORE_DB_DIALECT}"
142+
#
143+
# Generate new config.json if it does not exist
144+
#
145+
if [ ! -f "${SEMAPHORE_CONFIG_PATH}/config.json" ]; then
146+
echoerr "Generating setup file ${TMP_STDIN_CONFIG_FILE} ..."
147+
148+
TMP_STDIN_CONFIG_FILE=$(mktemp)
149+
150+
151+
SEMAPHORE_TMP_PATH=${SEMAPHORE_TMP_PATH:-/tmp/semaphore}
152+
[ -d "${SEMAPHORE_TMP_PATH}" ] || mkdir -p "${SEMAPHORE_TMP_PATH}" || {
153+
echo "Can't create Semaphore tmp path ${SEMAPHORE_TMP_PATH}."
136154
exit 1
137-
;;
138-
esac
155+
}
139156

140-
if [ ! -f "${SEMAPHORE_CONFIG_PATH}/config.json" ]; then
141-
echoerr "Generating ${SEMAPHORE_TMP_PATH}/config.stdin ..."
142-
cat << EOF > "${SEMAPHORE_TMP_PATH}/config.stdin"
157+
158+
if [ -n "${SEMAPHORE_DB_PORT}" ]; then
159+
SEMAPHORE_DB_HOST="${SEMAPHORE_DB_HOST}:${SEMAPHORE_DB_PORT}"
160+
fi
161+
162+
163+
case ${SEMAPHORE_DB_DIALECT} in
164+
mysql)
165+
SEMAPHORE_DB_DIALECT_ID=1
166+
;;
167+
bolt)
168+
SEMAPHORE_DB_DIALECT_ID=2
169+
SEMAPHORE_DB_HOST=${SEMAPHORE_DB_PATH}/database.boltdb
170+
;;
171+
postgres)
172+
SEMAPHORE_DB_DIALECT_ID=3
173+
;;
174+
*)
175+
echoerr "Unknown database dialect: ${SEMAPHORE_DB_DIALECT}"
176+
exit 1
177+
;;
178+
esac
179+
180+
181+
cat << EOF > "${TMP_STDIN_CONFIG_FILE}"
143182
${SEMAPHORE_DB_DIALECT_ID}
144183
EOF
145184

146185
if [ "${SEMAPHORE_DB_DIALECT}" = "bolt" ]; then
147-
cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin"
186+
cat << EOF >> "${TMP_STDIN_CONFIG_FILE}"
148187
${SEMAPHORE_DB_HOST}
149188
EOF
150189
else
151-
cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin"
190+
cat << EOF >> "${TMP_STDIN_CONFIG_FILE}"
152191
${SEMAPHORE_DB_HOST}:${SEMAPHORE_DB_PORT}
153192
${SEMAPHORE_DB_USER}
154193
${SEMAPHORE_DB_PASS}
155-
${SEMAPHORE_DB}
194+
${SEMAPHORE_DB:-semaphore}
156195
EOF
157196
fi
158197

159-
cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin"
198+
cat << EOF >> "${TMP_STDIN_CONFIG_FILE}"
160199
${SEMAPHORE_TMP_PATH}
161200
${SEMAPHORE_WEB_ROOT:-}
162201
no
@@ -168,7 +207,7 @@ ${SEMAPHORE_LDAP_ACTIVATED}
168207
EOF
169208

170209
if [ "${SEMAPHORE_LDAP_ACTIVATED}" = "yes" ]; then
171-
cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin"
210+
cat << EOF >> "${TMP_STDIN_CONFIG_FILE}"
172211
${SEMAPHORE_LDAP_HOST}:${SEMAPHORE_LDAP_PORT}
173212
${SEMAPHORE_LDAP_NEEDTLS:-no}
174213
${SEMAPHORE_LDAP_DN_BIND}
@@ -182,22 +221,29 @@ ${SEMAPHORE_LDAP_MAPPING_EMAIL}
182221
EOF
183222
fi;
184223

185-
cat << EOF >> "${SEMAPHORE_TMP_PATH}/config.stdin"
224+
cat << EOF >> "${TMP_STDIN_CONFIG_FILE}"
186225
${SEMAPHORE_CONFIG_PATH}
187226
${SEMAPHORE_ADMIN}
188227
${SEMAPHORE_ADMIN_EMAIL}
189228
${SEMAPHORE_ADMIN_NAME}
190229
${SEMAPHORE_ADMIN_PASSWORD}
191230
EOF
192231

232+
193233
echoerr "Executing semaphore setup"
194234
if test "$#" -ne 1; then
195-
/usr/local/bin/semaphore setup - < "${SEMAPHORE_TMP_PATH}/config.stdin"
235+
/usr/local/bin/semaphore setup - < "${TMP_STDIN_CONFIG_FILE}"
196236
else
197-
"$1" setup - < "${SEMAPHORE_TMP_PATH}/config.stdin"
237+
"$1" setup - < "${TMP_STDIN_CONFIG_FILE}"
198238
fi
239+
240+
rm -f "${TMP_STDIN_CONFIG_FILE}"
199241
fi
200242

243+
244+
#
245+
# Install additional python dependencies
246+
#
201247
if test -f "${SEMAPHORE_CONFIG_PATH}/requirements.txt"; then
202248
echoerr "Installing additional python dependencies"
203249
pip3 install --upgrade \
@@ -206,6 +252,10 @@ else
206252
echoerr "No additional python dependencies to install"
207253
fi
208254

255+
256+
#
257+
# Start Semaphore server
258+
#
209259
echoerr "Starting semaphore server"
210260
if test "$#" -ne 1; then
211261
exec /usr/local/bin/semaphore server --config "${SEMAPHORE_CONFIG_PATH}/config.json"

util/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ const (
3636
type DbConfig struct {
3737
Dialect string `json:"-"`
3838

39-
Hostname string `json:"host,omitempty" env:"SEMAPHORE_DB_HOST"`
39+
Hostname string `json:"host,omitempty" env:"SEMAPHORE_DB_HOST" default:"0.0.0.0"`
4040
Username string `json:"user,omitempty" env:"SEMAPHORE_DB_USER"`
4141
Password string `json:"pass,omitempty" env:"SEMAPHORE_DB_PASS"`
42-
DbName string `json:"name,omitempty" env:"SEMAPHORE_DB"`
42+
DbName string `json:"name,omitempty" env:"SEMAPHORE_DB" default:"semaphore"`
4343
Options map[string]string `json:"options,omitempty" env:"SEMAPHORE_DB_OPTIONS"`
4444
}
4545

0 commit comments

Comments
 (0)