diff --git a/cibuildwheel/__main__.py b/cibuildwheel/__main__.py index 4e25befa..e171ab20 100644 --- a/cibuildwheel/__main__.py +++ b/cibuildwheel/__main__.py @@ -21,6 +21,7 @@ from cibuildwheel.util import ( BuildSelector, DependencyConstraints, Unbuffered, + detect_ci_provider, resources_dir, ) @@ -47,12 +48,6 @@ def get_option_from_environment(option_name: str, platform: Optional[str] = None return os.environ.get(option_name, default) -def strtobool(val: str) -> bool: - if val.lower() in ('y', 'yes', 't', 'true', 'on', '1'): - return True - return False - - def main() -> None: parser = argparse.ArgumentParser( description='Build wheels for all the platforms.', @@ -96,13 +91,14 @@ def main() -> None: if args.platform != 'auto': platform = args.platform else: - ci = strtobool(os.environ.get('CI', 'false')) or 'BITRISE_BUILD_NUMBER' in os.environ or 'AZURE_HTTP_USER_AGENT' in os.environ or 'GITHUB_WORKFLOW' in os.environ - if not ci: - print('cibuildwheel: Unable to detect platform. cibuildwheel should run on your CI server, ' - 'Travis CI, AppVeyor, Azure Pipelines, GitHub Actions and CircleCI are supported. You ' - 'can run on your development machine or other CI providers using the --platform argument. ' - 'Check --help output for more information.', - file=sys.stderr) + ci_provider = detect_ci_provider() + if ci_provider is None: + print(textwrap.dedent(''' + cibuildwheel: Unable to detect platform. cibuildwheel should run on your CI server; + Travis CI, AppVeyor, Azure Pipelines, GitHub Actions, CircleCI, and Gitlab are + supported. You can run on your development machine or other CI providers using the + --platform argument. Check --help output for more information. + '''), file=sys.stderr) exit(2) if sys.platform.startswith('linux'): platform = 'linux' diff --git a/cibuildwheel/logger.py b/cibuildwheel/logger.py index d3f86077..a8289e76 100644 --- a/cibuildwheel/logger.py +++ b/cibuildwheel/logger.py @@ -5,6 +5,8 @@ import sys import time from typing import Optional, Union +from cibuildwheel.util import CIProvider, detect_ci_provider + DEFAULT_FOLD_PATTERN = ('{name}', '') FOLD_PATTERNS = { 'azure': ('##[group]{name}', '##[endgroup]'), @@ -41,19 +43,21 @@ class Logger: self.unicode_enabled = file_supports_unicode(sys.stdout) - if 'AZURE_HTTP_USER_AGENT' in os.environ: + ci_provider = detect_ci_provider() + + if ci_provider == CIProvider.azure_pipelines: self.fold_mode = 'azure' self.colors_enabled = True - elif 'GITHUB_ACTIONS' in os.environ: + elif ci_provider == CIProvider.github_actions: self.fold_mode = 'github' self.colors_enabled = True - elif 'TRAVIS' in os.environ: + elif ci_provider == CIProvider.travis_ci: self.fold_mode = 'travis' self.colors_enabled = True - elif 'APPVEYOR' in os.environ: + elif ci_provider == CIProvider.appveyor: self.fold_mode = 'disabled' self.colors_enabled = True diff --git a/cibuildwheel/util.py b/cibuildwheel/util.py index 4f6d005d..9cd2187e 100644 --- a/cibuildwheel/util.py +++ b/cibuildwheel/util.py @@ -1,14 +1,15 @@ import os -import textwrap -import certifi -import urllib.request import ssl +import textwrap +import urllib.request +from enum import Enum from fnmatch import fnmatch from pathlib import Path from time import sleep - from typing import Dict, List, NamedTuple, Optional, Union +import certifi + from .environment import ParsedEnvironment @@ -155,3 +156,40 @@ class NonPlatformWheelError(Exception): ''') super().__init__(message) + + +def strtobool(val: str) -> bool: + if val.lower() in ('y', 'yes', 't', 'true', 'on', '1'): + return True + return False + + +class CIProvider(str, Enum): + travis_ci = 'travis' + appveyor = 'appveyor' + circle_ci = 'circle_ci' + azure_pipelines = 'azure_pipelines' + github_actions = 'github_actions' + gitlab = 'gitlab' + other = 'other' + + +def detect_ci_provider() -> Optional[CIProvider]: + if 'TRAVIS' in os.environ: + return CIProvider.travis_ci + elif 'APPVEYOR' in os.environ: + return CIProvider.appveyor + elif 'CIRCLECI' in os.environ: + return CIProvider.circle_ci + elif 'AZURE_HTTP_USER_AGENT' in os.environ: + return CIProvider.azure_pipelines + elif 'GITHUB_ACTIONS' in os.environ: + return CIProvider.github_actions + elif 'GITLAB_CI' in os.environ: + return CIProvider.gitlab + elif strtobool(os.environ.get('CI', 'false')): + return CIProvider.other + else: + return None + +