The Code Climate API was disabled on July 18, 2025.Any remaining attempts to upload coverage via the old cc-test-reporter will fail your CI builds. Remove (or comment out) any references to cc-test-reporter in your CI scripts and follow the steps below to upload to Qlty Cloud instead.
This guide is for users who have previously set up code coverage reporting to Code Climate Quality and are now migrating to Qlty Cloud.
The new Qlty Cloud app offers many advantages over Code Climate Quality for code coverage. To help make coverage setup easier, we offer four new features:
Support for OpenID Connect (OIDC) with GitHub Actions for tokenless coverage uploads
Workspace-level coverage tokens
Reusable GitHub Action and CircleCI Orb tools
Server-side coverage coverage merging
Once coverage is set up, Qlty Cloud supports all of the code coverage reporting features of Code Climate Quality like:
Coverage Tags for tracking data for e.g. tracking unit test coverage separately from integration test coverage
In-app views for reviewing coverage on Pull Request diffs (No broweser extension required)
Additional flexibility when configuring coverage gates (pass/fail commit statuses)
Migrating a Ruby/RSpec repository?Previously SimpleCov detected the use of Code Climate and auto-initialized SimpleCov.This is no longer the case. Using Qlty requires explicit SimpleCov configuration.See our Ruby coverage docs for more information on recommended configuration.
Qlty Cloud supports three ways to authenticate code coverage uploads from your CI system:
OpenID Connect (OIDC) with GitHub Actions
Workspace-level coverage tokens
Project-level coverage tokens
If you are using GitHub Actions and are able to use OIDC, we recommend that approach as it is the most secure and requires no management of long-lived coverage tokens.If you are not using GitHub Actions, or are unable to use OIDC, you can use a workspace-level coverage token. This is a long-lived token that is scoped to your entire organization and can be used for all repositories within that organization.For situations were neight of those options are available, you can use a project-level coverage token. This is a long-lived token that is scoped to a single repository and can be used for that repository only.
If you are not using OIDC, you will need to obtain a coverage token from Qlty Cloud.Qlty Cloud uses GitHub for both authentication and authorization checks. Therefore, any user with administrator permissions on a GitHub organization is automatically able to access the corresponding workspace on Qlty Cloud.
Login to Qlty via GitHub OAuth (as a GitHub Admin)
Navigate to Workspace Settings > Code Coverage (e.g. https://qlty.sh/gh/org-name/settings/coverage)
Step 2. Store the coverage token as a CI secret (if not using OIDC)
If you are using OIDC, you can skip this step.A coverage token only provides the ability to upload code coverage data to Qlty Cloud and does not provide access to read any data or administer any settings. Even still, it should be treated as a credential and stored securely within your CI system, as explained hereThe specifics for how to store a secret at the organization level and make it available to all repositories vary by provider:
This guide assumes that your CI scripts are already generating code coverage data from the execution of your automated unit tests. The method to generate this data and the output format varies by programming language and testing tools.Once you have code coverage data being generated in one of our supported formats, continue with the steps below. Generally, the process is to add an additional step after the code coverage data has been generated and written to disk on the CI runner.
If you are using a workspace or project coverage token instead of OIDC, remove the oidc: true line and add token: ${{ secrets.QLTY_COVERAGE_TOKEN }} to the with block:
With other CI providers, you will install the Qlty CLI and run the qlty coverage publish command, you will also need to provide the commit SHA and branch name explicitly:
# Assumes $QLTY_COVERAGE_TOKEN is set in the environmentcurl https://qlty.sh | shqlty coverage publish --override-commit-sha COMMIT_SHA --override-branch BRANCH_NAME COVERAGE_FILE_PATH
The Qlty CLI is able to auto-detect workflow-related metadata from the environment variables set by your CI provider on the following platforms:
Buildkite
Travis CI
CodeFresh
Semaphore
If you are using another CI provider not in this list, please contact us and we can add support for your system.
After updating the CI script, trigger a build (of the branch including your updated script) and ensure it completes successfully. Check the output for the upload step and verify that no errors are occurring on the CI side during the upload process.
On Qlty Cloud, navigate to your Project Settings > Code Coverage page (example: https://qlty.sh/gh/org-name/projects/repo-name/settings/coverage).
Your uploaded coverage report should appear in the table at the bottom of the page
Click on the commit SHA to view your report details
Verify that the report details match your expectations (commit SHA, branch name, etc.)
Step 5. Merge your CI script changes into your main branch
Now that the coverage uploads are happening successfully for your branch, merge the branch into your default branch (e.g. main) and run a build.Ensure that the build completes successfully (with no errors from the coverage upload step), and validate the coverage upload in your Project Settings.Once Qlty receives a valid coverage report for your default branch, your coverage info will be displayed in your project’s Overview page. You’ll also see file-level and directory-level coverage on your project’s Issues tab.
Step 6. Remove coverage uploads to Code Climate Quality
Once you’ve setup coverage reporting (and enabled coverage commit statuses) as desired, remove references to the old Code Climate test reporter within your CI script. The Code Climate API will be deactivated on July 18th. At this point, any references to cc-test-reporter will result in failed CI builds.
Steps 3 through 6 need to be repeated for each repository that you are migrating to Qlty Cloud. We have found that with a good prompt for an AI coding assistant, the process can be completed quickly.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Qlty Docs","colors":{"primary":"#08B2B7","light":"#66FAEC","dark":"#08B2B7"},"logo":{"light":"https://mintcdn.com/qltysoftware/WE5EjhygR2JGFw2L/assets/qlty_logo_black.svg?fit=max\u0026auto=format\u0026n=WE5EjhygR2JGFw2L\u0026q=85\u0026s=953dc5550d8d7b301bab57c551c2e095","dark":"https://mintcdn.com/qltysoftware/WE5EjhygR2JGFw2L/assets/qlty_logo_light.svg?fit=max\u0026auto=format\u0026n=WE5EjhygR2JGFw2L\u0026q=85\u0026s=314c810c7988344145e96a72d93a64e1"},"favicon":"https://mintcdn.com/qltysoftware/WE5EjhygR2JGFw2L/assets/favicon.png?fit=max\u0026auto=format\u0026n=WE5EjhygR2JGFw2L\u0026q=85\u0026s=c6b170f43aafed94940cea1b71d16fcf","background":{"color":{"light":"#f6f6f6","dark":"#000000"}},"navbar":{"links":[{"href":"/cloud/support","label":"Get Support"}],"primary":{"type":"button","label":"Back to App","href":"https://qlty.sh/dashboard"}},"search":{"prompt":"Search documentation..."},"fonts":{"heading":{"family":"Aeonik","weight":600,"source":"assets/Aeonik-Bold.woff2","format":"woff2"},"body":{"family":"Inter"}},"styling":{"codeblocks":"system","latex":true},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"qltysoftware","hasAudioNarration":false,"actualSubdomain":"qltysoftware","customDomains":["docs.qlty.sh"],"gitSource":{"type":"github","owner":"qltysh","repo":"cloud","deployBranch":"main","contentDirectory":"mintlify-docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae207648a46f6fe5a2330a3","collectionId":"108aa2b2-6e9e-47cb-9117-f3fcee99e06a","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae207648a46f6fe5a2330a3"},"entitlements":{"AI_CHAT":{"status":"DISABLED"}},"buildId":"6ae25c4cc8e59e940373ffbd","clientVersion":"0.0.4006","searchFilterCounts":[{"language":"default","tag":"Qlty CLI","count":56},{"language":"default","tag":"Qlty Cloud","count":38},{"language":"default","tag":"All Commands","count":31},{"language":"default","tag":"Home","count":29},{"language":"default","tag":"Code Coverage","count":29},{"language":"default","tag":"API Reference","count":27},{"language":"default","tag":"Endpoints","count":26},{"language":"default","tag":"Additional Information","count":20},{"language":"default","tag":"Getting Started","count":16},{"language":"default","tag":"Programming Languages","count":16}]},"assistantConfig":{},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".pretty-table{width:100%;table-layout:fixed;border:1px solid #ddd}.pretty-table thead{background-color:#f2f2f2}.pretty-table tbody{background-color:#fff}.pretty-table td,.pretty-table th{padding:8px;text-align:center;border:1px solid #ddd}.pretty-table td:first-child,.pretty-table th:first-child{padding:8px 12px;text-align:left}.pretty-table .divider-row{background-color:#f2f2f2;font-weight:700}.dark .pretty-table,.dark .pretty-table td,.dark .pretty-table th{border:1px solid #dddddd36}.dark .pretty-table .divider-row,.dark .pretty-table thead{background-color:rgb(102 250 236/10%)}.dark .pretty-table tbody{background-color:transparent}#mermaid-carry-forward{display:flex;justify-content:center;align-items:center;width:100%}#content-area h1{font-size:36px!important;font-weight:800!important;line-height:45px!important}#content-area h2,#content-area table th{font-weight:700!important}#content-area h3{font-size:20px!important;line-height:32px!important}.eyebrow{color:#007277}.code-group [role=tab],.code-group [role=tab]>div{color:#707575;font-size:14px!important}.code-group [role=tab][data-state=active],.code-group [role=tab][data-state=active]>div{color:#2a2a2a;font-weight:600}#content-area table th{background-color:rgb(0 0 0/2.4%)}#content-area table td,#content-area table th{padding:8px!important;border-bottom:1px solid rgb(0 0 0/12%)!important}.dark #content-area table th{background-color:rgb(255 255 255/4%)}.dark #content-area table td,.dark #content-area table th{border-bottom-color:rgb(255 255 255/12%)!important}[data-component-part=step-number]>div{background-color:rgb(255 255 255/80%)!important;border:1px solid rgb(0 0 0/12%)}.dark [data-component-part=step-number]>div{background-color:rgb(255 255 255/10%)!important;border:1px solid rgb(255 255 255/15%)}#sidebar-content a[class*=bg-primary]{color:#007277!important;background-color:rgb(4 189 196/15.7%)!important}.dark #sidebar-content a[class*=bg-primary]{color:#66faec!important;background-color:rgb(102 250 236/15.7%)!important}#content-area :not(pre)>code,#content-area :not(pre)>span>code{background-color:rgb(255 255 255/80%)!important;box-shadow:rgb(0 0 0/12%) 0 0 0 1px inset!important;border-radius:4px!important;padding:2px 4px!important;color:#007277!important}#content-area h1 :not(pre,a)>code,#content-area h1 :not(pre,a)>span>code,#content-area h2 :not(pre,a)>code,#content-area h2 :not(pre,a)>span>code,#content-area h3 :not(pre,a)>code,#content-area h3 :not(pre,a)>span>code,#content-area h4 :not(pre,a)>code,#content-area h4 :not(pre,a)>span>code,h1 #content-area :not(pre)>code,h1 #content-area :not(pre)>span>code,h2 #content-area :not(pre)>code,h2 #content-area :not(pre)>span>code{color:inherit!important;font-weight:inherit!important;font-size:inherit!important}.code-block code,.code-block pre{font-family:Menlo,Consolas,\"DejaVu Sans Mono\",monospace!important}#content-area table{table-layout:auto!important;width:100%!important}#content-area table code{white-space:nowrap!important}#content-area .text-primary,#content-area .text-primary-light,.toc .text-primary{color:#007277!important}.dark #content-area .text-primary,.dark #content-area .text-primary-light,.dark .toc .text-primary{color:#66faec!important}"}],"page":{"pagePath":"migration/coverage","slug":"/migration/coverage","pageMetadata":{"title":"Migrating Coverage Uploads","sidebarTitle":"Code Coverage Migration Guide","description":null,"href":"/migration/coverage"},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(Warning,{children:[_jsx(_components.p,{children:`The Code Climate API was disabled on July 18, 2025.`}),_jsxs(_components.p,{children:[`Any remaining attempts to upload coverage via the old `,_jsx(_components.code,{children:`cc-test-reporter`}),` will fail your CI builds. Remove (or comment out) any references to `,_jsx(_components.code,{children:`cc-test-reporter`}),` in your CI scripts and follow the steps below to upload to Qlty Cloud instead.`]})]}),`\n`,_jsx(_components.p,{children:`This guide is for users who have previously set up code coverage reporting to Code Climate Quality and are now migrating to Qlty Cloud.`}),`\n`,_jsx(Heading,{level:`2`,id:`advantages-of-qlty-cloud`,children:`Advantages of Qlty Cloud`}),`\n`,_jsx(_components.p,{children:`The new Qlty Cloud app offers many advantages over Code Climate Quality for code coverage. To help make coverage setup easier, we offer four new features:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Support for OpenID Connect (OIDC) with GitHub Actions for tokenless coverage uploads`}),`\n`,_jsx(_components.li,{children:`Workspace-level coverage tokens`}),`\n`,_jsx(_components.li,{children:`Reusable GitHub Action and CircleCI Orb tools`}),`\n`,_jsx(_components.li,{children:`Server-side coverage coverage merging`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Once coverage is set up, Qlty Cloud supports all of the code coverage reporting features of Code Climate Quality like:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Coverage Tags for tracking data for e.g. tracking unit test coverage separately from integration test coverage`}),`\n`,_jsx(_components.li,{children:`In-app views for reviewing coverage on Pull Request diffs (No broweser extension required)`}),`\n`,_jsx(_components.li,{children:`Additional flexibility when configuring coverage gates (pass/fail commit statuses)`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`prerequisites`,children:`Prerequisites`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`A Code Climate Quality account with repositories where you’ve previously configured coverage reporting`}),`\n`,_jsx(_components.li,{children:`A GitHub user which is an Administrator of your GitHub organization`}),`\n`,_jsx(_components.li,{children:`Ability to modify and run CI scripts for the relevant repositories`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`process`,children:`Process`}),`\n`,_jsxs(Warning,{children:[_jsx(_components.p,{children:`Migrating a Ruby/RSpec repository?`}),_jsxs(_components.p,{children:[`Previously SimpleCov `,_jsx(_components.a,{href:`https://github.com/simplecov-ruby/simplecov?tab=readme-ov-file#json-formatter`,children:`detected the use of Code Climate`}),` and auto-initialized SimpleCov.`]}),_jsxs(_components.p,{children:[_jsx(_components.em,{children:`This is no longer the case. Using Qlty requires explicit SimpleCov configuration`}),`.`]}),_jsxs(_components.p,{children:[`See our `,_jsx(_components.a,{href:`/coverage/generating-data#ruby-with-simplecov`,children:`Ruby coverage docs`}),` for more information on recommended configuration.`]})]}),`\n`,_jsx(Heading,{level:`3`,id:`step-1-determine-an-authentication-approach`,children:`Step 1. Determine an authentication approach`}),`\n`,_jsx(_components.p,{children:`Qlty Cloud supports three ways to authenticate code coverage uploads from your CI system:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`OpenID Connect (OIDC) with GitHub Actions`}),`\n`,_jsx(_components.li,{children:`Workspace-level coverage tokens`}),`\n`,_jsx(_components.li,{children:`Project-level coverage tokens`}),`\n`]}),`\n`,_jsx(_components.p,{children:`If you are using GitHub Actions and are able to use OIDC, we recommend that approach as it is the most secure and requires no management of long-lived coverage tokens.`}),`\n`,_jsx(_components.p,{children:`If you are not using GitHub Actions, or are unable to use OIDC, you can use a workspace-level coverage token. This is a long-lived token that is scoped to your entire organization and can be used for all repositories within that organization.`}),`\n`,_jsx(_components.p,{children:`For situations were neight of those options are available, you can use a project-level coverage token. This is a long-lived token that is scoped to a single repository and can be used for that repository only.`}),`\n`,_jsx(Heading,{level:`4`,id:`obtain-a-coverage-token-from-qlty-cloud`,children:`Obtain a coverage token from Qlty Cloud`}),`\n`,_jsx(_components.p,{children:`If you are not using OIDC, you will need to obtain a coverage token from Qlty Cloud.`}),`\n`,_jsx(_components.p,{children:`Qlty Cloud uses GitHub for both authentication and authorization checks. Therefore, any user with administrator permissions on a GitHub organization is automatically able to access the corresponding workspace on Qlty Cloud.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Login to Qlty via GitHub OAuth (as a GitHub Admin)`}),`\n`,_jsxs(_components.li,{children:[`Navigate to `,_jsx(_components.em,{children:`Workspace Settings > Code Coverage`}),` (e.g. `,_jsx(_components.code,{children:`https://qlty.sh/gh/org-name/settings/coverage`}),`)`]}),`\n`,_jsx(_components.li,{children:`Copy the workspace’s coverage token`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`step-2-store-the-coverage-token-as-a-ci-secret-if-not-using-oidc`,children:`Step 2. Store the coverage token as a CI secret (if not using OIDC)`}),`\n`,_jsx(_components.p,{children:_jsx(_components.em,{children:`If you are using OIDC, you can skip this step.`})}),`\n`,_jsxs(_components.p,{children:[`A coverage token only provides the ability to upload code coverage data to Qlty Cloud and does not provide access to read any data or administer any settings. Even still, it should be treated as a credential and stored securely within your CI system, as explained `,_jsx(_components.a,{href:`/coverage/tokens#token-storage`,children:`here`})]}),`\n`,_jsx(_components.p,{children:`The specifics for how to store a secret at the organization level and make it available to all repositories vary by provider:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://docs.github.com/en/actions/security-for-github-actions/security-guides/using-secrets-in-github-actions`,children:`GitHub Actions`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://circleci.com/docs/contexts/`,children:`CircleCI`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://buildkite.com/docs/pipelines/security/secrets/buildkite-secrets`,children:`Buildkite`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://docs.travis-ci.com/user/encryption-keys/`,children:`Travis CI`})}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`step-3-update-ci-workflow-scripts`,children:`Step 3. Update CI workflow scripts`}),`\n`,_jsx(_components.p,{children:`This guide assumes that your CI scripts are already generating code coverage data from the execution of your automated unit tests. The method to generate this data and the output format varies by programming language and testing tools.`}),`\n`,_jsxs(_components.p,{children:[`Once you have code coverage data being generated in one of our `,_jsx(_components.a,{href:`/coverage/generating-data#supported-languages-and-formats`,children:`supported formats`}),`, continue with the steps below. Generally, the process is to add an additional step after the code coverage data has been generated and written to disk on the CI runner.`]}),`\n`,_jsx(Heading,{level:`4`,id:`reusable-github-action`,children:`Reusable GitHub Action`}),`\n`,_jsxs(_components.p,{children:[`Add a step to run the `,_jsx(_components.code,{children:`qltysh/qlty-action/coverage`}),` reusable GitHub Action:`]}),`\n`,_jsx(CodeBlock,{filename:``,lines:`true`,numberOfLines:`15`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`15`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# ...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`permissions`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` contents`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`read`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` id-token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`write`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # IMPORTANT`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`jobs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` build`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` steps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`qltysh/qlty-action/coverage@v2`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` oidc`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` files`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`COVERAGE_FILE_PATH`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # e.g. coverage/lcov.info`})]}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If you are using a workspace or project coverage token instead of OIDC, remove the `,_jsx(_components.code,{children:`oidc: true`}),` line and add `,_jsx(_components.code,{children:\"token: ${{ secrets.QLTY_COVERAGE_TOKEN }}\"}),` to the `,_jsx(_components.code,{children:`with`}),` block:`]}),`\n`,_jsx(CodeBlock,{filename:``,lines:`true`,numberOfLines:`11`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`11`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# ...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`jobs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` build`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` steps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`uses`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`qltysh/qlty-action/coverage@v2`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` with`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` token`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"${{ secrets.QLTY_COVERAGE_TOKEN }}\"})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` files`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`COVERAGE_FILE_PATH`}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # e.g. coverage/lcov.info`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`circleci-orb`,children:`CircleCI Orb`}),`\n`,_jsxs(_components.p,{children:[`We provide a CircleCI Orb for uploading coverage reports. To use it, add the following to your `,_jsx(_components.code,{children:`.circleci/config.yml`}),` file:`]}),`\n`,_jsx(CodeBlock,{filename:``,lines:`true`,numberOfLines:`8`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# ...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`jobs`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` run_tests_and_publish_coverage`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` steps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` - `}),_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`qlty-orb/coverage_publish`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` files`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`coverage/lcov.info`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:_jsx(_components.a,{href:`https://circleci.com/developer/orbs/orb/qltysh/qlty-orb`,children:`Learn more`})}),`\n`,_jsx(Heading,{level:`4`,id:`other-ci-providers`,children:`Other CI providers`}),`\n`,_jsxs(_components.p,{children:[`With other CI providers, you will install the Qlty CLI and run the `,_jsx(_components.code,{children:`qlty coverage publish`}),` command, you will also need to provide the commit SHA and branch name explicitly:`]}),`\n`,_jsx(CodeBlock,{filename:``,lines:`true`,numberOfLines:`3`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`3`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Assumes $QLTY_COVERAGE_TOKEN is set in the environment`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`curl`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` https://qlty.sh`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:` sh`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`qlty`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` coverage`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` publish`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --override-commit-sha`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` COMMIT_SHA`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --override-branch`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` BRANCH_NAME`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` COVERAGE_FILE_PATH`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The Qlty CLI is able to auto-detect workflow-related metadata from the environment variables set by your CI provider on the following platforms:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Buildkite`}),`\n`,_jsx(_components.li,{children:`Travis CI`}),`\n`,_jsx(_components.li,{children:`CodeFresh`}),`\n`,_jsx(_components.li,{children:`Semaphore`}),`\n`]}),`\n`,_jsx(_components.p,{children:`If you are using another CI provider not in this list, please contact us and we can add support for your system.`}),`\n`,_jsx(Heading,{level:`3`,id:`step-4-validate-coverage-uploads-from-a-branch`,children:`Step 4. Validate coverage uploads from a branch`}),`\n`,_jsx(_components.p,{children:`After updating the CI script, trigger a build (of the branch including your updated script) and ensure it completes successfully. Check the output for the upload step and verify that no errors are occurring on the CI side during the upload process.`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`On Qlty Cloud, navigate to your `,_jsx(_components.em,{children:`Project Settings > Code Coverage`}),` page (example: `,_jsx(_components.code,{children:`https://qlty.sh/gh/org-name/projects/repo-name/settings/coverage`}),`).`]}),`\n`,_jsx(_components.li,{children:`Your uploaded coverage report should appear in the table at the bottom of the page`}),`\n`,_jsx(_components.li,{children:`Click on the commit SHA to view your report details`}),`\n`,_jsx(_components.li,{children:`Verify that the report details match your expectations (commit SHA, branch name, etc.)`}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`step-5-merge-your-ci-script-changes-into-your-main-branch`,children:`Step 5. Merge your CI script changes into your main branch`}),`\n`,_jsx(_components.p,{children:`Now that the coverage uploads are happening successfully for your branch, merge the branch into your default branch (e.g. main) and run a build.`}),`\n`,_jsx(_components.p,{children:`Ensure that the build completes successfully (with no errors from the coverage upload step), and validate the coverage upload in your Project Settings.`}),`\n`,_jsx(_components.p,{children:`Once Qlty receives a valid coverage report for your default branch, your coverage info will be displayed in your project’s Overview page. You’ll also see file-level and directory-level coverage on your project’s Issues tab.`}),`\n`,_jsx(Heading,{level:`3`,id:`step-6-remove-coverage-uploads-to-code-climate-quality`,children:`Step 6. Remove coverage uploads to Code Climate Quality`}),`\n`,_jsxs(_components.p,{children:[`Once you’ve setup coverage reporting (and enabled coverage commit statuses) as desired, remove references to the old Code Climate test reporter within your CI script. The Code Climate API will be deactivated on July 18th. At this point, any references to `,_jsx(_components.code,{children:`cc-test-reporter`}),` will result in failed CI builds.`]}),`\n`,_jsx(Heading,{level:`3`,id:`step-7-repeat-for-each-repository`,children:`Step 7. Repeat for each repository`}),`\n`,_jsx(_components.p,{children:`Steps 3 through 6 need to be repeated for each repository that you are migrating to Qlty Cloud. We have found that with a good prompt for an AI coding assistant, the process can be completed quickly.`}),`\n`,_jsx(Heading,{level:`3`,id:`optional-enable-coverage-commit-statuses-from-qlty-cloud`,children:`Optional: Enable coverage commit statuses from Qlty Cloud`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Enable commit statuses (`,_jsx(_components.strong,{children:`Qlty Coverage`}),` and `,_jsx(_components.strong,{children:`Qlty Diff Coverage`}),`) within your Project’s Commit Statuses settings: (`,_jsx(_components.code,{children:`https://qlty.sh/gh/org-name/projects/repo-name/settings/gates`}),`)`]}),`\n`,_jsx(_components.li,{children:`Adjust coverage check settings (including new configurations for minimum diff size and total coverage decrease)`}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`resources`,children:`Resources`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/coverage/quickstart`,children:`Setting Up Code Coverage`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/coverage/ci`,children:`Continuous Integration (CI) Tools`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/coverage/metrics`,children:`Code Coverage Metrics`})}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`/coverage/troubleshooting`,children:`Troubleshooting Code Coverage`})}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`get-help`,children:`Get Help`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Chat with us on `,_jsx(_components.a,{href:`https://qlty.sh/discord`,children:`Discord`})]}),`\n`,_jsxs(_components.li,{children:[`File bugs on `,_jsx(_components.a,{href:`https://github.com/qltysh/qlty/issues/new/choose`,children:`GitHub Issues`})]}),`\n`,_jsx(_components.li,{children:_jsx(_components.a,{href:`https://qlty.sh/contact/support`,children:`Contact Support`})}),`\n`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Migrating Coverage Uploads","sidebarTitle":"Code Coverage Migration Guide","description":null,"href":"/migration/coverage"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Advantages of Qlty Cloud","slug":"advantages-of-qlty-cloud","depth":2,"children":[]},{"title":"Prerequisites","slug":"prerequisites","depth":2,"children":[]},{"title":"Process","slug":"process","depth":2,"children":[{"title":"Step 1. Determine an authentication approach","slug":"step-1-determine-an-authentication-approach","depth":3,"children":[]},{"title":"Obtain a coverage token from Qlty Cloud","slug":"obtain-a-coverage-token-from-qlty-cloud","depth":4,"children":[]},{"title":"Step 2. Store the coverage token as a CI secret (if not using OIDC)","slug":"step-2-store-the-coverage-token-as-a-ci-secret-if-not-using-oidc","depth":3,"children":[]},{"title":"Step 3. Update CI workflow scripts","slug":"step-3-update-ci-workflow-scripts","depth":3,"children":[]},{"title":"Reusable GitHub Action","slug":"reusable-github-action","depth":4,"children":[]},{"title":"CircleCI Orb","slug":"circleci-orb","depth":4,"children":[]},{"title":"Other CI providers","slug":"other-ci-providers","depth":4,"children":[]},{"title":"Step 4. Validate coverage uploads from a branch","slug":"step-4-validate-coverage-uploads-from-a-branch","depth":3,"children":[]},{"title":"Step 5. Merge your CI script changes into your main branch","slug":"step-5-merge-your-ci-script-changes-into-your-main-branch","depth":3,"children":[]},{"title":"Step 6. Remove coverage uploads to Code Climate Quality","slug":"step-6-remove-coverage-uploads-to-code-climate-quality","depth":3,"children":[]},{"title":"Step 7. Repeat for each repository","slug":"step-7-repeat-for-each-repository","depth":3,"children":[]},{"title":"Optional: Enable coverage commit statuses from Qlty Cloud","slug":"optional-enable-coverage-commit-statuses-from-qlty-cloud","depth":3,"children":[]}]},{"title":"Resources","slug":"resources","depth":2,"children":[]},{"title":"Get Help","slug":"get-help","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"qltysoftware","siteName":"Qlty Docs","title":"Migrating Coverage Uploads - Qlty Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-28T20:34:29.530Z","originalFileLocation":"migration/coverage.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"application-name\" content=\"Qlty Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Migrating Coverage Uploads - Qlty Docs\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Qlty Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.qlty.sh/migration/coverage\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://qltysoftware.mintlify.app/_mintlify/api/og/v2?division=Migrating+from+Code+Climate\u0026amp;title=Migrating+Coverage+Uploads\u0026amp;theme=f77b4adcd6006d656f331cf4\u0026amp;signature=ba6a39e8cd003fce67ed85ce633dc3ebb37bcc01935584554562bdfe94506d1a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Migrating Coverage Uploads - Qlty Docs\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://qltysoftware.mintlify.app/_mintlify/api/og/v2?division=Migrating+from+Code+Climate\u0026amp;title=Migrating+Coverage+Uploads\u0026amp;theme=f77b4adcd6006d656f331cf4\u0026amp;signature=ba6a39e8cd003fce67ed85ce633dc3ebb37bcc01935584554562bdfe94506d1a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/qltysoftware/7vmNS6Tx05_OCSe5/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Qlty Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#08B2B7\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.qlty.sh/migration/coverage\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/migration/coverage.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.qlty.sh/#organization\",\"name\":\"Qlty Docs\",\"url\":\"https://docs.qlty.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/qltysoftware/WE5EjhygR2JGFw2L/assets/qlty_logo_black.svg?fit=max\u0026auto=format\u0026n=WE5EjhygR2JGFw2L\u0026q=85\u0026s=953dc5550d8d7b301bab57c551c2e095\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.qlty.sh#website\",\"name\":\"Qlty Docs\",\"url\":\"https://docs.qlty.sh\",\"publisher\":{\"@id\":\"https://docs.qlty.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.qlty.sh/migration/coverage#webpage\",\"url\":\"https://docs.qlty.sh/migration/coverage\",\"name\":\"Migrating Coverage Uploads\",\"dateModified\":\"2026-10-28T20:34:29.530Z\",\"isPartOf\":{\"@id\":\"https://docs.qlty.sh#website\"},\"breadcrumb\":{\"@id\":\"https://docs.qlty.sh/migration/coverage#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.qlty.sh/migration/coverage#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Migrating from Code Climate\",\"item\":\"https://docs.qlty.sh/migration/overview\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migrating Coverage Uploads\",\"item\":\"https://docs.qlty.sh/migration/coverage\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.qlty.sh/migration/coverage#article\",\"headline\":\"Migrating Coverage Uploads\",\"name\":\"Migrating Coverage Uploads\",\"url\":\"https://docs.qlty.sh/migration/coverage\",\"mainEntityOfPage\":{\"@id\":\"https://docs.qlty.sh/migration/coverage#webpage\"},\"dateModified\":\"2026-10-28T20:34:29.530Z\",\"publisher\":{\"@id\":\"https://docs.qlty.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.qlty.sh#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Qlty Docs\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Qlty Docs","nav":{"global":null,"tabs":[{"tab":"Home","icon":"house","groups":[{"group":"Introduction","pages":[{"title":"What is Qlty?","href":"/what-is-qlty"},{"title":"Qlty CLI vs. Qlty Cloud","href":"/cli-vs-cloud"}]},{"group":"Key Concepts","pages":[{"title":"Linting","href":"/linting"},{"title":"Auto-formatting","href":"/auto-formatting"},{"title":"Code Smells","href":"/code-smells"},{"title":"Complexity","href":"/complexity"},{"title":"Duplication","href":"/duplication"},{"title":"Custom Checks","href":"/custom-checks"},{"title":"Monorepos","href":"/monorepos"}]},{"group":"Programming Languages","pages":[{"title":"Programming Language Support","sidebarTitle":"Supported Languages","href":"/languages"},{"title":"C / C++ Language Support","sidebarTitle":"C / C++","href":"/languages/c-cpp"},{"title":"C# Language Support","sidebarTitle":"C#","href":"/languages/csharp"},{"title":"Go Language Support","sidebarTitle":"Go","href":"/languages/golang"},{"title":"Java Language Support","sidebarTitle":"Java","href":"/languages/java"},{"title":"JavaScript Language Support","sidebarTitle":"JavaScript","href":"/languages/javascript"},{"title":"Kotlin Language Support","sidebarTitle":"Kotlin","href":"/languages/kotlin"},{"title":"PHP Language Support","sidebarTitle":"PHP","href":"/languages/php"},{"title":"Python Language Support","sidebarTitle":"Python","href":"/languages/python"},{"title":"Ruby Language Support","sidebarTitle":"Ruby","href":"/languages/ruby"},{"title":"Rust Language Support","sidebarTitle":"Rust","href":"/languages/rust"},{"title":"Scala Language Support","sidebarTitle":"Scala","href":"/languages/scala"},{"title":"Swift Language Support","sidebarTitle":"Swift","href":"/languages/swift"},{"title":"TypeScript Language Support","sidebarTitle":"TypeScript","href":"/languages/typescript"},{"title":"VB.NET Language Support","sidebarTitle":"VB.NET","href":"/languages/vbnet"},{"title":"Available Plugins","href":"/plugins"}]},{"group":"Migrating from Code Climate","pages":[{"title":"Migration Overview","href":"/migration/overview"},{"title":"Product Comparison","href":"/migration/comparison"},{"title":"Migration Guide","description":null,"href":"/migration/guide"},{"title":"Migrating Coverage Uploads","sidebarTitle":"Code Coverage Migration Guide","href":"/migration/coverage"}]}]},{"tab":"Qlty CLI","icon":"square-terminal","pages":[{"title":"Qlty CLI","href":"/cli/quickstart"}]},{"tab":"Qlty Cloud","icon":"cloud","pages":[{"title":"Qlty Cloud","href":"/cloud/quickstart"}]},{"tab":"Code Coverage","icon":"shield","pages":[{"title":"Code Coverage","href":"/coverage"}]},{"tab":"API Reference","icon":"code","pages":[{"title":"API Reference","href":"/api/introduction"}]},{"tab":"Changelog","icon":"clock","pages":[{"title":"Changelog","href":"/changelog"}]}]},"title":"Migrating Coverage Uploads - Qlty Docs","buildId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","deploymentId":"dpl_2xiSHD9XEvLsPGPcfoMtkLTB3dy9","dynamics":[],"chunks":[]}