Skip to content
This repository was archived by the owner on Aug 1, 2024. It is now read-only.

Commit 4f21c4d

Browse files
authored
fix: Error out of provisioning when any part errors (fix silent CI fail) (#767)
CI tests were silently failing during provisioning since the provisioning scripts did not set the `-e` option in bash. This commit changes the scripts to include the recommended `set -eu -o pipefail` stanza as well as include a more conservative `-e` on any docker-exec bash calls. In places where existing errors were uncovered, I suppressed errors just for the offending code with a `+e`/`-e` pair and left a comment starting with `# FIXME[bash-e]`. Owning teams can prioritize and fix these at their own pace. This may cause some false positive errors (there are commands which use a non-zero exit code to signal things other than an error) but they should be individually reverted or fixed as they are discovered. Also: - Extract ANSI color code variables to a shared file and use them. Most of the provisioning scripts tried to use the color codes, but they weren't defined. I discovered this when I tried to add `set -eu` to the scripts. - Remove the `set -e` from the CI Github Action, since it is almost certainly a no-op. - Add `set -x` to all provisioning scripts for easier debugging (some already had it) - Ensure provisioning scripts have bash shebang - Tweak function in `programs/provision.sh` to accept variable list of arguments (and stop defaulting one of the args)
1 parent 774e406 commit 4f21c4d

23 files changed

+155
-92
lines changed

.github/workflows/ci.yml

-3
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,6 @@ jobs:
5353
- name: pull
5454
run: make dev.pull.${{matrix.services}}
5555

56-
- name: set exit option
57-
run: set -e
58-
5956
- name: provision
6057
run: make dev.provision.${{matrix.services}}
6158

check.sh

+1-3
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,7 @@
1616
# Note that passing in a non-existent service will not fail if there are
1717
# other successful checks.
1818

19-
set -e
20-
set -o pipefail
21-
set -u
19+
set -eu -o pipefail
2220

2321
# Grab all arguments into one string, replacing plus signs with spaces.
2422
# Pad on either side with spaces so that the regex in `should_check` works correctly.

destroy.sh

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#!/usr/bin/env bash
2-
3-
set -e
2+
set -eu -o pipefail
43

54
read -p "This will delete all data in your devstack. Would you like to proceed? [y/n] " -r
65
if [[ $REPLY =~ ^[Yy]$ ]]

enterprise/provision.sh

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,6 @@
1-
docker-compose exec -T lms bash -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker manage_user enterprise_worker [email protected] --staff'
2-
cat enterprise/worker_permissions.py | docker-compose exec -T lms bash -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms shell --settings=devstack_docker'
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
set -x
4+
5+
docker-compose exec -T lms bash -e -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker manage_user enterprise_worker [email protected] --staff'
6+
cat enterprise/worker_permissions.py | docker-compose exec -T lms bash -e -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms shell --settings=devstack_docker'

load-db.sh

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,7 @@
77
#
88
# This will load the edxapp database from a file named exapp.sql.
99

10-
set -e
11-
set -o pipefail
10+
set -eu -o pipefail
1211

1312
if [ -z "$1" ]
1413
then

programs/provision.sh

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
#!/bin/sh
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
set -x
24

3-
set -e
45
#
56
# To add programs support, we need to tweak/add certain rows in the database.
67
# We want to go through Django for this (rather than direct db modification), since we have a lot of Python
@@ -44,19 +45,20 @@ docker_exec() {
4445
/edx/app/$app/$repo/manage.py $cmd
4546
"
4647

47-
docker-compose exec -T "$service" bash -c "$CMDS"
48+
docker-compose exec -T "$service" bash -e -c "$CMDS"
4849
}
4950

5051
provision_ida() {
51-
service=${1}
52-
cmd=${2:-"shell"}
52+
service=$1
53+
cmd=$2
54+
shift 2
5355

5456
# Escape double quotes and backticks from the Python
5557
PROGRAM_SCRIPT="$(sed -E 's/("|`)/\\\1/g' < "$BASEDIR/$service.py")"
5658

5759
cmd="$cmd -c \"$PROGRAM_SCRIPT\""
5860

59-
docker_exec "$service" "$cmd" "$3" "$4"
61+
docker_exec "$service" "$cmd" "$@"
6062
}
6163

6264
trap reset_color 1 2 3 6 15
@@ -68,7 +70,10 @@ fi
6870

6971
if [ "$1" = "discovery" -o -z "$1" ]; then
7072
notice Adding demo program to Discovery...
71-
provision_ida discovery
73+
set +e
74+
# FIXME[bash-e]: Bash scripts should use -e -- but this command fails
75+
provision_ida discovery "shell"
76+
set -e
7277
fi
7378

7479
if [ "$1" = "cache" -o -z "$1" ]; then

provision-credentials.sh

+17-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
4+
. scripts/colors.sh
5+
set -x
26

37
# NOTE (CCB): We do NOT call provision-ida because it expects a virtualenv.
48
# The new images for Credentials do not use virtualenv.
@@ -9,20 +13,28 @@ port=18150
913
docker-compose up -d $name
1014

1115
echo -e "${GREEN}Installing requirements for ${name}...${NC}"
12-
docker-compose exec -T ${name} bash -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && make requirements' -- "$name"
16+
docker-compose exec -T ${name} bash -e -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && make requirements' -- "$name"
1317

1418
echo -e "${GREEN}Running migrations for ${name}...${NC}"
15-
docker-compose exec -T ${name} bash -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && make migrate' -- "$name"
19+
docker-compose exec -T ${name} bash -e -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && make migrate' -- "$name"
1620

21+
set +e
22+
# FIXME[bash-e]: Bash scripts should use -e -- but this script fails
23+
# with missing manage.py (need another "credentials" in that cd path?)
1724
echo -e "${GREEN}Creating super-user for ${name}...${NC}"
18-
docker-compose exec -T ${name} bash -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser(\"edx\", \"[email protected]\", \"edx\") if not User.objects.filter(username=\"edx\").exists() else None" | python /edx/app/$1/$1/manage.py shell' -- "$name"
25+
docker-compose exec -T ${name} bash -e -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser(\"edx\", \"[email protected]\", \"edx\") if not User.objects.filter(username=\"edx\").exists() else None" | python /edx/app/$1/$1/manage.py shell' -- "$name"
26+
set -e
1927

28+
set +e
29+
# FIXME[bash-e]: Bash scripts should use -e -- but this script fails
30+
# with missing manage.py (need another "credentials" in that cd path?)
2031
echo -e "${GREEN}Configuring site for ${name}...${NC}"
21-
docker-compose exec -T ${name} bash -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/ && ./manage.py create_or_update_site --site-id=1 --site-domain=localhost:18150 --site-name="Open edX" --platform-name="Open edX" --company-name="Open edX" --lms-url-root=http://localhost:18000 --catalog-api-url=http://edx.devstack.discovery:18381/api/v1/ --tos-url=http://localhost:18000/tos --privacy-policy-url=http://localhost:18000/privacy --homepage-url=http://localhost:18000 --certificate-help-url=http://localhost:18000/faq --records-help-url=http://localhost:18000/faq --theme-name=openedx'
32+
docker-compose exec -T ${name} bash -e -c 'source /edx/app/credentials/credentials_env && cd /edx/app/credentials/ && ./manage.py create_or_update_site --site-id=1 --site-domain=localhost:18150 --site-name="Open edX" --platform-name="Open edX" --company-name="Open edX" --lms-url-root=http://localhost:18000 --catalog-api-url=http://edx.devstack.discovery:18381/api/v1/ --tos-url=http://localhost:18000/tos --privacy-policy-url=http://localhost:18000/privacy --homepage-url=http://localhost:18000 --certificate-help-url=http://localhost:18000/faq --records-help-url=http://localhost:18000/faq --theme-name=openedx'
33+
set -e
2234

2335
./provision-ida-user.sh ${name} ${name} ${port}
2436

2537
# Compile static assets last since they are absolutely necessary for all services. This will allow developers to get
2638
# started if they do not care about static assets
2739
echo -e "${GREEN}Compiling static assets for ${name}...${NC}"
28-
docker-compose exec -T ${name} bash -c ' if ! source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && make static 2>creds_make_static.err; then echo "------- Last 100 lines of stderr"; tail creds_make_static.err -n 100; echo "-------"; fi;' -- "$name"
40+
docker-compose exec -T ${name} bash -e -c ' if ! source /edx/app/credentials/credentials_env && cd /edx/app/credentials/credentials && make static 2>creds_make_static.err; then echo "------- Last 100 lines of stderr"; tail creds_make_static.err -n 100; echo "-------"; fi;' -- "$name"

provision-discovery.sh

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,20 @@
1+
#!/usr/bin/env bash
12
# Provisioning script for the discovery service
3+
set -eu -o pipefail
4+
set -x
5+
26
./provision-ida.sh discovery discovery 18381
37

4-
docker-compose exec -T discovery bash -c 'rm -rf /edx/var/discovery/*'
5-
docker-compose exec -T discovery bash -c 'source /edx/app/discovery/discovery_env && python /edx/app/discovery/discovery/manage.py create_or_update_partner --site-id 1 --site-domain localhost:18381 --code edx --name edX --courses-api-url "http://edx.devstack.lms:18000/api/courses/v1/" --lms-coursemode-api-url "http://edx.devstack.lms:18000/api/course_modes/v1/" --ecommerce-api-url "http://edx.devstack.ecommerce:18130/api/v2/" --organizations-api-url "http://edx.devstack.lms:18000/api/organizations/v0/" --lms-url "http://edx.devstack.lms:18000/" --studio-url "http://edx.devstack.studio:18010/" --publisher-url "http://edx.devstack.frontend-app-publisher:18400/"'
6-
docker-compose exec -T discovery bash -c 'source /edx/app/discovery/discovery_env && python /edx/app/discovery/discovery/manage.py refresh_course_metadata'
7-
docker-compose exec -T discovery bash -c 'source /edx/app/discovery/discovery_env && python /edx/app/discovery/discovery/manage.py update_index --disable-change-limit'
8+
docker-compose exec -T discovery bash -e -c 'rm -rf /edx/var/discovery/*'
9+
docker-compose exec -T discovery bash -e -c 'source /edx/app/discovery/discovery_env && python /edx/app/discovery/discovery/manage.py create_or_update_partner --site-id 1 --site-domain localhost:18381 --code edx --name edX --courses-api-url "http://edx.devstack.lms:18000/api/courses/v1/" --lms-coursemode-api-url "http://edx.devstack.lms:18000/api/course_modes/v1/" --ecommerce-api-url "http://edx.devstack.ecommerce:18130/api/v2/" --organizations-api-url "http://edx.devstack.lms:18000/api/organizations/v0/" --lms-url "http://edx.devstack.lms:18000/" --studio-url "http://edx.devstack.studio:18010/" --publisher-url "http://edx.devstack.frontend-app-publisher:18400/"'
10+
11+
set +e
12+
# FIXME[bash-e]: Bash scripts should use -e -- but this script fails
13+
# (after many retries) when trying to talk to ecommerce
14+
docker-compose exec -T discovery bash -e -c 'source /edx/app/discovery/discovery_env && python /edx/app/discovery/discovery/manage.py refresh_course_metadata'
15+
set -e
16+
17+
docker-compose exec -T discovery bash -e -c 'source /edx/app/discovery/discovery_env && python /edx/app/discovery/discovery/manage.py update_index --disable-change-limit'
818

919
# Add demo program
1020
./programs/provision.sh discovery

provision-e2e.sh

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
set -e
2-
set -o pipefail
1+
#!/usr/bin/env bash
2+
3+
set -eu -o pipefail
34
set -x
45

56
if [ -z "$DEVSTACK_WORKSPACE" ]; then
@@ -13,11 +14,11 @@ fi
1314
docker cp ${DEVSTACK_WORKSPACE}/edx-e2e-tests/upload_files/course.tar.gz "$(make --silent --no-print-directory dev.print-container.studio)":/tmp/
1415

1516
# Extract the test course tarball
16-
docker-compose exec -T studio bash -c 'cd /tmp && tar xzf course.tar.gz'
17+
docker-compose exec -T studio bash -e -c 'cd /tmp && tar xzf course.tar.gz'
1718

1819
# Import the course content
19-
docker-compose exec -T studio bash -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py cms --settings=devstack_docker import /tmp course'
20+
docker-compose exec -T studio bash -e -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py cms --settings=devstack_docker import /tmp course'
2021

2122
# Clean up the temp files
22-
docker-compose exec -T studio bash -c 'rm /tmp/course.tar.gz'
23-
docker-compose exec -T studio bash -c 'rm -r /tmp/course'
23+
docker-compose exec -T studio bash -e -c 'rm /tmp/course.tar.gz'
24+
docker-compose exec -T studio bash -e -c 'rm -r /tmp/course'

provision-ecommerce.sh

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
set -x
4+
15
# Load database dumps for the largest databases to save time
26
./load-db.sh ecommerce
37

48
./provision-ida.sh ecommerce ecommerce 18130
59

610
# Configure ecommerce
7-
docker-compose exec -T ecommerce bash -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py create_or_update_site --site-id=1 --site-domain=localhost:18130 --partner-code=edX --partner-name="Open edX" --lms-url-root=http://edx.devstack.lms:18000 --lms-public-url-root=http://localhost:18000 --client-side-payment-processor=cybersource --payment-processors=cybersource,paypal --sso-client-id=ecommerce-sso-key --sso-client-secret=ecommerce-sso-secret --backend-service-client-id=ecommerce-backend-service-key --backend-service-client-secret=ecommerce-backend-service-secret --from-email [email protected] --discovery_api_url=http://edx.devstack.discovery:18381/api/v1/ --enable-microfrontend-for-basket-page=1 --payment-microfrontend-url=http://localhost:1998'
8-
docker-compose exec -T ecommerce bash -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py oscar_populate_countries --initial-only'
9-
docker-compose exec -T ecommerce bash -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py create_demo_data --partner=edX'
11+
docker-compose exec -T ecommerce bash -e -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py create_or_update_site --site-id=1 --site-domain=localhost:18130 --partner-code=edX --partner-name="Open edX" --lms-url-root=http://edx.devstack.lms:18000 --lms-public-url-root=http://localhost:18000 --client-side-payment-processor=cybersource --payment-processors=cybersource,paypal --sso-client-id=ecommerce-sso-key --sso-client-secret=ecommerce-sso-secret --backend-service-client-id=ecommerce-backend-service-key --backend-service-client-secret=ecommerce-backend-service-secret --from-email [email protected] --discovery_api_url=http://edx.devstack.discovery:18381/api/v1/ --enable-microfrontend-for-basket-page=1 --payment-microfrontend-url=http://localhost:1998'
12+
docker-compose exec -T ecommerce bash -e -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py oscar_populate_countries --initial-only'
13+
docker-compose exec -T ecommerce bash -e -c 'source /edx/app/ecommerce/ecommerce_env && python /edx/app/ecommerce/ecommerce/manage.py create_demo_data --partner=edX'

provision-forum.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
set -e
2-
set -o pipefail
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
33
set -x
44

55
docker-compose up -d forum
6-
docker-compose exec -T forum bash -c 'source /edx/app/forum/ruby_env && cd /edx/app/forum/cs_comments_service && bundle install --deployment --path /edx/app/forum/.gem/'
6+
docker-compose exec -T forum bash -e -c 'source /edx/app/forum/ruby_env && cd /edx/app/forum/cs_comments_service && bundle install --deployment --path /edx/app/forum/.gem/'

provision-ida-user.sh

+22-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,33 @@
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
set -x
4+
5+
# FIXME[bash-e]: Bash scripts should use -e -- but this script fails
6+
# with the following errors for ecommerce & edx_notes_api:
7+
# - RuntimeError: Model class openedx.core.djangoapps.content_libraries.models.ContentLibrary doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
8+
# - django.db.utils.ProgrammingError: (1146, "Table 'edxapp.auth_user' doesn't exist")
9+
set +e
10+
111
#This script depends on the LMS being up!
212

13+
. scripts/colors.sh
14+
315
app_name=$1
416
client_name=$2
517
client_port=$3
618

719
echo -e "${GREEN}Creating service user and OAuth2 applications for ${app_name}...${NC}"
820

921
# Create the service user.
10-
docker-compose exec -T lms bash -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker manage_user $1_worker [email protected] --staff --superuser' -- "$app_name"
22+
docker-compose exec -T lms bash -e -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker manage_user $1_worker [email protected] --staff --superuser' -- "$app_name"
1123

1224
# Create the DOT applications - one for single sign-on and one for backend service IDA-to-IDA authentication.
13-
docker-compose exec -T lms bash -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker create_dot_application --grant-type authorization-code --skip-authorization --redirect-uris "http://localhost:$3/complete/edx-oauth2/" --client-id "$1-sso-key" --client-secret "$1-sso-secret" --scopes "user_id" $1-sso $1_worker' -- "$app_name" "$client_name" "$client_port"
14-
docker-compose exec -T lms bash -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker create_dot_application --grant-type client-credentials --client-id "$1-backend-service-key" --client-secret "$1-backend-service-secret" $1-backend-service $1_worker' -- "$app_name" "$client_name" "$client_port"
25+
docker-compose exec -T lms bash -e -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker create_dot_application --grant-type authorization-code --skip-authorization --redirect-uris "http://localhost:$3/complete/edx-oauth2/" --client-id "$1-sso-key" --client-secret "$1-sso-secret" --scopes "user_id" $1-sso $1_worker' -- "$app_name" "$client_name" "$client_port"
26+
docker-compose exec -T lms bash -e -c 'source /edx/app/edxapp/edxapp_env && python /edx/app/edxapp/edx-platform/manage.py lms --settings=devstack_docker create_dot_application --grant-type client-credentials --client-id "$1-backend-service-key" --client-secret "$1-backend-service-secret" $1-backend-service $1_worker' -- "$app_name" "$client_name" "$client_port"
27+
28+
29+
# FIXME[bash-e]: Suppress last error so that calling script can set -e
30+
# for itself. Remove this once *this* script is run entirely with `-e`
31+
# in effect (or at least the last command is no longer erroring for
32+
# any services).
33+
true

provision-ida.sh

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
#!/bin/sh -x
1+
#!/usr/bin/env bash
2+
set -eu -o pipefail
3+
4+
. scripts/colors.sh
5+
set -x
6+
27
app_name=$1 # The name of the IDA application, i.e. /edx/app/<app_name>
38
client_name=$2 # The name of the Oauth client stored in the edxapp DB.
49
client_port=$3 # The port corresponding to this IDA service in devstack.
@@ -7,17 +12,17 @@ container_name=${4:-$1} # (Optional) The name of the container. If missing, wil
712
docker-compose up -d $app_name
813

914
echo -e "${GREEN}Installing requirements for ${app_name}...${NC}"
10-
docker-compose exec -T ${container_name} bash -c 'source /edx/app/$1/$1_env && cd /edx/app/$1/$1/ && make requirements' -- "$app_name"
15+
docker-compose exec -T ${container_name} bash -e -c 'source /edx/app/$1/$1_env && cd /edx/app/$1/$1/ && make requirements' -- "$app_name"
1116

1217
echo -e "${GREEN}Running migrations for ${app_name}...${NC}"
13-
docker-compose exec -T ${container_name} bash -c 'source /edx/app/$1/$1_env && cd /edx/app/$1/$1/ && make migrate' -- "$app_name"
18+
docker-compose exec -T ${container_name} bash -e -c 'source /edx/app/$1/$1_env && cd /edx/app/$1/$1/ && make migrate' -- "$app_name"
1419

1520
echo -e "${GREEN}Creating super-user for ${app_name}...${NC}"
16-
docker-compose exec -T ${container_name} bash -c 'source /edx/app/$1/$1_env && echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser(\"edx\", \"[email protected]\", \"edx\") if not User.objects.filter(username=\"edx\").exists() else None" | python /edx/app/$1/$1/manage.py shell' -- "$app_name"
21+
docker-compose exec -T ${container_name} bash -e -c 'source /edx/app/$1/$1_env && echo "from django.contrib.auth import get_user_model; User = get_user_model(); User.objects.create_superuser(\"edx\", \"[email protected]\", \"edx\") if not User.objects.filter(username=\"edx\").exists() else None" | python /edx/app/$1/$1/manage.py shell' -- "$app_name"
1722

1823
./provision-ida-user.sh $app_name $client_name $client_port
1924

2025
# Compile static assets last since they are absolutely necessary for all services. This will allow developers to get
2126
# started if they do not care about static assets
2227
echo -e "${GREEN}Compiling static assets for ${app_name}...${NC}"
23-
docker-compose exec -T ${container_name} bash -c 'source /edx/app/$1/$1_env && cd /edx/app/$1/$1/ && make static' -- "$app_name"
28+
docker-compose exec -T ${container_name} bash -e -c 'source /edx/app/$1/$1_env && cd /edx/app/$1/$1/ && make static' -- "$app_name"

0 commit comments

Comments
 (0)