Skip to content
This repository was archived by the owner on Jul 16, 2025. It is now read-only.

Commit 9abae96

Browse files
committed
merge master into dana/trvis-ci
2 parents 623f34a + ce3f94b commit 9abae96

37 files changed

+1604
-33
lines changed

.github/workflows/ci.yml

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,8 @@ jobs:
4848
pytest --cov
4949
- name: Dogfooding codecov-cli. Use codecov-cli to upload to codecov
5050
run: |
51-
codecovcli --auto-load-params-from githubactions do-upload -t ${{ secrets.CODECOV_TOKEN }} --plugin pycoverage --flag cli3.10
52-
- name: Upload to codecov
53-
run: |
54-
pip install codecov
55-
codecov -t ${{ secrets.CODECOV_TOKEN }} -F python3.10
51+
codecovcli do-upload -t ${{ secrets.CODECOV_TOKEN }} --plugin pycoverage --flag cli3.10
52+
5653
5754
5855
create_release:

.github/workflows/python-package.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,10 @@ jobs:
5050
pytest --cov
5151
- name: Dogfooding codecov-cli. Use codecov-cli to upload to codecov
5252
run: |
53-
codecovcli --auto-load-params-from githubactions do-upload -t ${{ secrets.CODECOV_TOKEN }} --plugin pycoverage --flag cli3.10
54-
- name: Upload to codecov
55-
run: |
56-
pip install codecov
57-
codecov -t ${{ secrets.CODECOV_TOKEN }} -F python3.10
53+
codecovcli do-upload -t ${{ secrets.CODECOV_TOKEN }} --plugin pycoverage --flag cli3.10 --flag python3.10
54+
# - name: Upload to codecov
55+
# run: |
56+
# pip install codecov
57+
# codecov -t ${{ secrets.CODECOV_TOKEN }} -F python3.10
5858

5959

codecov_cli/commands/upload.py

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,10 @@ def _turn_env_vars_into_dict(ctx, params, value):
1818

1919
@click.command()
2020
@click.option(
21+
"-C",
22+
"--sha",
2123
"--commit-sha",
24+
"commit_sha",
2225
help="Commit SHA (with 40 chars)",
2326
cls=CodecovOption,
2427
fallback_field=FallbackFieldEnum.commit_sha,
@@ -37,13 +40,17 @@ def _turn_env_vars_into_dict(ctx, params, value):
3740
show_default="Current working directory",
3841
)
3942
@click.option(
43+
"-s",
44+
"--dir",
4045
"--coverage-files-search-root-folder",
46+
"coverage_files_search_root_folder",
4147
help="Folder where to search for coverage files",
4248
type=click.Path(path_type=pathlib.Path),
4349
default=pathlib.Path.cwd,
4450
show_default="Current Working Directory",
4551
)
4652
@click.option(
53+
"--exclude",
4754
"--coverage-files-search-exclude-folder",
4855
"coverage_files_search_exclude_folders",
4956
help="Folders where to search for coverage files",
@@ -52,6 +59,8 @@ def _turn_env_vars_into_dict(ctx, params, value):
5259
default=None,
5360
)
5461
@click.option(
62+
"-f",
63+
"--file",
5564
"--coverage-files-search-direct-file",
5665
"coverage_files_search_explicitly_listed_files",
5766
help="Explicit files to upload",
@@ -60,12 +69,17 @@ def _turn_env_vars_into_dict(ctx, params, value):
6069
default=None,
6170
)
6271
@click.option(
72+
"-b",
73+
"--build",
6374
"--build-code",
75+
"build_code",
6476
cls=CodecovOption,
77+
help="Specify the build number manually",
6578
fallback_field=FallbackFieldEnum.build_code,
6679
)
6780
@click.option(
6881
"--build-url",
82+
"build_url",
6983
cls=CodecovOption,
7084
help="The URL of the build where this is running",
7185
fallback_field=FallbackFieldEnum.build_url,
@@ -95,20 +109,40 @@ def _turn_env_vars_into_dict(ctx, params, value):
95109
fallback_field=FallbackFieldEnum.branch,
96110
)
97111
@click.option(
112+
"-r",
98113
"--slug",
114+
"slug",
99115
cls=CodecovOption,
100116
fallback_field=FallbackFieldEnum.slug,
101117
help="owner/repo slug used instead of the private repo token in Self-hosted",
102118
envvar="CODECOV_SLUG",
103119
)
104120
@click.option(
121+
"-P",
122+
"--pr",
105123
"--pull-request-number",
124+
"pull_request_number",
106125
help="Specify the pull request number mannually. Used to override pre-existing CI environment variables",
107126
cls=CodecovOption,
108127
fallback_field=FallbackFieldEnum.pull_request_number,
109128
)
110-
@click.option("--env-var", "env_vars", multiple=True, callback=_turn_env_vars_into_dict)
111-
@click.option("--flag", "flags", multiple=True, default=[])
129+
@click.option(
130+
"-e",
131+
"--env",
132+
"--env-var",
133+
"env_vars",
134+
multiple=True,
135+
callback=_turn_env_vars_into_dict,
136+
help="Specify environment variables to be included with this build.",
137+
)
138+
@click.option(
139+
"-F",
140+
"--flag",
141+
"flags",
142+
multiple=True,
143+
default=[],
144+
help="Flag the upload to group coverage metrics. Multiple flags allowed.",
145+
)
112146
@click.option(
113147
"--plugin", "plugin_names", multiple=True, default=["xcode", "gcov", "pycoverage"]
114148
)
Lines changed: 75 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,84 @@
1+
import logging
2+
13
from codecov_cli.helpers.ci_adapters.appveyor_ci import AppveyorCIAdapter
4+
from codecov_cli.helpers.ci_adapters.azure_pipelines import AzurePipelinesCIAdapter
5+
from codecov_cli.helpers.ci_adapters.bitbucket_ci import BitbucketAdapter
6+
from codecov_cli.helpers.ci_adapters.bitrise_ci import BitriseCIAdapter
7+
from codecov_cli.helpers.ci_adapters.buildkite import BuildkiteAdapter
28
from codecov_cli.helpers.ci_adapters.circleci import CircleCICIAdapter
9+
from codecov_cli.helpers.ci_adapters.cirrus_ci import CirrusCIAdapter
10+
from codecov_cli.helpers.ci_adapters.droneci import DroneCIAdapter
311
from codecov_cli.helpers.ci_adapters.github_actions import GithubActionsCIAdapter
412
from codecov_cli.helpers.ci_adapters.gitlab_ci import GitlabCIAdapter
513
from codecov_cli.helpers.ci_adapters.heroku import HerokuCIAdapter
614
from codecov_cli.helpers.ci_adapters.travis_ci import TravisCIAdapter
15+
from codecov_cli.helpers.ci_adapters.jenkins import JenkinsAdapter
16+
from codecov_cli.helpers.ci_adapters.local import LocalAdapter
17+
from codecov_cli.helpers.ci_adapters.teamcity import TeamcityAdapter
18+
from codecov_cli.helpers.ci_adapters.woodpeckerci import WoodpeckerCIAdapter
19+
20+
logger = logging.getLogger("codecovcli")
721

822

9-
def get_ci_adapter(provider_name):
10-
if provider_name == "circleci":
11-
return CircleCICIAdapter()
12-
if provider_name == "githubactions":
13-
return GithubActionsCIAdapter()
14-
if provider_name == "gitlabCI":
15-
return GitlabCIAdapter()
16-
if provider_name == "appveyor":
17-
return AppveyorCIAdapter()
18-
if provider_name == "heroku":
19-
return HerokuCIAdapter()
20-
if provider_name == "travis":
21-
return TravisCIAdapter()
23+
def get_ci_adapter(provider_name: str = None):
24+
if provider_name:
25+
if provider_name == "circleci":
26+
return CircleCICIAdapter()
27+
if provider_name == "githubactions":
28+
return GithubActionsCIAdapter()
29+
if provider_name == "gitlabCI":
30+
return GitlabCIAdapter()
31+
if provider_name == "bitbucket":
32+
return BitbucketAdapter()
33+
if provider_name == "bitrise":
34+
return BitriseCIAdapter()
35+
if provider_name == "appveyor":
36+
return AppveyorCIAdapter()
37+
if provider_name == "local":
38+
return LocalAdapter()
39+
if provider_name == "woodpecker":
40+
return WoodpeckerCIAdapter()
41+
if provider_name == "teamcity":
42+
return TeamcityAdapter()
43+
if provider_name == "heroku":
44+
return HerokuCIAdapter()
45+
if provider_name == "droneci":
46+
return DroneCIAdapter()
47+
if provider_name == "buildkite":
48+
return BuildkiteAdapter()
49+
if provider_name == "azurepipelines":
50+
return AzurePipelinesCIAdapter()
51+
if provider_name == "jenkins":
52+
return JenkinsAdapter()
53+
if provider_name == "cirrusci":
54+
return CirrusCIAdapter()
55+
if provider_name == "travis":
56+
return TravisCIAdapter()
57+
else:
58+
for provider in get_ci_providers_list():
59+
if provider.detect():
60+
logger.info(f"Found ci service {provider._get_service()}")
61+
return provider
2262
return None
63+
64+
65+
def get_ci_providers_list():
66+
return [
67+
CircleCICIAdapter(),
68+
GithubActionsCIAdapter(),
69+
GitlabCIAdapter(),
70+
BitbucketAdapter(),
71+
BitriseCIAdapter(),
72+
AppveyorCIAdapter(),
73+
WoodpeckerCIAdapter(),
74+
HerokuCIAdapter(),
75+
DroneCIAdapter(),
76+
BuildkiteAdapter(),
77+
AzurePipelinesCIAdapter(),
78+
JenkinsAdapter(),
79+
CirrusCIAdapter(),
80+
TeamcityAdapter(),
81+
TravisCIAdapter(),
82+
# local adapter should always be the last one
83+
LocalAdapter(),
84+
]

codecov_cli/helpers/ci_adapters/appveyor_ci.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55

66
class AppveyorCIAdapter(CIAdapterBase):
7+
# https://www.appveyor.com/docs/environment-variables/
8+
9+
def detect(self) -> bool:
10+
return bool(os.getenv("CI")) and bool(os.getenv("APPVEYOR"))
11+
712
def _get_commit_sha(self):
813
return os.getenv("APPVEYOR_PULL_REQUEST_HEAD_COMMIT") or os.getenv(
914
"APPVEYOR_REPO_COMMIT"
@@ -44,3 +49,6 @@ def _get_branch(self):
4449

4550
def _get_service(self):
4651
return "appveyor"
52+
53+
def get_service_name(self):
54+
return "AppVeyor"
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import os
2+
3+
from codecov_cli.helpers.ci_adapters.base import CIAdapterBase
4+
5+
6+
class AzurePipelinesCIAdapter(CIAdapterBase):
7+
# https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml#build-variables-devops-services
8+
9+
def detect(self) -> bool:
10+
return bool(os.getenv("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI"))
11+
12+
def _get_commit_sha(self):
13+
return os.getenv("BUILD_SOURCEVERSION")
14+
15+
def _get_build_url(self):
16+
if os.getenv("SYSTEM_TEAMPROJECT") and os.getenv("BUILD_BUILDID"):
17+
return f'{os.getenv("SYSTEM_TEAMFOUNDATIONCOLLECTIONURI")}{os.getenv("SYSTEM_TEAMPROJECT")}/_build/results?buildId={os.getenv("BUILD_BUILDID")}'
18+
19+
def _get_build_code(self):
20+
return os.getenv("BUILD_BUILDNUMBER")
21+
22+
def _get_job_code(self):
23+
return os.getenv("BUILD_BUILDID")
24+
25+
def _get_pull_request_number(self):
26+
return os.getenv("SYSTEM_PULLREQUEST_PULLREQUESTNUMBER") or os.getenv(
27+
"SYSTEM_PULLREQUEST_PULLREQUESTID"
28+
)
29+
30+
def _get_slug(self):
31+
return os.getenv("BUILD_REPOSITORY_NAME")
32+
33+
def _get_branch(self):
34+
branch = os.getenv("BUILD_SOURCEBRANCH")
35+
if branch:
36+
return branch.replace("refs/heads/", "")
37+
38+
def _get_service(self):
39+
return "azure_pipelines"
40+
41+
def get_service_name(self):
42+
return "AzurePipelines"

codecov_cli/helpers/ci_adapters/bitbucket_ci.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55

66
class BitbucketAdapter(CIAdapterBase):
7+
# https://support.atlassian.com/bitbucket-cloud/docs/variables-and-secrets/
8+
9+
def detect(self) -> bool:
10+
return bool(os.getenv("CI")) and bool(os.getenv("BITBUCKET_BUILD_NUMBER"))
11+
712
def _get_commit_sha(self):
813
commit = os.getenv("BITBUCKET_COMMIT")
914

@@ -32,3 +37,6 @@ def _get_branch(self):
3237

3338
def _get_service(self):
3439
return "bitbucket"
40+
41+
def get_service_name(self):
42+
return "Bitbucket"

codecov_cli/helpers/ci_adapters/bitrise_ci.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44

55

66
class BitriseCIAdapter(CIAdapterBase):
7+
# https://devcenter.bitrise.io/en/references/available-environment-variables.html
8+
9+
def detect(self) -> bool:
10+
return bool(os.getenv("CI")) and bool(os.getenv("BITRISE_IO"))
11+
712
def _get_commit_sha(self):
813
return os.getenv("GIT_CLONE_COMMIT_HASH")
914

@@ -27,3 +32,6 @@ def _get_branch(self):
2732

2833
def _get_service(self):
2934
return "bitrise"
35+
36+
def get_service_name(self):
37+
return "Bitrise"
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
import os
2+
3+
from codecov_cli.helpers.ci_adapters.base import CIAdapterBase
4+
5+
6+
class BuildkiteAdapter(CIAdapterBase):
7+
# https://buildkite.com/docs/pipelines/environment-variables
8+
9+
def detect(self) -> bool:
10+
return bool(os.getenv("BUILDKITE"))
11+
12+
def _get_branch(self):
13+
return os.getenv("BUILDKITE_BRANCH")
14+
15+
def _get_build_code(self):
16+
return os.getenv("BUILDKITE_BUILD_NUMBER")
17+
18+
def _get_build_url(self):
19+
return os.getenv("BUILDKITE_BUILD_URL")
20+
21+
def _get_commit_sha(self):
22+
return os.getenv("BUILDKITE_COMMIT")
23+
24+
def _get_slug(self):
25+
org = os.getenv("BUILDKITE_ORGANIZATION_SLUG")
26+
repo = os.getenv("BUILDKITE_PIPELINE_SLUG")
27+
if org and repo:
28+
return f"{org}/{repo}"
29+
return None
30+
31+
def _get_service(self):
32+
return "buildkite"
33+
34+
def _get_pull_request_number(self):
35+
pr_number = os.getenv("BUILDKITE_PULL_REQUEST")
36+
# The number of the pull request, if this branch is a pull request.
37+
if pr_number != "false":
38+
return pr_number
39+
return None
40+
41+
def _get_job_code(self):
42+
return os.getenv("BUILDKITE_JOB_ID")
43+
44+
def get_service_name(self):
45+
return "BuildKite"

codecov_cli/helpers/ci_adapters/circleci.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
class CircleCICIAdapter(CIAdapterBase):
77
# https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables
8+
def detect(self) -> bool:
9+
return bool(os.getenv("CI")) and bool(os.getenv("CIRCLECI"))
810

911
def _get_commit_sha(self):
1012
return os.getenv("CIRCLE_SHA1")
@@ -40,3 +42,6 @@ def _get_branch(self):
4042

4143
def _get_service(self):
4244
return "circleci"
45+
46+
def get_service_name(self):
47+
return "CircleCI"

0 commit comments

Comments
 (0)