def _download_and_extract_artifact_locally(self, download_dir, extension, extract=True): method = "_download_and_extract_artifact_locally" commons.print_msg(Artifactory.clazz, method, 'begin') commons.verify_version(self.config) artifact_to_download = self.config.project_name + '-' + self.config.version_number + '.' + extension try: artifact = self.get_artifact_url() download_path = download_dir + artifact_to_download commons.print_msg( Artifactory.clazz, method, "artifact_to_download = {a} and download_path is {d}".format( a=artifact_to_download, d=download_path)) commons.print_msg( Artifactory.clazz, method, 'Downloading {artifact} to {download_path}'.format( artifact=artifact, download_path=download_path)) except ArtifactException: exit(1) try: self.download_artifact(artifact, download_path) except ArtifactDownloadException as e: commons.print_msg(Artifactory.clazz, method, 'Failed to download {}'.format(artifact), 'ERROR') commons.print_msg(Artifactory.clazz, method, "URLError is {msg}".format(msg=e)) os.system('stty sane') exit(1) if extract: # Unzip/untar file downloaded from Artifactory if required if extension == "tar.gz" or extension == "tar" or extension == "tgz": tar = tarfile.open(download_path) tar.extractall(download_dir) tar.close() commons.print_msg( Artifactory.clazz, method, 'Deploying a tar from {}'.format(download_path)) if extension == "zip": with zipfile.ZipFile(download_path, "r") as z: z.extractall(download_dir) commons.print_msg( Artifactory.clazz, method, "Deploying a zip from {}".format(download_path)) print(download_path) commons.print_msg(Artifactory.clazz, method, 'end')
def get_artifact_home_url(self): method = 'get_artifact_home_url' commons.print_msg(Artifactory.clazz, method, 'begin') commons.verify_version(self.config) url = Artifactory.artifactory_domain + commons.forward_slash + \ Artifactory.repo_key + commons.forward_slash + \ Artifactory.artifactory_group + commons.forward_slash + \ self.config.project_name + commons.forward_slash + \ self.config.version_number commons.print_msg(Artifactory.clazz, method, ("Artifactory url:", url)) commons.print_msg(Artifactory.clazz, method, "end") return url
def publish_deployment(self, story_details): method = 'publish_deployment' commons.print_msg(Slack.clazz, method, 'begin') if Slack.slack_url is None: commons.print_msg(Slack.clazz, method, 'No Slack URL was found in the environment. Did you set ' 'SLACK_WEBHOOK_URL in your pipeline?', 'ERROR') exit(1) commons.verify_version(self.config) icon = None emoji = None slack_channel = None user_name = None if 'slack' in self.config.json_config and 'emoji' in self.config.json_config['slack']: emoji = self.config.json_config['slack']['emoji'] elif self.config.settings.has_section('slack') and self.config.settings.has_option('slack', 'emoji'): emoji = self.config.settings.get('slack', 'emoji') if 'slack' in self.config.json_config and 'icon' in self.config.json_config['slack']: icon = self.config.json_config['slack']['icon'] elif self.config.settings.has_section('slack') and self.config.settings.has_option('slack', 'icon'): icon = self.config.settings.get('slack', 'icon') if 'slack' in self.config.json_config and 'channel' in self.config.json_config['slack']: slack_channel = self.config.json_config['slack']['channel'] elif self.config.settings.has_section('slack') and self.config.settings.has_option('slack', 'channel'): slack_channel = self.config.settings.get('slack', 'channel') if 'slack' in self.config.json_config and 'botName' in self.config.json_config['slack']: user_name = self.config.json_config['slack']['botName'] elif self.config.settings.has_section('slack') and self.config.settings.has_option('slack', 'bot_name'): user_name = self.config.settings.get('slack', 'bot_name') app_version = self.config.version_number environment = self.config.build_env app_name = self.config.json_config['projectInfo']['name'] slack_message = Object() if icon: slack_message.icon_url = icon else: slack_message.icon_emoji = emoji if slack_channel: slack_message.channel = slack_channel slack_message.username = user_name slack_message.attachments = [] # Application information attachment = Object() attachment.mrkdwn_in = ['pretext', 'fields'] attachment.fallback = "{name} {version} has been deployed to {env}".format(name=app_name, version=app_version, env=environment) attachment.pretext = ":package: *{app}* _{version}_ has been deployed to *{env}*".format(app=app_name, version=app_version, env=environment) attachment.fields = [] manual_deploy_environment_links = self._get_manual_deploy_links() # deploy links for key, value in enumerate(manual_deploy_environment_links): attachment_field = Object() attachment_field.value = "Deploy to <{link}|{title}>".format(link=manual_deploy_environment_links[value], title=value) attachment.fields.append(attachment_field) slack_message.attachments.append(attachment) # no stories defined if len(story_details) == 0: attachment = Object() attachment.mrkdwn_in = ['pretext', 'fields'] attachment.pretext = '*No Release Notes*' slack_message.attachments.append(attachment) # story details for i, story in enumerate(story_details): if story.story_type == 'release': story_emoji = ':checkered_flag:' elif story.story_type == 'bug': story_emoji = ':beetle:' elif story.story_type == 'chore': story_emoji = ':wrench:' else: story_emoji = ':star:' attachment = Object() attachment.fallback = story.name attachment.mrkdwn_in = ['pretext', 'fields'] if (BuildConfig.settings.has_section('slack') and BuildConfig.settings.has_option('slack', 'release_note_attachment_color')): attachment.color = BuildConfig.settings.get('slack', 'release_note_attachment_color') else: attachment.color = '#0000ff' attachment.footer = 'Flow' if (BuildConfig.settings.has_section('slack') and BuildConfig.settings.has_option('slack', 'footer_icon_url')): attachment.footer_icon = BuildConfig.settings.get('slack', 'footer_icon_url') if i == 0: attachment.pretext = '*Release Notes*' attachment.fields = [] attachment_field = Object() attachment_field.value = "*" + str(story.id) + "* " + story_emoji + ' _' + story.story_type + "_" attachment_field.short = True attachment.fields.append(attachment_field) attachment_field = Object() attachment_field.value = '*<' + story.url + '|' + story.name + '>*' attachment.fields.append(attachment_field) attachment_field = Object() if story.description is None or len(story.description.strip()) == 0: attachment_field.value = '_No description_' else: attachment_field.value = (story.description[:150] + '..') if len(story.description) > 150 else story.description attachment.fields.append(attachment_field) attachment_field = Object() # TODO: Put this back # attachment_field.value = '*Status*: ' + story.description attachment_field.short = True attachment.fields.append(attachment_field) slack_message.attachments.append(attachment) headers = {'Content-type': 'application/json', 'Accept': 'application/json'} commons.print_msg(Slack.clazz, method, Slack.slack_url) commons.print_msg(Slack.clazz, method, slack_message.to_JSON()) resp = None # instantiated so it can be logged outside of the try below the except try: resp = requests.post(Slack.slack_url, slack_message.to_JSON(), headers=headers, timeout=self.http_timeout) except requests.ConnectionError: commons.print_msg(Slack.clazz, method, "Request to Slack timed out.", "ERROR") exit(1) except Exception as e: commons.print_msg(Slack.clazz, method, "Failed sending slack message to {url}. {exception}".format( url=Slack.slack_url, exception=e)) # has to be defined here too in order to exit properly during the exception but still log appropriate # messages when there is a status code available if hasattr('resp', 'status_code') and resp.status_code != 200: commons.print_msg(Slack.clazz, method, "Failed sending slack message to {url}. \r\n Response: {resp}" .format(url=Slack.slack_url, resp=resp.text)) exit(1) if hasattr('resp', 'status_code') and resp.status_code != 200: commons.print_msg(Slack.clazz, method, "Failed sending slack message to {url}. \r\n Response: {resp}" .format(url=Slack.slack_url, resp=resp.text)) exit(1) commons.print_msg(Slack.clazz, method, 'end')