def build_docker(commit_id): """ Task responsible for building a docker image from a commit, and pushing that image to a remote repository for storage :param commit_id: commit integer id from which to build :type commit_id: int or basestring :return: None """ commit_id = int(commit_id) commit = Commit.query.get(commit_id) build = Build( commit=commit, timestamp=datetime.datetime.now(), ) current_app.logger.info("Build created: {}:{}".format( commit.repository, commit.commit_hash, )) try: builder = DockerImageBuilder(commit) builder.run() except Exception, e: current_app.logger.exception(e)
def setUp(self): self.commit = Commit( commit_hash='master', repository="adsws" ) self.builder = DockerImageBuilder(self.commit)
class TestDockerImageBuilder(unittest.TestCase): """ Test the DockerImageBuilder """ def setUp(self): self.commit = Commit( commit_hash='master', repository="adsws" ) self.builder = DockerImageBuilder(self.commit) def test_get_templates(self): """ Test that the builder grabs the expected templates. This uses "live" templates. """ self.builder.render_templates() self.assertGreater(len(self.builder.files), 0) self.assertEqual(self.builder.files[0]['name'], 'Dockerfile') self.assertIn(self.commit.commit_hash, self.builder.files[0]['content']) def test_create_docker_context(self): """ Test that the docker context is created in-memory and that it has a non zero size. This uses "live" templates. """ self.builder.render_templates() self.builder.create_docker_context() self.assertIsInstance(self.builder.tarfile, io.BytesIO) with tarfile.open(fileobj=self.builder.tarfile) as tf: for fn in ["Dockerfile", "gunicorn.conf.py", "app.nginx.conf"]: f = tf.getmember(fn) self.assertEqual(f.mode, 420) for fn in ["gunicorn.sh", "nginx.sh"]: f = tf.getmember(fn) self.assertEqual(f.mode, 0555) @mock.patch('mc.builders.Client') def test_docker_build(self, mocked): """ Tests that docker build (using a mocked docker client) returns as expected """ instance = mocked.return_value instance.build.return_value = ['Successfully built'] self.builder.build() self.assertTrue(self.builder.built) @mock.patch('mc.builders.Client') def test_docker_push(self, mocked): """ Tests that docker push (using a mocked docker client) returns as expected """ instance = mocked.return_value instance.push.return_value = ['pushing tag'] self.builder.pushed = False instance.push.return_value = ['DIGEST: sha256'] self.builder.push() self.assertTrue(self.builder.pushed) instance.push.return_value = ['error'] with self.assertRaises(BuildError): self.builder.push()
def setUp(self): self.commit = Commit(commit_hash='master', repository="adsws") self.builder = DockerImageBuilder(self.commit)
class TestDockerImageBuilder(unittest.TestCase): """ Test the DockerImageBuilder """ def setUp(self): self.commit = Commit(commit_hash='master', repository="adsws") self.builder = DockerImageBuilder(self.commit) def test_get_templates(self): """ Test that the builder grabs the expected templates. This uses "live" templates. """ self.builder.render_templates() self.assertGreater(len(self.builder.files), 0) self.assertEqual(self.builder.files[0]['name'], 'Dockerfile') self.assertIn(self.commit.commit_hash, self.builder.files[0]['content']) def test_get_template_when_does_not_exist(self): """ Test that the builder grabs a default template if there is not one designed for that service """ self.builder.repo = 'unknown repo' self.builder.render_templates() self.assertEqual(self.builder.files[0]['name'], 'Dockerfile') self.assertIn(self.commit.commit_hash, self.builder.files[0]['content']) def test_create_docker_context(self): """ Test that the docker context is created in-memory and that it has a non zero size. This uses "live" templates. """ self.builder.render_templates() self.builder.create_docker_context() self.assertIsInstance(self.builder.tarfile, io.BytesIO) with tarfile.open(fileobj=self.builder.tarfile) as tf: for fn in ["Dockerfile", "gunicorn.conf.py", "app.nginx.conf"]: f = tf.getmember(fn) self.assertEqual(f.mode, 420) for fn in ["gunicorn.sh", "nginx.sh"]: f = tf.getmember(fn) self.assertEqual(f.mode, 0555) @mock.patch('mc.builders.Client') def test_docker_build(self, mocked): """ Tests that docker build (using a mocked docker client) returns as expected """ instance = mocked.return_value instance.build.return_value = ['Successfully built'] self.builder.build() self.assertTrue(self.builder.built) @mock.patch('mc.builders.Client') def test_docker_push(self, mocked): """ Tests that docker push (using a mocked docker client) returns as expected """ instance = mocked.return_value instance.push.return_value = ['pushing tag'] self.builder.pushed = False instance.push.return_value = ['DIGEST: sha256'] self.builder.push() self.assertTrue(self.builder.pushed) instance.push.return_value = ['error'] with self.assertRaises(BuildError): self.builder.push()