예제 #1
0
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)
예제 #2
0
 def setUp(self):
     self.commit = Commit(
         commit_hash='master',
         repository="adsws"
     )
     self.builder = DockerImageBuilder(self.commit)
예제 #3
0
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()
예제 #4
0
 def setUp(self):
     self.commit = Commit(commit_hash='master', repository="adsws")
     self.builder = DockerImageBuilder(self.commit)
예제 #5
0
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()