mirror of
https://github.com/certbot/certbot.git
synced 2026-01-26 07:41:33 +03:00
Fixes #8071 and fixes https://github.com/certbot/certbot/issues/8110. This PR migrates every job from Travis in Azure Pipeline. This PR essentially converts the Travis jobs into Azure Pipeline with a complete iso-fonctionality (or I made a mistake). The jobs are added in the relevant existing pipelines (`main`, `nightly`, `advanced-test`, `release`). A global refactoring thanks to the templating system is done to reduce greatly the verbosity of the pipeline descriptions. A specific feature (not present in Travis) is added: the stage `On_Failure`. Using directly the Mattermost API, it allows to notify pipeline failure in a Mattermost channel with a link to the failed pipelines without the need to authenticate to Microsoft. See https://github.com/certbot/certbot/pull/8098#issuecomment-649873641 for the post merge actions to do at the end of this work.
126 lines
4.5 KiB
Python
Executable File
126 lines
4.5 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
from __future__ import print_function
|
|
|
|
import os
|
|
import shutil
|
|
import subprocess
|
|
import sys
|
|
import tempfile
|
|
|
|
try:
|
|
from urllib.request import urlretrieve
|
|
except ImportError:
|
|
from urllib import urlretrieve
|
|
|
|
def find_repo_path():
|
|
return os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
|
|
|
|
# We do not use filecmp.cmp to take advantage of universal newlines
|
|
# handling in open() for Python 3.x and be insensitive to CRLF/LF when run on Windows.
|
|
# As a consequence, this function will not work correctly if executed by Python 2.x on Windows.
|
|
# But it will work correctly on Linux for any version, because every file tested will be LF.
|
|
def compare_files(path_1, path_2):
|
|
l1 = l2 = True
|
|
with open(path_1, 'r') as f1, open(path_2, 'r') as f2:
|
|
line = 1
|
|
while l1 and l2:
|
|
line += 1
|
|
l1 = f1.readline()
|
|
l2 = f2.readline()
|
|
if l1 != l2:
|
|
print('---')
|
|
print((
|
|
'While comparing {0} (1) and {1} (2), a difference was found at line {2}:'
|
|
.format(os.path.basename(path_1), os.path.basename(path_2), line)))
|
|
print('(1): {0}'.format(repr(l1)))
|
|
print('(2): {0}'.format(repr(l2)))
|
|
print('---')
|
|
return False
|
|
|
|
return True
|
|
|
|
def validate_scripts_content(repo_path, temp_cwd):
|
|
errors = False
|
|
|
|
if not compare_files(
|
|
os.path.join(repo_path, 'certbot-auto'),
|
|
os.path.join(repo_path, 'letsencrypt-auto')):
|
|
print('Root certbot-auto and letsencrypt-auto differ.')
|
|
errors = True
|
|
else:
|
|
shutil.copyfile(
|
|
os.path.join(repo_path, 'certbot-auto'),
|
|
os.path.join(temp_cwd, 'local-auto'))
|
|
shutil.copy(os.path.normpath(os.path.join(
|
|
repo_path,
|
|
'letsencrypt-auto-source/pieces/fetch.py')), temp_cwd)
|
|
|
|
# Compare file against current version in the target branch
|
|
branch = os.environ.get('TARGET_BRANCH', 'master')
|
|
url = (
|
|
'https://raw.githubusercontent.com/certbot/certbot/{0}/certbot-auto'
|
|
.format(branch))
|
|
urlretrieve(url, os.path.join(temp_cwd, 'certbot-auto'))
|
|
|
|
if compare_files(
|
|
os.path.join(temp_cwd, 'certbot-auto'),
|
|
os.path.join(temp_cwd, 'local-auto')):
|
|
print('Root *-auto were unchanged')
|
|
else:
|
|
# Compare file against the latest released version
|
|
latest_version = subprocess.check_output(
|
|
[sys.executable, 'fetch.py', '--latest-version'], cwd=temp_cwd)
|
|
subprocess.check_call(
|
|
[sys.executable, 'fetch.py', '--le-auto-script',
|
|
'v{0}'.format(latest_version.decode().strip())], cwd=temp_cwd)
|
|
if compare_files(
|
|
os.path.join(temp_cwd, 'letsencrypt-auto'),
|
|
os.path.join(temp_cwd, 'local-auto')):
|
|
print('Root *-auto were updated to the latest version.')
|
|
else:
|
|
print('Root *-auto have unexpected changes.')
|
|
errors = True
|
|
|
|
return errors
|
|
|
|
def main():
|
|
repo_path = find_repo_path()
|
|
temp_cwd = tempfile.mkdtemp()
|
|
errors = False
|
|
|
|
try:
|
|
errors = validate_scripts_content(repo_path, temp_cwd)
|
|
|
|
shutil.copyfile(
|
|
os.path.normpath(os.path.join(repo_path, 'letsencrypt-auto-source/letsencrypt-auto')),
|
|
os.path.join(temp_cwd, 'original-lea')
|
|
)
|
|
subprocess.check_call([sys.executable, os.path.normpath(os.path.join(
|
|
repo_path, 'letsencrypt-auto-source/build.py'))])
|
|
shutil.copyfile(
|
|
os.path.normpath(os.path.join(repo_path, 'letsencrypt-auto-source/letsencrypt-auto')),
|
|
os.path.join(temp_cwd, 'build-lea')
|
|
)
|
|
shutil.copyfile(
|
|
os.path.join(temp_cwd, 'original-lea'),
|
|
os.path.normpath(os.path.join(repo_path, 'letsencrypt-auto-source/letsencrypt-auto'))
|
|
)
|
|
|
|
if not compare_files(
|
|
os.path.join(temp_cwd, 'original-lea'),
|
|
os.path.join(temp_cwd, 'build-lea')):
|
|
print('Script letsencrypt-auto-source/letsencrypt-auto '
|
|
'doesn\'t match output of build.py.')
|
|
errors = True
|
|
else:
|
|
print('Script letsencrypt-auto-source/letsencrypt-auto matches output of build.py.')
|
|
finally:
|
|
shutil.rmtree(temp_cwd)
|
|
|
|
return errors
|
|
|
|
if __name__ == '__main__':
|
|
if main():
|
|
sys.exit(1)
|