BryanDavis has uploaded a new change for review.
https://gerrit.wikimedia.org/r/291525
Change subject: Make the builder script less simple
......................................................................
Make the builder script less simple
* Generate Dockerfile from Dockerfile.template
* Do not build siblings
* Add unit tests and flake8 linting with tox
* Allow alternate DOCKER_BINARY via environment variable
* Allow python3 from PATH for osx and virtualenv runtimes
Change-Id: Ifbf155de741dda25636989269bc66c332bc62f6e
---
A .gitignore
A README.md
A base/.dockerignore
R base/Dockerfile.template
M build.py
A java/base/.dockerignore
D java/base/Dockerfile
A java/base/Dockerfile.template
A java/web/.dockerignore
D java/web/Dockerfile
A java/web/Dockerfile.template
A php/base/.dockerignore
R php/base/Dockerfile.template
A php/web/.dockerignore
R php/web/Dockerfile.template
A tests/build_tests.py
A tox.ini
17 files changed, 164 insertions(+), 26 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/operations/docker-images/toollabs-images
refs/changes/25/291525/1
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..76b725c
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+*.py[cod]
+/.tox
+__pycache__/
+Dockerfile
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..3c776ba
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+Tool Labs Images
+================
+
+Docker image configuration and management for Wikimedia Tool Labs
+
+TODO: describe how this works
diff --git a/base/.dockerignore b/base/.dockerignore
new file mode 100644
index 0000000..689cf97
--- /dev/null
+++ b/base/.dockerignore
@@ -0,0 +1 @@
+Dockerfile.template
diff --git a/base/Dockerfile b/base/Dockerfile.template
similarity index 91%
rename from base/Dockerfile
rename to base/Dockerfile.template
index e6bcc66..2a1fcb1 100644
--- a/base/Dockerfile
+++ b/base/Dockerfile.template
@@ -1,5 +1,5 @@
# Base toollabs user image
-# Name: docker-registry.tools.wmflabs.org/jessie-toollabs
+# Name: docker-registry.tools.wmflabs.org/toollabs-base
# Source image: Debian Jessie
# Sets up:
# Extra Apt repo: Tools repo
diff --git a/build.py b/build.py
index 62c2f15..eb41b6f 100755
--- a/build.py
+++ b/build.py
@@ -1,11 +1,14 @@
-#!/usr/bin/python3
-import subprocess
-import os
+#!/usr/bin/env python3
+"""
+Build and publish Docker images.
+"""
import argparse
+import os
+import subprocess
# The docker binary to use for executing commands
-DOCKER_BINARY = '/usr/bin/docker'
+DOCKER_BINARY = os.environ.get('DOCKER_BINARY', '/usr/bin/docker')
# Base path of where the docker images are organized
BASE_PATH = os.path.dirname(os.path.abspath(__file__))
@@ -22,8 +25,8 @@
],
'java/base': [
'java/web',
- ]
- }
+ ],
+ },
}
@@ -35,7 +38,19 @@
)
+def make_dockerfile(name, registry, image_prefix):
+ image_dir = os.path.join(BASE_PATH, name)
+ template_file = os.path.join(image_dir, 'Dockerfile.template')
+ out_file = os.path.join(image_dir, 'Dockerfile')
+ kwargs = {'registry': registry, 'image_prefix': image_prefix}
+ with open(template_file, 'rt') as f_in:
+ with open(out_file, 'wt') as f_out:
+ for line in f_in:
+ f_out.write(expand_template(line, kwargs))
+
+
def build_image(name, registry, image_prefix):
+ make_dockerfile(name, registry, image_prefix)
subprocess.check_call([
DOCKER_BINARY,
'build',
@@ -54,19 +69,23 @@
def lineage_of(name):
- def children_of(val):
- if type(val) == dict:
- children = list(val.keys())
- for k, v in val.items():
+ def children_of(node):
+ if type(node) == dict:
+ children = list(node.keys())
+ for k, v in node.items():
children += children_of(v)
return children
- return val
+ return node
- def ancestors_of(val, cur_lineage):
- if name in val:
- return cur_lineage + children_of(val)
- if type(val) == dict:
- for k, v in val.items():
+ def ancestors_of(node, cur_lineage):
+ if name in node:
+ cur_lineage.append(name)
+ if type(node) == dict:
+ cur_lineage.extend(children_of(node[name]))
+ return cur_lineage
+
+ if type(node) == dict:
+ for k, v in node.items():
ret = ancestors_of(v, cur_lineage + [k])
if ret:
return ret
@@ -75,6 +94,10 @@
return ancestors_of(IMAGES, [])
+def expand_template(template, params):
+ return template.format(**params)
+
+
def main():
argparser = argparse.ArgumentParser()
argparser.add_argument(
diff --git a/java/base/.dockerignore b/java/base/.dockerignore
new file mode 100644
index 0000000..689cf97
--- /dev/null
+++ b/java/base/.dockerignore
@@ -0,0 +1 @@
+Dockerfile.template
diff --git a/java/base/Dockerfile b/java/base/Dockerfile
deleted file mode 100644
index e7f4f48..0000000
--- a/java/base/Dockerfile
+++ /dev/null
@@ -1,4 +0,0 @@
-FROM docker-registry.tools.wmflabs.org/toollabs-jessie
-
-RUN apt-get install --yes -t jessie-backports \
- openjdk-8-jdk
diff --git a/java/base/Dockerfile.template b/java/base/Dockerfile.template
new file mode 100644
index 0000000..6a93891
--- /dev/null
+++ b/java/base/Dockerfile.template
@@ -0,0 +1,6 @@
+# Toollabs Java runtime image
+# Name: docker-registry.tools.wmflabs.org/toollabs-java
+FROM {registry}/{image_prefix}-base
+
+RUN apt-get install --yes -t jessie-backports \
+ openjdk-8-jdk
diff --git a/java/web/.dockerignore b/java/web/.dockerignore
new file mode 100644
index 0000000..689cf97
--- /dev/null
+++ b/java/web/.dockerignore
@@ -0,0 +1 @@
+Dockerfile.template
diff --git a/java/web/Dockerfile b/java/web/Dockerfile
deleted file mode 100644
index 9786300..0000000
--- a/java/web/Dockerfile
+++ /dev/null
@@ -1,3 +0,0 @@
-FROM docker-registry.tools.wmflabs.org/toollabs-java
-
-RUN apt-get install --yes toollabs-webservice
diff --git a/java/web/Dockerfile.template b/java/web/Dockerfile.template
new file mode 100644
index 0000000..b7c32be
--- /dev/null
+++ b/java/web/Dockerfile.template
@@ -0,0 +1,5 @@
+# Toollabs Java webserver image
+# Name: docker-registry.tools.wmflabs.org/toollabs-java-web
+FROM {registry}/{image_prefix}-java
+
+RUN apt-get install --yes toollabs-webservice
diff --git a/php/base/.dockerignore b/php/base/.dockerignore
new file mode 100644
index 0000000..689cf97
--- /dev/null
+++ b/php/base/.dockerignore
@@ -0,0 +1 @@
+Dockerfile.template
diff --git a/php/base/Dockerfile b/php/base/Dockerfile.template
similarity index 65%
rename from php/base/Dockerfile
rename to php/base/Dockerfile.template
index 5855d56..6988d5d 100644
--- a/php/base/Dockerfile
+++ b/php/base/Dockerfile.template
@@ -1,4 +1,6 @@
-FROM docker-registry.tools.wmflabs.org/toollabs-jessie
+# Toollabs PHP runtime image
+# Name: docker-registry.tools.wmflabs.org/toollabs-php
+FROM {registry}/{image_prefix}-base
RUN apt-get install --yes \
php5-cli \
diff --git a/php/web/.dockerignore b/php/web/.dockerignore
new file mode 100644
index 0000000..689cf97
--- /dev/null
+++ b/php/web/.dockerignore
@@ -0,0 +1 @@
+Dockerfile.template
diff --git a/php/web/Dockerfile b/php/web/Dockerfile.template
similarity index 68%
rename from php/web/Dockerfile
rename to php/web/Dockerfile.template
index fcf1ba1..4aa3145 100644
--- a/php/web/Dockerfile
+++ b/php/web/Dockerfile.template
@@ -1,4 +1,6 @@
-FROM docker-registry.tools.wmflabs.org/toollabs-php
+# Toollabs PHP webserver image
+# Name: docker-registry.tools.wmflabs.org/toollabs-php-web
+FROM {registry}/{image_prefix}-php
RUN apt-get install --yes \
lighttpd \
diff --git a/tests/build_tests.py b/tests/build_tests.py
new file mode 100644
index 0000000..e4c4700
--- /dev/null
+++ b/tests/build_tests.py
@@ -0,0 +1,68 @@
+import build
+from nose.tools import assert_equals
+
+
+def assert_same(result, expect):
+ """Check arrays for order-free equality."""
+ assert_equals(sorted(result), sorted(expect))
+
+
+def test_lineage_of():
+ build.IMAGES = {
+ 'base': {
+ 'A': ['A1', 'A2'],
+ 'B': ['B1', 'B2'],
+ 'C': {
+ 'C1': {'C1a': ['C1a1']},
+ 'C2': ['C2a'],
+ }
+ }
+ }
+
+ assert_equals(build.lineage_of('not_found'), None)
+ assert_same(
+ build.lineage_of('base'),
+ [
+ 'base',
+ 'A', 'A1', 'A2',
+ 'B', 'B1', 'B2',
+ 'C', 'C1', 'C1a', 'C1a1', 'C2', 'C2a',
+ ]
+ )
+ assert_same(
+ build.lineage_of('B1'),
+ ['base', 'B', 'B1']
+ )
+ assert_same(
+ build.lineage_of('C1'),
+ ['C1a1', 'C1a', 'C1', 'C', 'base']
+ )
+ assert_same(
+ build.lineage_of('C1a1'),
+ ['C1a1', 'C1a', 'C1', 'C', 'base']
+ )
+
+
+def test_make_docker_tag():
+ tests = {
+ 'registry/prefix-name': ['name', 'registry', 'prefix'],
+ 'test/prefix-foo-bar-baz': ['foo/bar/baz', 'test', 'prefix'],
+ }
+ for expect, args in tests.items():
+ yield check_make_docker_tag, args, expect
+
+
+def check_make_docker_tag(given, expect):
+ assert_equals(build.make_docker_tag(*given), expect)
+
+
+def test_expand_template():
+ template = "foo:{foo}\nbar:{bar}"
+ assert_equals(
+ build.expand_template(template, {'foo': 1, 'bar': 2}),
+ "foo:1\nbar:2"
+ )
+ assert_equals(
+ build.expand_template(template, {'foo': 1, 'bar': 2, 'baz': 3}),
+ "foo:1\nbar:2"
+ )
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..5ecb708
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,24 @@
+[tox]
+envlist = py3, flake8
+minversion = 1.6
+skipsdist = True
+
+[testenv]
+basepython = python3
+commands = nosetests tests
+deps = nose
+
+[testenv:flake8]
+basepython = python3
+commands = flake8
+deps = flake8
+
+[flake8]
+max-line-length = 100
+# E121, E123, E126, E133, E226, E241, E242, E704 and W503 are default ignores
+# E124: closing bracket does not match visual indentation
+ignore = E121,E123,E126,E133,E226,E241,E242,E704,W503,E124
+
+[nosetests]
+verbosity=3
+with-doctest=1
--
To view, visit https://gerrit.wikimedia.org/r/291525
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ifbf155de741dda25636989269bc66c332bc62f6e
Gerrit-PatchSet: 1
Gerrit-Project: operations/docker-images/toollabs-images
Gerrit-Branch: master
Gerrit-Owner: BryanDavis <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits