Пример #1
0
def destroy(deployment_name, rm):
    """
    !!! Destroys (runs 'terraform destroy') on <deployment_name> resources.

    The <deployment-name> must exist in the ./deployments directory.

    Usage:
        drone-deploy destroy drone.mydomain.com

        Tears down any aws resources created during deploy. The S3 data bucket must
        be emptied and deleted manually.

    """

    deployment_dir = Path.cwd().joinpath('deployments', deployment_name, 'config.yaml').resolve()
    if not deployment_dir.exists():
        click.echo("Couldn't find the deployment."
                   "Run 'drone-deploy list' to see available deployemnts.")
        return False

    # # load the deployment
    deployment = Deployment(deployment_dir)
    click.echo(f"Destroying {deployment_name}...")
    deployment.destroy()

    if rm:
        # delete the directory
        shutil.rmtree(deployment_dir.parent)
Пример #2
0
def build_ami(deployment_name):
    """
    Builds the drone server AMI (Amazon Machine Image).
    """
    deployment_dir = Path.cwd().joinpath('deployments', deployment_name)
    if not deployment_dir.exists():
        click.echo("Couldn't find the deployment."
                   "Run 'drone-deploy list' to see available deployemnts.")
        return False
    else:
        # load the deployment
        deployment = Deployment(
            deployment_dir.joinpath('config.yaml').resolve())
        deployment.build_ami()
Пример #3
0
def test_deployment_with_invalid_config_file(invalid_config_file):
    if invalid_config_file.exists():
        try:
            Deployment(invalid_config_file)
            assert False, 'Was able to parse an invalid config.yaml file.'
        except ruamel.yaml.parser.ParserError:
            assert True
def show_agent_command(deployment_name):
    """
    Shows the docker command used to launch agents for a deployment.
    """
    deployment_dir = Path.cwd().joinpath('deployments', deployment_name,
                                         'config.yaml').resolve()
    if not deployment_dir.exists():
        click.echo("Couldn't find the deployment."
                   "Run 'drone-deploy list' to see available deployemnts.")
        return False

    # display the docker command to run an agent
    deployment = Deployment(deployment_dir)
    rpc_secret = deployment.config['drone_rpc_secret']
    agent_image = deployment.config['drone_agent_docker_image']

    docker_command = f'''
        # Run the following command on a host running docker to launch a build agent:

        docker run -v /var/run/docker.sock:/var/run/docker.sock \\
            -e DRONE_RPC_SERVER=https://{deployment_name} \\
            -e DRONE_RUNNER_CAPACITY=1 \\
            -e DRONE_RPC_SECRET={rpc_secret} \\
            -d {agent_image}
    '''
    click.echo(docker_command)
Пример #5
0
def test_deployment_class_writing_config_file_to_disk(new_deployment):
    os.environ["DRONE_AWS_REGION"] = "us-east-6"
    config_file = Path.cwd().joinpath('deployments', 'foo',
                                      'config.yaml').resolve()
    deployment = Deployment(config_file)

    # update a param and write to disk
    assert deployment.config.get(
        'drone_aws_region'
    ) == 'us-east-6', 'test setup failed. Param was not loaded from env vars as expected.'
    deployment.write_config()

    # verify
    yaml = YAML()
    config = yaml.load(config_file)
    assert 'us-east-6' in config[
        'drone_aws_region'], "write_config() did not update param as expected."
Пример #6
0
def test_deployment_class_loading_params_from_env(new_deployment):
    os.environ["DRONE_AWS_REGION"] = "us-east-5"
    config_file = Path.cwd().joinpath('deployments', 'foo',
                                      'config.yaml').resolve()
    deployment = Deployment(config_file)
    assert deployment.config.get(
        'drone_aws_region'
    ) == 'us-east-5', 'Param was not loaded from env vars as expected.'
Пример #7
0
def test_deployment_class_deployment_with_missing_config_file():
    no_config = Path.cwd().joinpath('deployments', 'config.yaml')
    assert not no_config.exists(
    ), "test error. deployments/config.yaml should not exist."
    try:
        Deployment(no_config)
        assert False, 'Did not raise FileNotFoundError as expected.'
    except FileNotFoundError:
        assert True
Пример #8
0
def plan(deployment_name):
    """
    Runs 'terraform plan' on <deployment_name>.

    The <deployment-name> must exist in the ./deployments directory.

    Usage:
        drone-deploy plan drone.mydomain.com

    Related:
        drone-deploy [list, show, deploy]
    """

    deployment_dir = Path.cwd().joinpath('deployments', deployment_name,
                                         'config.yaml').resolve()
    if not deployment_dir.exists():
        click.echo("Couldn't find the deployment."
                   "Run 'drone-deploy list' to see available deployemnts.")
        return False

    # load the deployment
    deployment = Deployment(deployment_dir)
    deployment.plan()
Пример #9
0
def show(deployment_name):
    """
    Shows <deployment-name>'s configuration.
    """
    deployment_dir = Path.cwd().joinpath('deployments', deployment_name,
                                         'config.yaml').resolve()
    if not deployment_dir.exists():
        click.echo("Couldn't find the deployment. "
                   "Run 'drone-deploy list' to see available deployemnts.")
        return False

    # load the deployment
    deployment = Deployment(deployment_dir)
    click.echo(deployment)
    click.echo(deployment.deployment_status)
def prepare_deployment(deployment_name):
    """
    Sets up and prepares the deployment. Specifically, it runs 'terraform init'
    on <deployment_name> and bootstraps the needed IAM roles and policies for
    building and launching the AMI ec2 instance.

    This command can be run at any time, and will update/upgrade terraform aws
    components if needed. But, it must be run at least once for each deployment.

    The <deployment-name> must exist in the ./deployments directory.

    Usage:
        $> drone-deploy new drone.mydomain.com
        # edit deployments/drone.mydomain.com/config.yaml
        $> drone-deploy prepare drone.mydomain.com

    Related:
        drone-deploy [list, show, deploy]
    """

    deployment_dir = Path.cwd().joinpath('deployments', deployment_name,
                                         'config.yaml').resolve()
    if not deployment_dir.exists():
        click.echo("Couldn't find the deployment."
                   "Run 'drone-deploy list' to see available deployemnts.")
        return False

    # load the deployment, run terraform init, and apply roles and policies
    deployment = Deployment(deployment_dir)
    try:
        deployment.init()
    except Exception:
        pass

    # Apply needed IAM roles and policies for building/deploying ami
    targets = ' '.join("-target={}".format(t) for t in [
        "aws_iam_policy.drone-builder-ec2", "aws_iam_policy.drone-builder-s3",
        "aws_iam_policy_attachment.ec2", "aws_iam_policy_attachment.s3",
        "aws_iam_instance_profile.drone-builder"
    ])

    deployment.deploy(targets)
Пример #11
0
def deployment():
    config_file = Path.cwd().joinpath('deployments', 'foo',
                                      'config.yaml').resolve()
    deployment = Deployment(config_file)
    return deployment