Share CI platform detection

This commit is contained in:
Joe Rickerby
2020-11-23 21:00:22 +00:00
parent 95fecc2d58
commit f8a4fbe42d
3 changed files with 59 additions and 21 deletions
+9 -13
View File
@@ -21,6 +21,7 @@ from cibuildwheel.util import (
BuildSelector, BuildSelector,
DependencyConstraints, DependencyConstraints,
Unbuffered, Unbuffered,
detect_ci_provider,
resources_dir, 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) 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: def main() -> None:
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description='Build wheels for all the platforms.', description='Build wheels for all the platforms.',
@@ -96,13 +91,14 @@ def main() -> None:
if args.platform != 'auto': if args.platform != 'auto':
platform = args.platform platform = args.platform
else: 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 ci_provider = detect_ci_provider()
if not ci: if ci_provider is None:
print('cibuildwheel: Unable to detect platform. cibuildwheel should run on your CI server, ' print(textwrap.dedent('''
'Travis CI, AppVeyor, Azure Pipelines, GitHub Actions and CircleCI are supported. You ' cibuildwheel: Unable to detect platform. cibuildwheel should run on your CI server;
'can run on your development machine or other CI providers using the --platform argument. ' Travis CI, AppVeyor, Azure Pipelines, GitHub Actions, CircleCI, and Gitlab are
'Check --help output for more information.', supported. You can run on your development machine or other CI providers using the
file=sys.stderr) --platform argument. Check --help output for more information.
'''), file=sys.stderr)
exit(2) exit(2)
if sys.platform.startswith('linux'): if sys.platform.startswith('linux'):
platform = 'linux' platform = 'linux'
+8 -4
View File
@@ -5,6 +5,8 @@ import sys
import time import time
from typing import Optional, Union from typing import Optional, Union
from cibuildwheel.util import CIProvider, detect_ci_provider
DEFAULT_FOLD_PATTERN = ('{name}', '') DEFAULT_FOLD_PATTERN = ('{name}', '')
FOLD_PATTERNS = { FOLD_PATTERNS = {
'azure': ('##[group]{name}', '##[endgroup]'), 'azure': ('##[group]{name}', '##[endgroup]'),
@@ -41,19 +43,21 @@ class Logger:
self.unicode_enabled = file_supports_unicode(sys.stdout) 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.fold_mode = 'azure'
self.colors_enabled = True self.colors_enabled = True
elif 'GITHUB_ACTIONS' in os.environ: elif ci_provider == CIProvider.github_actions:
self.fold_mode = 'github' self.fold_mode = 'github'
self.colors_enabled = True self.colors_enabled = True
elif 'TRAVIS' in os.environ: elif ci_provider == CIProvider.travis_ci:
self.fold_mode = 'travis' self.fold_mode = 'travis'
self.colors_enabled = True self.colors_enabled = True
elif 'APPVEYOR' in os.environ: elif ci_provider == CIProvider.appveyor:
self.fold_mode = 'disabled' self.fold_mode = 'disabled'
self.colors_enabled = True self.colors_enabled = True
+42 -4
View File
@@ -1,14 +1,15 @@
import os import os
import textwrap
import certifi
import urllib.request
import ssl import ssl
import textwrap
import urllib.request
from enum import Enum
from fnmatch import fnmatch from fnmatch import fnmatch
from pathlib import Path from pathlib import Path
from time import sleep from time import sleep
from typing import Dict, List, NamedTuple, Optional, Union from typing import Dict, List, NamedTuple, Optional, Union
import certifi
from .environment import ParsedEnvironment from .environment import ParsedEnvironment
@@ -155,3 +156,40 @@ class NonPlatformWheelError(Exception):
''') ''')
super().__init__(message) 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