Skip to content

Commit

Permalink
♻️ Refactor tests to use env vars and push dated tags (#15)
Browse files Browse the repository at this point in the history
  • Loading branch information
tiangolo authored Oct 15, 2019
1 parent dea28f0 commit 8ce9e0a
Show file tree
Hide file tree
Showing 24 changed files with 250 additions and 491 deletions.
23 changes: 18 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,24 @@ install:
services:
- docker

env:
- NAME='latest' BUILD_PATH='python3.7' TEST_STR1='Hello world! From Uvicorn with Gunicorn. Using Python 3.7' TEST_STR2='Test app. From Uvicorn with Gunicorn. Using Python 3.7'
- NAME='python3.7' BUILD_PATH='python3.7' TEST_STR1='Hello world! From Uvicorn with Gunicorn. Using Python 3.7' TEST_STR2='Test app. From Uvicorn with Gunicorn. Using Python 3.7'
- NAME='python3.6' BUILD_PATH='python3.6' TEST_STR1='Hello world! From Uvicorn with Gunicorn. Using Python 3.6' TEST_STR2='Test app. From Uvicorn with Gunicorn. Using Python 3.6'
- NAME='python3.7-alpine3.8' BUILD_PATH='python3.7-alpine3.8' TEST_STR1='Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.7' TEST_STR2='Test app. From Uvicorn with Gunicorn. Using Python 3.7'
- NAME='python3.6-alpine3.8' BUILD_PATH='python3.6-alpine3.8' TEST_STR1='Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.6' TEST_STR2='Test app. From Uvicorn with Gunicorn. Using Python 3.6'


script:
- bash scripts/test.sh

deploy:
provider: script
script: bash scripts/deploy.sh
on:
branch: master
jobs:
include:
- script: bash scripts/test.sh
- stage: deploy
script: skip
deploy:
provider: script
script: bash scripts/build-push-all.sh
on:
branch: master
17 changes: 0 additions & 17 deletions docker-compose.build.yml

This file was deleted.

7 changes: 7 additions & 0 deletions scripts/build-push-all.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash

set -e

echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin

BUILD_PUSH=1 python scripts/process_all.py
11 changes: 7 additions & 4 deletions scripts/build-push.sh
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
#!/usr/bin/env bash

set -e
set -x

echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
use_tag="tiangolo/uvicorn-gunicorn:$NAME"
use_dated_tag="${use_tag}-$(date -I)"

docker-compose -f docker-compose.build.yml build
docker build -t "$use_tag" "$BUILD_PATH"

docker-compose -f docker-compose.build.yml push
docker tag "$use_tag" "$use_dated_tag"

docker push "$use_tag"
docker push "$use_dated_tag"
2 changes: 1 addition & 1 deletion scripts/deploy.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
set -e
set -x

bash scripts/build-push.sh
bash scripts/build-push-all.sh

bash scripts/trigger-children.sh
78 changes: 78 additions & 0 deletions scripts/process_all.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import os
import subprocess
import sys

environments = [
{
"NAME": "latest",
"BUILD_PATH": "python3.7",
"TEST_STR1": "Hello world! From Uvicorn with Gunicorn. Using Python 3.7",
"TEST_STR2": "Test app. From Uvicorn with Gunicorn. Using Python 3.7",
},
{
"NAME": "python3.7",
"BUILD_PATH": "python3.7",
"TEST_STR1": "Hello world! From Uvicorn with Gunicorn. Using Python 3.7",
"TEST_STR2": "Test app. From Uvicorn with Gunicorn. Using Python 3.7",
},
{
"NAME": "python3.6",
"BUILD_PATH": "python3.6",
"TEST_STR1": "Hello world! From Uvicorn with Gunicorn. Using Python 3.6",
"TEST_STR2": "Test app. From Uvicorn with Gunicorn. Using Python 3.6",
},
{
"NAME": "python3.7-alpine3.8",
"BUILD_PATH": "python3.7-alpine3.8",
"TEST_STR1": "Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.7",
"TEST_STR2": "Test app. From Uvicorn with Gunicorn. Using Python 3.7",
},
{
"NAME": "python3.6-alpine3.8",
"BUILD_PATH": "python3.6-alpine3.8",
"TEST_STR1": "Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.6",
"TEST_STR2": "Test app. From Uvicorn with Gunicorn. Using Python 3.6",
},
]

start_with = os.environ.get("START_WITH")
build_push = os.environ.get("BUILD_PUSH")


def process_tag(*, env: dict):
use_env = {**os.environ, **env}
script = "scripts/test.sh"
if build_push:
script = "scripts/build-push.sh"
return_code = subprocess.call(["bash", script], env=use_env)
if return_code != 0:
sys.exit(return_code)


def print_version_envs():
env_lines = []
for env in environments:
env_vars = []
for key, value in env.items():
env_vars.append(f"{key}='{value}'")
env_lines.append(" ".join(env_vars))
for line in env_lines:
print(line)


def main():
start_at = 0
if start_with:
start_at = [
i for i, env in enumerate((environments)) if env["NAME"] == start_with
][0]
for i, env in enumerate(environments[start_at:]):
print(f"Processing tag: {env['NAME']}")
process_tag(env=env)


if __name__ == "__main__":
if len(sys.argv) > 1:
print_version_envs()
else:
main()
4 changes: 4 additions & 0 deletions scripts/test-all.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
#!/usr/bin/env bash
set -e

python scripts/process_all.py
4 changes: 3 additions & 1 deletion scripts/test.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#!/usr/bin/env bash
set -e

docker-compose -f docker-compose.build.yml build
use_tag="tiangolo/uvicorn-gunicorn:$NAME"

docker build -t "$use_tag" "$BUILD_PATH"
pytest tests
37 changes: 8 additions & 29 deletions tests/test_01_main/test_defaults.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import time

import docker
import pytest
import requests

from ..utils import CONTAINER_NAME, get_config, get_logs, remove_previous_container
Expand All @@ -27,42 +27,21 @@ def verify_container(container, response_text):
assert response.text == response_text


@pytest.mark.parametrize(
"image,response_text",
[
(
"tiangolo/uvicorn-gunicorn:python3.6",
"Hello world! From Uvicorn with Gunicorn. Using Python 3.6",
),
(
"tiangolo/uvicorn-gunicorn:python3.7",
"Hello world! From Uvicorn with Gunicorn. Using Python 3.7",
),
(
"tiangolo/uvicorn-gunicorn:latest",
"Hello world! From Uvicorn with Gunicorn. Using Python 3.7",
),
(
"tiangolo/uvicorn-gunicorn:python3.6-alpine3.8",
"Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.6",
),
(
"tiangolo/uvicorn-gunicorn:python3.7-alpine3.8",
"Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.7",
),
],
)
def test_defaults(image, response_text):
def test_defaults():
name = os.getenv("NAME")
image = f"tiangolo/uvicorn-gunicorn:{name}"
response_text = os.getenv("TEST_STR1")
sleep_time = int(os.getenv("SLEEP_TIME", 1))
remove_previous_container(client)
container = client.containers.run(
image, name=CONTAINER_NAME, ports={"80": "8000"}, detach=True
)
time.sleep(1)
time.sleep(sleep_time)
verify_container(container, response_text)
container.stop()
# Test that everything works after restarting too
container.start()
time.sleep(1)
time.sleep(sleep_time)
verify_container(container, response_text)
container.stop()
container.remove()
37 changes: 8 additions & 29 deletions tests/test_01_main/test_env_vars_1.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import time

import docker
import pytest
import requests

from ..utils import CONTAINER_NAME, get_config, get_logs, remove_previous_container
Expand All @@ -26,32 +26,11 @@ def verify_container(container, response_text):
assert response.text == response_text


@pytest.mark.parametrize(
"image,response_text",
[
(
"tiangolo/uvicorn-gunicorn:python3.6",
"Hello world! From Uvicorn with Gunicorn. Using Python 3.6",
),
(
"tiangolo/uvicorn-gunicorn:python3.7",
"Hello world! From Uvicorn with Gunicorn. Using Python 3.7",
),
(
"tiangolo/uvicorn-gunicorn:latest",
"Hello world! From Uvicorn with Gunicorn. Using Python 3.7",
),
(
"tiangolo/uvicorn-gunicorn:python3.6-alpine3.8",
"Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.6",
),
(
"tiangolo/uvicorn-gunicorn:python3.7-alpine3.8",
"Hello world! From Uvicorn with Gunicorn in Alpine. Using Python 3.7",
),
],
)
def test_env_vars_1(image, response_text):
def test_env_vars_1():
name = os.getenv("NAME")
image = f"tiangolo/uvicorn-gunicorn:{name}"
response_text = os.getenv("TEST_STR1")
sleep_time = int(os.getenv("SLEEP_TIME", 1))
remove_previous_container(client)
container = client.containers.run(
image,
Expand All @@ -60,12 +39,12 @@ def test_env_vars_1(image, response_text):
ports={"8000": "8000"},
detach=True,
)
time.sleep(1)
time.sleep(sleep_time)
verify_container(container, response_text)
container.stop()
# Test that everything works after restarting too
container.start()
time.sleep(1)
time.sleep(sleep_time)
verify_container(container, response_text)
container.stop()
container.remove()
21 changes: 7 additions & 14 deletions tests/test_01_main/test_env_vars_2.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import os
import time

import docker
import pytest

from ..utils import (
CONTAINER_NAME,
Expand Down Expand Up @@ -31,17 +31,10 @@ def verify_container(container):
)


@pytest.mark.parametrize(
"image",
[
("tiangolo/uvicorn-gunicorn:python3.6"),
("tiangolo/uvicorn-gunicorn:python3.7"),
("tiangolo/uvicorn-gunicorn:latest"),
("tiangolo/uvicorn-gunicorn:python3.6-alpine3.8"),
("tiangolo/uvicorn-gunicorn:python3.7-alpine3.8"),
],
)
def test_env_vars_2(image):
def test_env_vars_2():
name = os.getenv("NAME")
image = f"tiangolo/uvicorn-gunicorn:{name}"
sleep_time = int(os.getenv("SLEEP_TIME", 1))
remove_previous_container(client)
container = client.containers.run(
image,
Expand All @@ -50,12 +43,12 @@ def test_env_vars_2(image):
ports={"80": "8000"},
detach=True,
)
time.sleep(1)
time.sleep(sleep_time)
verify_container(container)
container.stop()
# Test that everything works after restarting too
container.start()
time.sleep(1)
time.sleep(sleep_time)
verify_container(container)
container.stop()
container.remove()
Loading

0 comments on commit 8ce9e0a

Please sign in to comment.