Exemple #1
0
    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')
Exemple #2
0
    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
Exemple #3
0
    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')