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)
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()
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)
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."
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.'
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
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()
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)
def deployment(): config_file = Path.cwd().joinpath('deployments', 'foo', 'config.yaml').resolve() deployment = Deployment(config_file) return deployment