Source code for semantic_release.ci_checks
"""CI Checks
"""
import os
from typing import Callable
from semantic_release.errors import CiVerificationError
[docs]def checker(func: Callable) -> Callable:
"""
A decorator that will convert AssertionErrors into
CiVerificationError.
:param func: A function that will raise AssertionError
:return: The given function wrapped to raise a CiVerificationError on AssertionError
"""
def func_wrapper(*args, **kwargs):
try:
func(*args, **kwargs)
return True
except AssertionError:
raise CiVerificationError(
"The verification check for the environment did not pass."
)
return func_wrapper
[docs]@checker
def travis(branch: str):
"""
Performs necessary checks to ensure that the travis build is one
that should create releases.
:param branch: The branch the environment should be running against.
"""
assert os.environ.get("TRAVIS_BRANCH") == branch
assert os.environ.get("TRAVIS_PULL_REQUEST") == "false"
[docs]@checker
def semaphore(branch: str):
"""
Performs necessary checks to ensure that the semaphore build is successful,
on the correct branch and not a pull-request.
:param branch: The branch the environment should be running against.
"""
assert os.environ.get("BRANCH_NAME") == branch
assert os.environ.get("PULL_REQUEST_NUMBER") is None
assert os.environ.get("SEMAPHORE_THREAD_RESULT") != "failed"
[docs]@checker
def frigg(branch: str):
"""
Performs necessary checks to ensure that the frigg build is one
that should create releases.
:param branch: The branch the environment should be running against.
"""
assert os.environ.get("FRIGG_BUILD_BRANCH") == branch
assert not os.environ.get("FRIGG_PULL_REQUEST")
[docs]@checker
def circle(branch: str):
"""
Performs necessary checks to ensure that the circle build is one
that should create releases.
:param branch: The branch the environment should be running against.
"""
assert os.environ.get("CIRCLE_BRANCH") == branch
assert not os.environ.get("CI_PULL_REQUEST")
[docs]@checker
def gitlab(branch: str):
"""
Performs necessary checks to ensure that the gitlab build is one
that should create releases.
:param branch: The branch the environment should be running against.
"""
assert os.environ.get("CI_COMMIT_REF_NAME") == branch
# TODO - don't think there's a merge request indicator variable
[docs]@checker
def bitbucket(branch: str):
"""
Performs necessary checks to ensure that the bitbucket build is one
that should create releases.
:param branch: The branch the environment should be running against.
"""
assert os.environ.get("BITBUCKET_BRANCH") == branch
assert not os.environ.get("BITBUCKET_PR_ID")
[docs]@checker
def jenkins(branch: str):
"""
Performs necessary checks to ensure that the jenkins build is one
that should create releases.
:param branch: The branch the environment should be running against.
"""
branch_name = os.environ.get("BRANCH_NAME") or os.environ.get("GIT_BRANCH")
assert os.environ.get("JENKINS_URL") is not None
assert branch_name == branch
assert not os.environ.get("CHANGE_ID") # pull request id
[docs]def check(branch: str = "master"):
"""
Detects the current CI environment, if any, and performs necessary
environment checks.
:param branch: The branch that should be the current branch.
"""
if os.environ.get("TRAVIS") == "true":
travis(branch)
elif os.environ.get("SEMAPHORE") == "true":
semaphore(branch)
elif os.environ.get("FRIGG") == "true":
frigg(branch)
elif os.environ.get("CIRCLECI") == "true":
circle(branch)
elif os.environ.get("GITLAB_CI") == "true":
gitlab(branch)
elif os.environ.get("JENKINS_URL") is not None:
jenkins(branch)
elif "BITBUCKET_BUILD_NUMBER" in os.environ:
bitbucket(branch)