Skip to content

Commit

Permalink
Update deps during docker compose up to parallelize frontend startup
Browse files Browse the repository at this point in the history
  • Loading branch information
KevinMind committed May 23, 2024
1 parent 2141c4b commit 7ebe58d
Show file tree
Hide file tree
Showing 5 changed files with 49 additions and 39 deletions.
1 change: 1 addition & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ jobs:
uses: ./.github/actions/run-docker
with:
version: ${{ steps.build.outputs.version }}
compose_file: docker-compose.yml
run: |
make docs
- name: Upload artifact
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/extract-locales.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ jobs:
uses: ./.github/actions/run-docker
with:
version: ${{ steps.build.outputs.version }}
compose_file: docker-compose.yml
run: |
make extract_locales
Expand Down
17 changes: 1 addition & 16 deletions Makefile-os
Original file line number Diff line number Diff line change
Expand Up @@ -136,23 +136,8 @@ docker_compose_up: docker_mysqld_volume_create ## Start the docker containers
# remove the deps container after the other containers are up
docker compose rm -f

.PHONY: docker_extract_deps
docker_extract_deps: ## Extract dependencies from the docker image to a local volume mount
# Run a fresh container from the base image to install deps. Since /deps is
# shared via a volume in docker-compose.yml, this installs deps for both web
# and worker containers, and does so without requiring the containers to be up.
# We just create dummy empty package.json and package-lock.json in deps/ so
# that docker compose doesn't create dummy ones itself, as they would be owned
# by root. They don't matter: the ones at the root directory are mounted
# instead.
touch deps/package.json
touch deps/package-lock.json
# mounting ./deps:/deps effectively removes dependencies from the /deps directory in the container
# running `update_deps` will install the dependencies in the /deps directory before running
docker compose -f docker-compose.yml run --rm web make update_deps

.PHONY: up
up: setup docker_mysqld_volume_create docker_extract_deps docker_compose_up ## Create and start docker compose
up: setup docker_compose_up ## Create and start docker compose

.PHONY: down
down: docker_compose_down ## Stop the docker containers
Expand Down
48 changes: 34 additions & 14 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,44 @@ x-env-mapping: &env
- SUPERUSER_EMAIL
- SUPERUSER_USERNAME

# The base container for the addons-server. used by web and worker.
# It has a different name to allow it to be "included" in other compose files.
x-olympia: &olympia
<<: *env
image: ${DOCKER_TAG:-}
# We drop down to a different user through supervisord, but starting as
# root allows us to fix the ownership of files generated at image build
# time through the ./docker/entrypoint.sh script.
user: root
platform: linux/amd64
# The entrypoint script will handle the user switch, so we start as root.
# It will use the defined HOST_UID to switch the `olympia` user ID to match
# that of the host user, granting any host mounts the correct file permissions
entrypoint: ["/data/olympia/docker/entrypoint.sh"]
volumes:
- .:/data/olympia
- storage:/data/olympia/storage
- ./deps:/deps
- ./package.json:/deps/package.json
- ./package-lock.json:/deps/package-lock.json

services:
# Temporary container to update the dependencies in the deps volume
# before running the web/worker containers.
deps_container:
<<: *olympia
environment:
- HOST_UID
command:
- make update_deps

worker: &worker
<<: *env
image: ${DOCKER_TAG:-}
# We drop down to a different user through supervisord, but starting as
# root allows us to fix the ownership of files generated at image build
# time through the ./docker/entrypoint.sh script.
user: root
platform: linux/amd64
entrypoint: ["/data/olympia/docker/entrypoint.sh"]
<<: *olympia
depends_on:
deps_container:
condition: service_completed_successfully
command:
- supervisord -n -c /data/olympia/docker/supervisor-celery.conf
volumes:
- .:/data/olympia
- storage:/data/olympia/storage
- ./deps:/deps
- ./package.json:/deps/package.json
- ./package-lock.json:/deps/package-lock.json
extra_hosts:
- "olympia.test:127.0.0.1"
restart: on-failure:5
Expand Down
21 changes: 12 additions & 9 deletions tests/make/make.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,47 +117,50 @@ describe.only.each([
version: undefined,
digest: undefined,
tag: undefined,
expected: 'mozilla/addons-server:local'
expected: 'mozilla/addons-server:local',
},
{
version: 'version',
digest: undefined,
tag: undefined,
expected: 'mozilla/addons-server:version'
expected: 'mozilla/addons-server:version',
},
{
version: undefined,
digest: 'sha256:digest',
tag: undefined,
expected: 'mozilla/addons-server@sha256:digest'
expected: 'mozilla/addons-server@sha256:digest',
},
{
version: 'version',
digest: 'sha256:digest',
tag: undefined,
expected: 'mozilla/addons-server@sha256:digest'
expected: 'mozilla/addons-server@sha256:digest',
},
{
version: 'version',
digest: 'sha256:digest',
tag: 'previous',
expected: 'mozilla/addons-server@sha256:digest'
expected: 'mozilla/addons-server@sha256:digest',
},
{
version: undefined,
digest: undefined,
tag: 'previous',
expected: 'previous'
expected: 'previous',
},
])('DOCKER_TARGET', ({version, digest, tag, expected}) => {
])('DOCKER_TARGET', ({ version, digest, tag, expected }) => {
it(`version:${version}_digest:${digest}_tag:${tag}`, () => {
fs.writeFileSync(envPath, '');
runSetup({DOCKER_VERSION: version, DOCKER_DIGEST: digest, DOCKER_TAG: tag});
runSetup({
DOCKER_VERSION: version,
DOCKER_DIGEST: digest,
DOCKER_TAG: tag,
});

const actual = readEnvFile('DOCKER_TAG');
expect(actual).toStrictEqual(expected);
});

});

const testCases = [
Expand Down

0 comments on commit 7ebe58d

Please sign in to comment.