import configparser import datetime import json import os import smtplib import sys from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText import requests class EnvInjection(configparser.Interpolation): """ Derived interpolation to take env variable before file variable. Permit to keep the ini file for local / traditionnal use And use env variable to overload configuration in a Docker usage. """ def before_get(self, parser, section, option, value, defaults): file_value = super().before_get(parser, section, option, value, defaults) if section != parser.default_section: return file_value env_value = os.getenv(option.upper()) return env_value if env_value else file_value def main(): script_dir = os.path.dirname(__file__) conf_file = os.path.join(script_dir, "conf.ini") template_file = os.path.join(script_dir, "template.html") parser = configparser.ConfigParser( default_section="config", interpolation=EnvInjection() ) parser.read(conf_file) default_config = parser["config"] try: projects = json.loads(parser.get("projects", "projects")) except json.decoder.JSONDecodeError as jse: print("ERROR: config file is not correctly JSON formatted!", end="\n\t") print(jse) sys.exit(1) new_releases = [] new_projects = [] if not parser.has_section("release"): parser.add_section("release") for project in projects: last_release = get_last_release(project) if not parser.has_option("release", project): new_projects.append(last_release) else: last_config_tag = parser.get("release", project) if last_config_tag != last_release["release_tag"]: last_release["previous_tag"] = last_config_tag new_releases.append(last_release) parser.set("release", project, last_release["release_tag"]) if not new_releases and not new_projects: print("No new projets or new release detected. Bye!") return content = "" for new_r in new_releases: content += f"""