fix(ci): geef runtime-env door via -e i.p.v. --env-file
docker run --env-file behoudt letterlijke quotes (bewezen test), waardoor DATABASE_URL ongeldig was en de container crashte. Nu wordt .env gesourced en elke sleutel met -e doorgegeven: exact dezelfde waarden als bij de build. Contract-test verbiedt --env-file.
This commit is contained in:
1 parent
10da44ee56
commit
3fdcf028e8
2 files changed
+26
-3
No files matched your search
@@ -70,7 +70,7 @@ jobs:
|
|||||||
# overslaan is verboden voor productie). .env staat niet in git,
|
# overslaan is verboden voor productie). .env staat niet in git,
|
||||||
# dus kopieer de productie-.env van de host in de build-context.
|
# dus kopieer de productie-.env van de host in de build-context.
|
||||||
# Hij belandt alleen in de wegwerp-builder-stage, niet in de
|
# Hij belandt alleen in de wegwerp-builder-stage, niet in de
|
||||||
# runtime-image (die krijgt env via --env-file bij docker run).
|
# runtime-image (die krijgt env via -e flags bij docker run).
|
||||||
cp /var/www/atom-nexst/.env .env
|
cp /var/www/atom-nexst/.env .env
|
||||||
|
|
||||||
- name: Build image
|
- name: Build image
|
||||||
@@ -85,6 +85,7 @@ jobs:
|
|||||||
-t epicnext-cms:latest .
|
-t epicnext-cms:latest .
|
||||||
|
|
||||||
- name: Deploy container
|
- name: Deploy container
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# Maak poort 3002 vrij: stop zowel de vorige CI-container als de
|
# Maak poort 3002 vrij: stop zowel de vorige CI-container als de
|
||||||
# compose-container (beide draaien op het host-netwerk).
|
# compose-container (beide draaien op het host-netwerk).
|
||||||
@@ -93,13 +94,30 @@ jobs:
|
|||||||
docker stop epicnext-cms 2>/dev/null || true
|
docker stop epicnext-cms 2>/dev/null || true
|
||||||
docker rm epicnext-cms 2>/dev/null || true
|
docker rm epicnext-cms 2>/dev/null || true
|
||||||
|
|
||||||
|
# Geef de productie-env 1-op-1 door. GEEN env-file-flag: `docker run`
|
||||||
|
# behoudt letterlijke quotes uit het bestand (DATABASE_URL="..." →
|
||||||
|
# ongeldige URL en crash), terwijl de shell ze correct stript.
|
||||||
|
# Sourcen + elke sleutel met -e doorgeven geeft de container exact
|
||||||
|
# dezelfde waarden als waarmee de image gebouwd is.
|
||||||
|
set -a
|
||||||
|
# shellcheck disable=SC1091
|
||||||
|
. /var/www/atom-nexst/.env
|
||||||
|
set +a
|
||||||
|
ENV_ARGS=()
|
||||||
|
while IFS='=' read -r key _; do
|
||||||
|
case "$key" in
|
||||||
|
''|'#'*|*[!A-Za-z0-9_]* ) continue ;;
|
||||||
|
esac
|
||||||
|
ENV_ARGS+=(-e "$key")
|
||||||
|
done < /var/www/atom-nexst/.env
|
||||||
|
|
||||||
# Zelfde env + volumes als docker-compose.yml, zodat de CI-container
|
# Zelfde env + volumes als docker-compose.yml, zodat de CI-container
|
||||||
# functioneel gelijk is aan de compose-container die hij vervangt.
|
# functioneel gelijk is aan de compose-container die hij vervangt.
|
||||||
docker run -d \
|
docker run -d \
|
||||||
--name epicnext-cms-app \
|
--name epicnext-cms-app \
|
||||||
--restart always \
|
--restart always \
|
||||||
--net=host \
|
--net=host \
|
||||||
--env-file /var/www/atom-nexst/.env \
|
"${ENV_ARGS[@]}" \
|
||||||
-v /var/www/atom-nexst/public/nitro-assets:/app/public/nitro-assets \
|
-v /var/www/atom-nexst/public/nitro-assets:/app/public/nitro-assets \
|
||||||
-v /var/www/atom-nexst/public/swf:/app/public/swf \
|
-v /var/www/atom-nexst/public/swf:/app/public/swf \
|
||||||
-v /var/www/atom-nexst/storage:/app/storage \
|
-v /var/www/atom-nexst/storage:/app/storage \
|
||||||
|
|||||||
@@ -44,11 +44,16 @@ describe("deploy job", () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("runs container with production env and volumes", () => {
|
it("runs container with production env and volumes", () => {
|
||||||
expect(deployJob).toContain("--env-file /var/www/atom-nexst/.env");
|
expect(deployJob).toContain(". /var/www/atom-nexst/.env");
|
||||||
|
expect(deployJob).toContain('"${ENV_ARGS[@]}"');
|
||||||
expect(deployJob).toContain("/var/www/Gamedata:/var/www/Gamedata");
|
expect(deployJob).toContain("/var/www/Gamedata:/var/www/Gamedata");
|
||||||
expect(deployJob).toContain("/app/storage");
|
expect(deployJob).toContain("/app/storage");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("does not use --env-file (it keeps literal quotes)", () => {
|
||||||
|
expect(deployJob).not.toContain("--env-file");
|
||||||
|
});
|
||||||
|
|
||||||
it("frees port 3002 by stopping the compose container", () => {
|
it("frees port 3002 by stopping the compose container", () => {
|
||||||
expect(deployJob).toContain("docker stop epicnext-cms 2>/dev/null || true");
|
expect(deployJob).toContain("docker stop epicnext-cms 2>/dev/null || true");
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in new issue
Block a user