diff --git a/.gitignore b/.gitignore
index b0b83c5..79d2d87 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 *.egg
 *.egg-info
 *.pyc
+.cache
 .coverage
 .DS_Store
 .tox
diff --git a/codecov/__init__.py b/codecov/__init__.py
index 87cf47f..955adc3 100644
--- a/codecov/__init__.py
+++ b/codecov/__init__.py
@@ -276,10 +276,10 @@ def main(*argv, **kwargs):
         if os.getenv('JENKINS_URL'):
             # https://wiki.jenkins-ci.org/display/JENKINS/Building+a+software+project
             # https://wiki.jenkins-ci.org/display/JENKINS/GitHub+pull+request+builder+plugin#GitHubpullrequestbuilderplugin-EnvironmentVariables
-            query.update(dict(branch=os.getenv('ghprbSourceBranch') or os.getenv('GIT_BRANCH'),
+            query.update(dict(branch=os.getenv('ghprbSourceBranch') or os.getenv('GIT_BRANCH') or os.getenv('BRANCH_NAME'),
                               service='jenkins',
                               commit=os.getenv('ghprbActualCommit') or os.getenv('GIT_COMMIT'),
-                              pr=os.getenv('ghprbPullId', 'false'),
+                              pr=os.getenv('ghprbPullId') or os.getenv('CHANGE_ID'),
                               build=os.getenv('BUILD_NUMBER'),
                               build_url=os.getenv('BUILD_URL')))
             root = os.getenv('WORKSPACE') or root

Add support for Jenkins Blue Ocean
See codecov/codecov-node#55
diff --git a/tests/test.py b/tests/test.py
index cf54afe..2b7b98d 100644
--- a/tests/test.py
+++ b/tests/test.py
@@ -46,7 +46,7 @@ class TestUploader(unittest.TestCase):
                     "APPVEYOR_BUILD_VERSION", "APPVEYOR_JOB_ID", "APPVEYOR_REPO_NAME", "APPVEYOR_REPO_COMMIT", "WERCKER_GIT_BRANCH",
                     "WERCKER_MAIN_PIPELINE_STARTED", "WERCKER_GIT_OWNER", "WERCKER_GIT_REPOSITORY",
                     "CI_BUILD_REF_NAME", "CI_BUILD_ID", "CI_BUILD_REPO", "CI_PROJECT_DIR", "CI_BUILD_REF", "CI_SERVER_NAME",
-                    "ghprbActualCommit", "ghprbSourceBranch", "ghprbPullId", "WERCKER_GIT_COMMIT"):
+                    "ghprbActualCommit", "ghprbSourceBranch", "ghprbPullId", "WERCKER_GIT_COMMIT", "CHANGE_ID"):
             os.environ[key] = ""
 
     def tearDown(self):
@@ -339,6 +339,23 @@ class TestUploader(unittest.TestCase):
         self.assertEqual(res['query']['branch'], 'master')
         self.assertEqual(res['codecov'].token, 'token')
 
+    def test_ci_jenkins_blue_ocean(self):
+        self.set_env(JENKINS_URL='https://....',
+                     BUILD_URL='https://....',
+                     BRANCH_NAME='master',
+                     CHANGE_ID='1',
+                     BUILD_NUMBER='41',
+                     CODECOV_TOKEN='token')
+        self.fake_report()
+        res = self.run_cli()
+        self.assertEqual(res['query']['service'], 'jenkins')
+        self.assertEqual(res['query']['commit'], codecov.check_output(("git", "rev-parse", "HEAD")))
+        self.assertEqual(res['query']['build'], '41')
+        self.assertEqual(res['query']['build_url'], 'https://....')
+        self.assertEqual(res['query']['pr'], '1')
+        self.assertEqual(res['query']['branch'], 'master')
+        self.assertEqual(res['codecov'].token, 'token')
+
     def test_ci_travis(self):
         self.set_env(TRAVIS="true",
                      TRAVIS_BRANCH="master",

pip install -e .
parse_log_pytest
requirements.txt
pytest
3.4
tests/requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
certifi==2021.5.30
charset-normalizer==2.0.12
-e git+https://github.com/codecov/codecov-python.git@7b292778b8e888ee181c9537cdbfa9eff2acf25c#egg=codecov
coverage==6.2
ddt==1.7.2
funcsigs==1.0.2
idna==3.10
importlib-metadata==4.8.3
iniconfig==1.1.1
linecache2==1.0.0
mock==5.2.0
packaging==21.3
pluggy==1.0.0
py==1.11.0
pyparsing==3.1.4
pytest==7.0.1
pytest-cov==4.0.0
requests==2.27.1
six==1.17.0
tomli==1.2.3
traceback2==1.4.0
typing_extensions==4.1.1
unittest2==1.1.0
urllib3==1.26.20
zipp==3.6.0

name: codecov-python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - argparse==1.4.0
      - attrs==22.2.0
      - charset-normalizer==2.0.12
      - coverage==6.2
      - ddt==1.7.2
      - funcsigs==1.0.2
      - idna==3.10
      - importlib-metadata==4.8.3
      - iniconfig==1.1.1
      - linecache2==1.0.0
      - mock==5.2.0
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytest-cov==4.0.0
      - requests==2.27.1
      - six==1.17.0
      - tomli==1.2.3
      - traceback2==1.4.0
      - typing-extensions==4.1.1
      - unittest2==1.1.0
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/codecov-python

tests/test.py::TestUploader::test_ci_jenkins_blue_ocean
tests/test.py::TestUploader::test_bowerrc tests/test.py::TestUploader::test_bowerrc_none tests/test.py::TestUploader::test_ci_appveyor tests/test.py::TestUploader::test_ci_buildkite tests/test.py::TestUploader::test_ci_circleci tests/test.py::TestUploader::test_ci_codeship tests/test.py::TestUploader::test_ci_drone tests/test.py::TestUploader::test_ci_gitlab tests/test.py::TestUploader::test_ci_jenkins tests/test.py::TestUploader::test_ci_jenkins_env tests/test.py::TestUploader::test_ci_magnum tests/test.py::TestUploader::test_ci_none tests/test.py::TestUploader::test_ci_semaphore tests/test.py::TestUploader::test_ci_shippable tests/test.py::TestUploader::test_ci_snap tests/test.py::TestUploader::test_ci_travis tests/test.py::TestUploader::test_ci_wercker tests/test.py::TestUploader::test_command tests/test.py::TestUploader::test_disable_detect tests/test.py::TestUploader::test_disable_search tests/test.py::TestUploader::test_discovers tests/test.py::TestUploader::test_exits_0 tests/test.py::TestUploader::test_exits_1 tests/test.py::TestUploader::test_ignore_report_1__coverage_worker10 tests/test.py::TestUploader::test_ignore_report_2_coverage_jade tests/test.py::TestUploader::test_ignore_report_3_include_lst tests/test.py::TestUploader::test_ignore_report_4_inputFiles_lst tests/test.py::TestUploader::test_ignore_report_5_createdFiles_lst tests/test.py::TestUploader::test_ignore_report_6_scoverage_measurements_blackandwhite_xml tests/test.py::TestUploader::test_ignore_report_7_test_hello_coverage_txt tests/test.py::TestUploader::test_ignore_report_8_conftest_blackwhite_c_gcov tests/test.py::TestUploader::test_ignored_path_01_vendor tests/test.py::TestUploader::test_ignored_path_02_node_modules tests/test.py::TestUploader::test_ignored_path_03_js_generated_coverage tests/test.py::TestUploader::test_ignored_path_04___pycache__ tests/test.py::TestUploader::test_ignored_path_05_coverage_instrumented tests/test.py::TestUploader::test_ignored_path_06_build_lib tests/test.py::TestUploader::test_ignored_path_07_htmlcov tests/test.py::TestUploader::test_ignored_path_08__egg_info tests/test.py::TestUploader::test_ignored_path_09__git tests/test.py::TestUploader::test_ignored_path_10__tox tests/test.py::TestUploader::test_ignored_path_11_venv tests/test.py::TestUploader::test_ignored_path_12__venv_python_2_7 tests/test.py::TestUploader::test_include_env tests/test.py::TestUploader::test_is_report_01_coverage_xml tests/test.py::TestUploader::test_is_report_02_jacoco_xml tests/test.py::TestUploader::test_is_report_03_jacocoTestResults_xml tests/test.py::TestUploader::test_is_report_04_coverage_txt tests/test.py::TestUploader::test_is_report_05_gcov_lst tests/test.py::TestUploader::test_is_report_06_cov_gcov tests/test.py::TestUploader::test_is_report_07_info_lcov tests/test.py::TestUploader::test_is_report_08_clover_xml tests/test.py::TestUploader::test_is_report_09_cobertura_xml tests/test.py::TestUploader::test_is_report_10_luacov_report_out tests/test.py::TestUploader::test_is_report_11_gcov_info tests/test.py::TestUploader::test_is_report_12_nosetests_xml tests/test.py::TestUploader::test_none_found tests/test.py::TestUploader::test_not_jacoco tests/test.py::TestUploader::test_read_token_file tests/test.py::TestUploader::test_require_branch_1 tests/test.py::TestUploader::test_returns_none tests/test.py::TestUploader::test_run_coverage_fails tests/test.py::TestUploader::test_send tests/test.py::TestUploader::test_send_error
.gitignore codecov/__init__.py
.gitignore codecov/__init__.py