From 36c552a493f197eebf3f713f19afa6d28ed07a70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 6 Dec 2023 16:34:46 +0000 Subject: [PATCH 01/44] wip: Add new dedicated release note page --- ...12-DD-gh-admin-permission-not-requested.md | 28 +++++++++++++++++++ docs/release-notes/index.md | 1 + mkdocs.yml | 1 + 3 files changed, 30 insertions(+) create mode 100644 docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md new file mode 100644 index 0000000000..258d00a55d --- /dev/null +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -0,0 +1,28 @@ +--- +rss_title: Codacy release notes RSS feed +rss_href: /feed_rss_created.xml +--- + +# Codacy no longer requests repository permissions for Administration on GitHub December DD, 2023 + +!!! info "This release note applies only to GitHub" + +We're replacing our usage of long lived, hard to track SSH Keys with trackable, short lived Installation Tokens when interacting with GitHub. + +Codacy GitHub App no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). + +With the deprecation of the SSH Keys usage for GitHub, we've the opportunity to improve the security, safety and reduce the liability of our GitHub App as we will no longer be requesting Repository Administration Read and Write permission. + +## Removal of Administration repository permission + +## What do you need to do if you have GitHub repositories? + +For us to be able to drop this Administration permission we'll first need to make sure that our existing customers have accepted a new(ish) permission that we request: Repository Contents Read-only permission. + +We'll first need to make sure that our existing customers have accepted a new(ish) permission that we request: Repository Contents Read-only permission. + +If you have any questions or need help, please contact . + +## What will happen if you don't accept the new permissions request? + +If we drop the Administration permission, customers that haven't accepted the Contents permission will be unable to properly use Codacy and a lot of features ranging from adding repositories to performing analysis will fail. diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 8056df1d1b..bcf4831c45 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,6 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2023 +- [Codacy no longer requests repository permissions for Administration on GitHub December DD, 2023](cloud/cloud-2023-12-DD-gh-admin-permission-not-required.md) - [New Coverage engine status checks November 23, 2023](cloud/cloud-2023-11-23-new-coverage-engine-status-checks.md) - [Removal of Jira, Slack, and Webhooks repository integrations November 13, 2023](cloud/cloud-2023-11-13-jira-slack-webhooks-repo-integrations-removal.md) - [Cloud October 2023](cloud/cloud-2023-10.md) diff --git a/mkdocs.yml b/mkdocs.yml index 1f92ba50af..88f4ed88ca 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -660,6 +660,7 @@ nav: - release-notes/index.md - Cloud: - 2023: + - release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md - release-notes/cloud/cloud-2023-11-23-new-coverage-engine-status-checks.md - release-notes/cloud/cloud-2023-11-13-jira-slack-webhooks-repo-integrations-removal.md - release-notes/cloud/cloud-2023-10.md From 2cc8b8e3a8140a29abe21eb5d291f60d1890f662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 6 Dec 2023 16:49:06 +0000 Subject: [PATCH 02/44] fix: Fix page link --- docs/release-notes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index bcf4831c45..baa120caf4 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,7 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2023 -- [Codacy no longer requests repository permissions for Administration on GitHub December DD, 2023](cloud/cloud-2023-12-DD-gh-admin-permission-not-required.md) +- [Codacy no longer requests repository permissions for Administration on GitHub December DD, 2023](cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md) - [New Coverage engine status checks November 23, 2023](cloud/cloud-2023-11-23-new-coverage-engine-status-checks.md) - [Removal of Jira, Slack, and Webhooks repository integrations November 13, 2023](cloud/cloud-2023-11-13-jira-slack-webhooks-repo-integrations-removal.md) - [Cloud October 2023](cloud/cloud-2023-10.md) From 2382ad78b545c15ec84cec972e6d93ada4d8745d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Thu, 7 Dec 2023 15:29:49 +0000 Subject: [PATCH 03/44] wip: Add timeline table --- ...12-DD-gh-admin-permission-not-requested.md | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 258d00a55d..440e34ac09 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -13,7 +13,45 @@ Codacy GitHub App no longer requests [read and write repository permissions for With the deprecation of the SSH Keys usage for GitHub, we've the opportunity to improve the security, safety and reduce the liability of our GitHub App as we will no longer be requesting Repository Administration Read and Write permission. -## Removal of Administration repository permission +## Removal of repository permissions for Administration + +Currently, Codacy requires repository permissions for Administration exclusively as a fallback mechanism when the Contents permission is missing. In this case, Codacy creates an SSH key on the repository to allow cloning and integrating with your repository. + +We will remove this permission on the following dates: + + + + + + + + + + + + + + + + + + + + + + + + +
DateEventWhat to expect
December DD, 2023Codacy started using installation tokens to clone and integrate with your repositories. SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing. +

From this day on, the new checks will be the official status checks for Codacy Coverage and will no longer be marked beta. The old check will be marked deprecated but will keep working.

+

If on this date you are still using the old check to block merging pull requests on GitHub, please update your Git provider settings.

+
April 18th, 2024Brownout of repository permissions for Administration +

Codacy will not send the old status check on this day.

+

This will help you confirm that your setup has been updated correctly and lower the risk of disruptions when the old status check is removed.
If on this day you can merge your pull requests using the new checks and don't encounter other issues, it means that your setup has been updated correctly. Otherwise, if on this date you are still using the old check to block merging pull requests on GitHub, please update your Git provider settings.

+
June 5th, 2024Removal of repository permissions for Administration +

Codacy will stop sending the old status check.

+

If on this date you are still using the old check to block merging pull requests on GitHub, you will no longer be able to merge them. To fix this, follow the instructions below.

+
## What do you need to do if you have GitHub repositories? From 1c45ac859038ed49bee1ef0bec55ff51c776a54c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Thu, 7 Dec 2023 18:40:31 +0000 Subject: [PATCH 04/44] feat: Restructure and content update --- ...12-DD-gh-admin-permission-not-requested.md | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 440e34ac09..b35aaac2fb 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -7,17 +7,25 @@ rss_href: /feed_rss_created.xml !!! info "This release note applies only to GitHub" -We're replacing our usage of long lived, hard to track SSH Keys with trackable, short lived Installation Tokens when interacting with GitHub. +For increased security, Codacy is deprecating the usage of **repository SSH keys** for Git operations on GitHub in favour of **installation access tokens**. -Codacy GitHub App no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). +This change translates into an important security improvement by reducing the liability of Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). -With the deprecation of the SSH Keys usage for GitHub, we've the opportunity to improve the security, safety and reduce the liability of our GitHub App as we will no longer be requesting Repository Administration Read and Write permission. +## What do you need to do if you have GitHub organization? + +To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). + +Codacy have been requesting updated app permissions for some time now. If you haven't done it yet, make sure you [approve Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization. + +If you have any questions or need help, please contact . ## Removal of repository permissions for Administration -Currently, Codacy requires repository permissions for Administration exclusively as a fallback mechanism when the Contents permission is missing. In this case, Codacy creates an SSH key on the repository to allow cloning and integrating with your repository. +To ensure you have the necessary time to [approve Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, Codacy will keep using repository SSH keys for Git operations for now as a fallback mechanism when the Contents permission is missing. + +At a later phase, Codacy will drop repository permissions for Administration and the usage of repository SSH keys, and will no longer store those SSH keys. -We will remove this permission on the following dates: +See the timeline below: @@ -28,39 +36,27 @@ We will remove this permission on the following dates: - + - + - - + +
December DD, 2023Codacy started using installation tokens to clone and integrate with your repositories. SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated repositories SSH keys usage -

From this day on, the new checks will be the official status checks for Codacy Coverage and will no longer be marked beta. The old check will be marked deprecated but will keep working.

-

If on this date you are still using the old check to block merging pull requests on GitHub, please update your Git provider settings.

+

From this day on, repositories SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

+

If you haven't done it yet, make sure you approve Codacy GitHub App updated permissions on your GitHub organization.

April 18th, 2024January DD, 2024 Brownout of repository permissions for Administration -

Codacy will not send the old status check on this day.

-

This will help you confirm that your setup has been updated correctly and lower the risk of disruptions when the old status check is removed.
If on this day you can merge your pull requests using the new checks and don't encounter other issues, it means that your setup has been updated correctly. Otherwise, if on this date you are still using the old check to block merging pull requests on GitHub, please update your Git provider settings.

+

On this day, Codacy won't use any fallback mechanism if the Contents permission is missing.

+

This will help you confirm that you already approved the updated permissions for Codacy GitHub App.
If on this date your Codacy quality analysis fail or you have problems adding new repositories to Codacy, make sure you approve Codacy GitHub App updated permissions on your GitHub organization.

June 5th, 2024Removal of repository permissions for AdministrationMM DD, 2024Codacy will drop repository permissions for Administration and the usage of repository SSH keys -

Codacy will stop sending the old status check.

-

If on this date you are still using the old check to block merging pull requests on GitHub, you will no longer be able to merge them. To fix this, follow the instructions below.

+

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories with no fallback mechanisms, and will no longer store repositories SSH keys.

+

If on this date you haven't approved Codacy GitHub App updated permissions on your GitHub organization, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy.

- -## What do you need to do if you have GitHub repositories? - -For us to be able to drop this Administration permission we'll first need to make sure that our existing customers have accepted a new(ish) permission that we request: Repository Contents Read-only permission. - -We'll first need to make sure that our existing customers have accepted a new(ish) permission that we request: Repository Contents Read-only permission. - -If you have any questions or need help, please contact . - -## What will happen if you don't accept the new permissions request? - -If we drop the Administration permission, customers that haven't accepted the Contents permission will be unable to properly use Codacy and a lot of features ranging from adding repositories to performing analysis will fail. From 1d9a5777ac9245c0eff2a919f1889adb41986f31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Mon, 11 Dec 2023 16:31:39 +0000 Subject: [PATCH 05/44] clean: Small tweak --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index b35aaac2fb..ca4658ba2c 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -11,7 +11,7 @@ For increased security, Codacy is deprecating the usage of **repository SSH keys This change translates into an important security improvement by reducing the liability of Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). -## What do you need to do if you have GitHub organization? +## What do you need to do if you have a GitHub organization? To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). From 6896e7fe5d9af15ac6e713a3d291df87a50ce564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 12 Dec 2023 15:38:38 +0000 Subject: [PATCH 06/44] clean: Give more visibility to required action --- .../cloud-2023-12-DD-gh-admin-permission-not-requested.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index ca4658ba2c..d8c19b9338 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -13,9 +13,9 @@ This change translates into an important security improvement by reducing the li ## What do you need to do if you have a GitHub organization? -To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). +Make sure you [approve Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if you haven't done it yet. -Codacy have been requesting updated app permissions for some time now. If you haven't done it yet, make sure you [approve Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization. +To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents), and has requested additional permissions for it. If you have any questions or need help, please contact . From d17362781297c04f51f618aa230191b025f8f635 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 12 Dec 2023 16:21:18 +0000 Subject: [PATCH 07/44] clean: Remove duplicate details from the section introduction --- .../cloud-2023-12-DD-gh-admin-permission-not-requested.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index d8c19b9338..5dd0a19089 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -21,11 +21,7 @@ If you have any questions or need help, please contact From 56f5131a01c24323adf602d812edc862427c05d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 12 Dec 2023 17:07:35 +0000 Subject: [PATCH 08/44] clean: Tweaks for clarity --- .../cloud-2023-12-DD-gh-admin-permission-not-requested.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 5dd0a19089..9ea0876010 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -48,10 +48,10 @@ To ensure you have the necessary time to [approve Codacy GitHub App updated perm MM DD, 2024 - Codacy will drop repository permissions for Administration and the usage of repository SSH keys + Codacy will remove repository permissions for Administration and drop the usage of repository SSH keys -

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories with no fallback mechanisms, and will no longer store repositories SSH keys.

-

If on this date you haven't approved Codacy GitHub App updated permissions on your GitHub organization, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy.

+

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories with no fallback mechanisms, and will no longer store repositories SSH keys. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

+

If on this date you haven't approved Codacy GitHub App updated permissions on your GitHub organization, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until you approve the updated permissions.

From 8ca65566161a068e6544778b24b69e8b1efd9a78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 12 Dec 2023 17:54:22 +0000 Subject: [PATCH 09/44] fix: Temporary fix for Python version --- .github/workflows/mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml index 49a27c8502..9f8c168fc6 100644 --- a/.github/workflows/mkdocs.yml +++ b/.github/workflows/mkdocs.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.x" + python-version: "3.11" cache: "pip" - name: Install dependencies From 86592e363c1d395244ea470a14b684941c6ff559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 13 Dec 2023 12:04:56 +0000 Subject: [PATCH 10/44] feat: Clarify org owner role for approval, add image for permissions request --- ...3-12-DD-gh-admin-permission-not-requested.md | 14 ++++++++------ .../2023-12-DD-gh-updated-permissions.png | Bin 0 -> 84907 bytes 2 files changed, 8 insertions(+), 6 deletions(-) create mode 100644 docs/release-notes/images/2023-12-DD-gh-updated-permissions.png diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 9ea0876010..e927568c77 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -11,17 +11,19 @@ For increased security, Codacy is deprecating the usage of **repository SSH keys This change translates into an important security improvement by reducing the liability of Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). -## What do you need to do if you have a GitHub organization? +## What do you need to do if you have a GitHub organization? {: id="to-do"} -Make sure you [approve Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if you haven't done it yet. +Make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if you haven't done it yet. To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents), and has requested additional permissions for it. +![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) + If you have any questions or need help, please contact . ## Removal of repository permissions for Administration -To ensure you have the necessary time to [approve Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization before the removal of repository permissions for Administration, Codacy will execute a phased rollout according to the timeline below: +To ensure the [Codacy GitHub App updated permissions are approved](#to-do) on your GitHub organization before the removal of repository permissions for Administration, Codacy will execute a phased rollout according to the timeline below: @@ -35,7 +37,7 @@ To ensure you have the necessary time to [approve Codacy GitHub App updated perm @@ -43,7 +45,7 @@ To ensure you have the necessary time to [approve Codacy GitHub App updated perm @@ -51,7 +53,7 @@ To ensure you have the necessary time to [approve Codacy GitHub App updated perm diff --git a/docs/release-notes/images/2023-12-DD-gh-updated-permissions.png b/docs/release-notes/images/2023-12-DD-gh-updated-permissions.png new file mode 100644 index 0000000000000000000000000000000000000000..c1d978d0caef2f6846a72930378ddb33303983a4 GIT binary patch literal 84907 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 Date: Wed, 13 Dec 2023 12:12:37 +0000 Subject: [PATCH 11/44] toolchain: Remove Python fix --- .github/workflows/mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mkdocs.yml b/.github/workflows/mkdocs.yml index 9f8c168fc6..49a27c8502 100644 --- a/.github/workflows/mkdocs.yml +++ b/.github/workflows/mkdocs.yml @@ -20,7 +20,7 @@ jobs: - name: Set up Python uses: actions/setup-python@v5 with: - python-version: "3.11" + python-version: "3.x" cache: "pip" - name: Install dependencies From 9a0b161d4168974f1d45ae63ba6afb63613da4a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 13 Dec 2023 12:14:32 +0000 Subject: [PATCH 12/44] clean: Small tweak --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index e927568c77..f658569fca 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -13,7 +13,7 @@ This change translates into an important security improvement by reducing the li ## What do you need to do if you have a GitHub organization? {: id="to-do"} -Make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if you haven't done it yet. +Make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if not done yet. To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents), and has requested additional permissions for it. From 1b700ac4776a71e41d9fc3500bf292abe76f1508 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 13 Dec 2023 17:59:24 +0000 Subject: [PATCH 13/44] clean: Tweak for clarity --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index f658569fca..2e6f63241b 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -15,7 +15,7 @@ This change translates into an important security improvement by reducing the li Make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if not done yet. -To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents), and has requested additional permissions for it. +To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). Thus, organization owners will be notified to review a request for this additional permission: ![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) From 0c322508fa1640e002ab896e1630ba40ce03bcdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 15 Dec 2023 12:05:36 +0000 Subject: [PATCH 14/44] clean: Tweak for US English Co-authored-by: Nicola Klemenc --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 2e6f63241b..84312423a8 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -7,7 +7,7 @@ rss_href: /feed_rss_created.xml !!! info "This release note applies only to GitHub" -For increased security, Codacy is deprecating the usage of **repository SSH keys** for Git operations on GitHub in favour of **installation access tokens**. +For increased security, Codacy is deprecating the usage of **repository SSH keys** for Git operations on GitHub in favor of **installation access tokens**. This change translates into an important security improvement by reducing the liability of Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). From a286c5c6f25b9af1f31c12b07ff31b01ba3bd6dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 15 Dec 2023 12:10:27 +0000 Subject: [PATCH 15/44] clean: Tweaks for clarity Co-authored-by: Nicola Klemenc --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 84312423a8..649500137f 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -52,7 +52,7 @@ To ensure the [Codacy GitHub App updated permissions are approved](#to-do) on yo From b9d241f72167660df1858f92ed00ebd33eed87a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 15 Dec 2023 12:22:16 +0000 Subject: [PATCH 16/44] clean: Tweak Co-authored-by: Nicola Klemenc --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 649500137f..fa515ad60f 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -15,7 +15,7 @@ This change translates into an important security improvement by reducing the li Make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if not done yet. -To use installation access tokens, Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). Thus, organization owners will be notified to review a request for this additional permission: +To use installation access tokens, the Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). Thus, organization owners will be notified to review a request for this additional permission: ![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) From 11d21a1c11d10130655af78175a9e379f17c69f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 15 Dec 2023 12:34:44 +0000 Subject: [PATCH 17/44] clean: Tweaks for clarity --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index fa515ad60f..8693548f92 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -45,7 +45,7 @@ To ensure the [Codacy GitHub App updated permissions are approved](#to-do) on yo From a4411449a33bfe01cbee85c0c4b340a5d856c115 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 15 Dec 2023 16:32:26 +0000 Subject: [PATCH 18/44] clean: Tweak for clarity Co-authored-by: Nicola Klemenc --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 8693548f92..2858d668b4 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -13,7 +13,7 @@ This change translates into an important security improvement by reducing the li ## What do you need to do if you have a GitHub organization? {: id="to-do"} -Make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if not done yet. +Make sure an organization owner [approves the updated permissions for the Codacy GitHub App](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if not done yet. To use installation access tokens, the Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). Thus, organization owners will be notified to review a request for this additional permission: From 2c6735e1192816c4cfbcdb3b8d1ff112ee21d3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 9 Jan 2024 17:24:32 +0000 Subject: [PATCH 19/44] clean: Update release note title --- .../cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md | 2 +- docs/release-notes/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md index 2858d668b4..c71631212e 100644 --- a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md +++ b/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md @@ -3,7 +3,7 @@ rss_title: Codacy release notes RSS feed rss_href: /feed_rss_created.xml --- -# Codacy no longer requests repository permissions for Administration on GitHub December DD, 2023 +# Deprecation of SSH keys for GitHub repositories January DD, 2024 !!! info "This release note applies only to GitHub" diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index df50ffb2a8..edb7449aaa 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,7 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2023 -- [Codacy no longer requests repository permissions for Administration on GitHub December DD, 2023](cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md) +- [Deprecation of SSH keys for GitHub repositories January DD, 2024](cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md) - [Cloud December 2023](cloud/cloud-2023-12.md) - [Cloud November 2023](cloud/cloud-2023-11.md) - [Rollout of new Coverage engine November 23, 2023](cloud/cloud-2023-11-23-new-coverage-engine-status-checks.md) From bd668b33766feb4418553c86149ca00953211147 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 9 Jan 2024 17:27:33 +0000 Subject: [PATCH 20/44] clean: Rename file --- ...d => cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md} | 0 docs/release-notes/index.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/release-notes/cloud/{cloud-2023-12-DD-gh-admin-permission-not-requested.md => cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md} (100%) diff --git a/docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md similarity index 100% rename from docs/release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md rename to docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index edb7449aaa..cafffdbafe 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,7 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2023 -- [Deprecation of SSH keys for GitHub repositories January DD, 2024](cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md) +- [Deprecation of SSH keys for GitHub repositories January DD, 2024](cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md) - [Cloud December 2023](cloud/cloud-2023-12.md) - [Cloud November 2023](cloud/cloud-2023-11.md) - [Rollout of new Coverage engine November 23, 2023](cloud/cloud-2023-11-23-new-coverage-engine-status-checks.md) From a8db1a1a0739ded59c6f43dcb537ac0c75565af4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 9 Jan 2024 17:39:21 +0000 Subject: [PATCH 21/44] fix: Fix file name in mkdocs.yml and add 2024 entry in cloud release notes index --- docs/release-notes/index.md | 5 ++++- mkdocs.yml | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index cafffdbafe..b6f5a06ab7 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -16,9 +16,12 @@ For product updates that are in progress or planned [visit the Codacy public roa ## Codacy Cloud release notes {: id="cloud"} -2023 +2024 - [Deprecation of SSH keys for GitHub repositories January DD, 2024](cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md) + +2023 + - [Cloud December 2023](cloud/cloud-2023-12.md) - [Cloud November 2023](cloud/cloud-2023-11.md) - [Rollout of new Coverage engine November 23, 2023](cloud/cloud-2023-11-23-new-coverage-engine-status-checks.md) diff --git a/mkdocs.yml b/mkdocs.yml index a380eafeed..66ab5c2158 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -659,8 +659,9 @@ nav: - Release notes: - release-notes/index.md - Cloud: + - 2024: + - release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md - 2023: - - release-notes/cloud/cloud-2023-12-DD-gh-admin-permission-not-requested.md - release-notes/cloud/cloud-2023-12.md - release-notes/cloud/cloud-2023-11.md - release-notes/cloud/cloud-2023-11-23-new-coverage-engine-status-checks.md From 1d28f94bd70286f760cac00b1a683e7df6732509 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 9 Jan 2024 18:13:04 +0000 Subject: [PATCH 22/44] feat: Update rollout timeline --- ...-01-DD-gh-repository-ssh-keys-deprecation.md | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index c71631212e..5a9347e4f5 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -33,15 +33,15 @@ To ensure the [Codacy GitHub App updated permissions are approved](#to-do) on yo - - + + - + - + + + + + +
Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated repositories SSH keys usage

From this day on, repositories SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

-

If you haven't done it yet, make sure you approve Codacy GitHub App updated permissions on your GitHub organization.

+

If not done yet, make sure an organization owner approves Codacy GitHub App updated permissions on your GitHub organization.

Brownout of repository permissions for Administration

On this day, Codacy won't use any fallback mechanism if the Contents permission is missing.

-

This will help you confirm that you already approved the updated permissions for Codacy GitHub App.
If on this date your Codacy quality analysis fail or you have problems adding new repositories to Codacy, make sure you approve Codacy GitHub App updated permissions on your GitHub organization.

+

This will help you confirm that you already approved the updated permissions for Codacy GitHub App.
If on this date your Codacy quality analysis fail or you have problems adding new repositories to Codacy, make sure an organization owner approves Codacy GitHub App updated permissions on your GitHub organization.

Codacy will remove repository permissions for Administration and drop the usage of repository SSH keys

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories with no fallback mechanisms, and will no longer store repositories SSH keys. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

-

If on this date you haven't approved Codacy GitHub App updated permissions on your GitHub organization, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until you approve the updated permissions.

+

If on this date the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

MM DD, 2024 Codacy will remove repository permissions for Administration and drop the usage of repository SSH keys -

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories with no fallback mechanisms, and will no longer store repositories SSH keys. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

+

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories, with no fallback mechanisms, and will no longer store repository SSH keys. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

If on this date the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

Brownout of repository permissions for Administration

On this day, Codacy won't use any fallback mechanism if the Contents permission is missing.

-

This will help you confirm that you already approved the updated permissions for Codacy GitHub App.
If on this date your Codacy quality analysis fail or you have problems adding new repositories to Codacy, make sure an organization owner approves Codacy GitHub App updated permissions on your GitHub organization.

+

This will help you confirm that the updated permissions for the Codacy GitHub App were already approved for your organization.
If on this date your Codacy quality analysis fails or you have problems adding new repositories to Codacy, make sure an organization owner approves the updated permissions for the Codacy GitHub App on your GitHub organization.

December DD, 2023Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated repositories SSH keys usageJanuary DD, 2024Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated the usage of repositories SSH keys

From this day on, repositories SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

If not done yet, make sure an organization owner approves Codacy GitHub App updated permissions on your GitHub organization.

January DD, 2024February 12, 2024 Brownout of repository permissions for Administration

On this day, Codacy won't use any fallback mechanism if the Contents permission is missing.

@@ -49,12 +49,19 @@ To ensure the [Codacy GitHub App updated permissions are approved](#to-do) on yo
MM DD, 2024February 19, 2024 Codacy will remove repository permissions for Administration and drop the usage of repository SSH keys -

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories, with no fallback mechanisms, and will no longer store repository SSH keys. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

+

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories, with no fallback mechanisms. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

If on this date the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

To defineCodacy will no longer store repository SSH keys +

On this day, Codacy will delete all the repository SSH keys stored in our systems.

+
From 158d1f734abe9dd1b559361fe44600e1e3134f24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Tue, 9 Jan 2024 18:29:07 +0000 Subject: [PATCH 23/44] clean: Update links to GH documentation --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 5a9347e4f5..b242768286 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -9,13 +9,13 @@ rss_href: /feed_rss_created.xml For increased security, Codacy is deprecating the usage of **repository SSH keys** for Git operations on GitHub in favor of **installation access tokens**. -This change translates into an important security improvement by reducing the liability of Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). +This change translates into an important security improvement by reducing the liability of Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). ## What do you need to do if you have a GitHub organization? {: id="to-do"} -Make sure an organization owner [approves the updated permissions for the Codacy GitHub App](https://docs.github.com/en/apps/using-github-apps/approving-updated-permissions-for-a-github-app) on your GitHub organization, if not done yet. +Make sure an organization owner [approves the updated permissions for the Codacy GitHub App](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization, if not done yet. -To use installation access tokens, the Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/enterprise-cloud@latest/rest/overview/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). Thus, organization owners will be notified to review a request for this additional permission: +To use installation access tokens, the Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). Thus, organization owners will be notified to review a request for this additional permission: ![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) From d92e113db5f7354a01cb639960b31e9a34a88f1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 13:17:14 +0000 Subject: [PATCH 24/44] feat: Improve the message, clarify permissions changes --- ...1-DD-gh-repository-ssh-keys-deprecation.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index b242768286..c99bfffe5b 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -9,21 +9,32 @@ rss_href: /feed_rss_created.xml For increased security, Codacy is deprecating the usage of **repository SSH keys** for Git operations on GitHub in favor of **installation access tokens**. -This change translates into an important security improvement by reducing the liability of Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). +This change translates into important security improvements: + +- It reduces the liability of the Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). +- Contrary to SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. + +To minimize any impact, Codacy is now deprecating the usage of repository SSH keys and will delete them from our systems only at a later stage. [See the rollout timeline](#timeline) for more details. + +## Changes on the Codacy GitHub App required permissions {: id="changes-permissions"} + +To use installation access tokens, the Codacy GitHub App now requires [repository read permissions for Contents](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). + +On the other hand, the Codacy GitHub App no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). This permission will be removed from the Codacy GitHub App according to the [rollout timeline](#timeline). ## What do you need to do if you have a GitHub organization? {: id="to-do"} Make sure an organization owner [approves the updated permissions for the Codacy GitHub App](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization, if not done yet. -To use installation access tokens, the Codacy GitHub App requires [repository read permissions for Contents](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). Thus, organization owners will be notified to review a request for this additional permission: +Codacy has been requesting this permission since September 2023. Organization owners should had received a GitHub notification to review a request for this additional permission: ![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) If you have any questions or need help, please contact . -## Removal of repository permissions for Administration +## Removal of repository permissions for Administration and SSH keys {: id="timeline"} -To ensure the [Codacy GitHub App updated permissions are approved](#to-do) on your GitHub organization before the removal of repository permissions for Administration, Codacy will execute a phased rollout according to the timeline below: +To ensure the conditions to use installation access tokens on GitHub organizations are met before the removal of repository permissions for Administration and SSH keys, Codacy will execute a phased rollout according to the timeline below: From 073b5f180b0684de7bde69563ec153456ae1a209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 13:19:11 +0000 Subject: [PATCH 25/44] todo: Add TODOs to update date --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index c99bfffe5b..7a362e620a 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -3,7 +3,7 @@ rss_title: Codacy release notes RSS feed rss_href: /feed_rss_created.xml --- -# Deprecation of SSH keys for GitHub repositories January DD, 2024 +# Deprecation of SSH keys for GitHub repositories January DD, 2024 !!! info "This release note applies only to GitHub" @@ -44,7 +44,7 @@ To ensure the conditions to use installation access tokens on GitHub organizatio - +
January DD, 2024January DD, 2024 Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated the usage of repositories SSH keys

From this day on, repositories SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

From bfb6d48d9d2794bf761ccc1f4e86be7f4b2990d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 16:48:45 +0000 Subject: [PATCH 26/44] clean: Small tweak --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 7a362e620a..4432d87913 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -12,7 +12,7 @@ For increased security, Codacy is deprecating the usage of **repository SSH keys This change translates into important security improvements: - It reduces the liability of the Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). -- Contrary to SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. +- Contrary to long-living SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. To minimize any impact, Codacy is now deprecating the usage of repository SSH keys and will delete them from our systems only at a later stage. [See the rollout timeline](#timeline) for more details. From 9dd6f9e02d33afe3955141e77755311359544409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 17:19:09 +0000 Subject: [PATCH 27/44] clean: Tweaks. Add link to GH App permissions section --- ...ich-permissions-does-codacy-need-from-my-account.md | 2 +- ...ud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md index 8b7f487fe2..3c3b3cc783 100644 --- a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md +++ b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md @@ -207,7 +207,7 @@ If you need to use an integration that you have previously revoked, log in again ## Why does Codacy ask for permission to create SSH keys? !!! note - **GitHub only:** Codacy will soon start using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. + **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the SSH keys deprecation notice](../release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md). To ensure Codacy keeps working correctly, make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization. diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 4432d87913..91b17b7ec2 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -7,14 +7,14 @@ rss_href: /feed_rss_created.xml !!! info "This release note applies only to GitHub" -For increased security, Codacy is deprecating the usage of **repository SSH keys** for Git operations on GitHub in favor of **installation access tokens**. +For increased security, Codacy deprecated the usage of **repository SSH keys** for Git operations on GitHub in favor of **installation access tokens**. This change translates into important security improvements: -- It reduces the liability of the Codacy GitHub App, as it no longer requests [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). +- It reduces the liability of the Codacy GitHub App, as it no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). - Contrary to long-living SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. -To minimize any impact, Codacy is now deprecating the usage of repository SSH keys and will delete them from our systems only at a later stage. [See the rollout timeline](#timeline) for more details. +To minimize any impact, Codacy deprecated the usage of repository SSH keys for now but will keep use them as a fallback mechanism. At a later stage, Codacy will delete the repository SSH keys stored in our systems. [See the rollout timeline](#timeline) for more details. ## Changes on the Codacy GitHub App required permissions {: id="changes-permissions"} @@ -76,3 +76,7 @@ To ensure the conditions to use installation access tokens on GitHub organizatio
+ +## See also + +- [Which permissions are required by Codacy GitHub App?](../../getting-started/which-permissions-does-codacy-need-from-my-account.md#github-cloud) From b092a02a654769909dd7eff1249ae29720df6e3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 17:24:51 +0000 Subject: [PATCH 28/44] clean: Small tweak --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 91b17b7ec2..0bc1fa0e94 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -14,7 +14,7 @@ This change translates into important security improvements: - It reduces the liability of the Codacy GitHub App, as it no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). - Contrary to long-living SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. -To minimize any impact, Codacy deprecated the usage of repository SSH keys for now but will keep use them as a fallback mechanism. At a later stage, Codacy will delete the repository SSH keys stored in our systems. [See the rollout timeline](#timeline) for more details. +To minimize any impact, Codacy deprecated the usage of repository SSH keys for now but will keep using them as a fallback mechanism at this first stage. At a later stage, Codacy will delete the repository SSH keys stored in our systems. [See the rollout timeline](#timeline) for more details. ## Changes on the Codacy GitHub App required permissions {: id="changes-permissions"} From 1fbcb95d2ce2b6a98da73da6b60a4bc4534c7fe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 17:28:47 +0000 Subject: [PATCH 29/44] clean: Clarify new permission name --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 0bc1fa0e94..d828aebf60 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -26,7 +26,7 @@ On the other hand, the Codacy GitHub App no longer requires [read and write repo Make sure an organization owner [approves the updated permissions for the Codacy GitHub App](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization, if not done yet. -Codacy has been requesting this permission since September 2023. Organization owners should had received a GitHub notification to review a request for this additional permission: +Codacy has been requesting repository read permissions for **Contents** since September 2023. Organization owners should had received a GitHub notification to review a request for this additional permission: ![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) From ce2c47f90c353a7232f48111d94c8aa32489c2ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 17:30:07 +0000 Subject: [PATCH 30/44] wip: Add TODO to rename image --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index d828aebf60..e45296e1e3 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -28,7 +28,7 @@ Make sure an organization owner [approves the updated permissions for the Codacy Codacy has been requesting repository read permissions for **Contents** since September 2023. Organization owners should had received a GitHub notification to review a request for this additional permission: -![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) +![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) If you have any questions or need help, please contact . From 523a8ea3482ca3f0a406cdb00fead8cfbfea501d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 17:48:52 +0000 Subject: [PATCH 31/44] clean: Tweaks --- ...cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index e45296e1e3..f4ffa47b7a 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -14,13 +14,13 @@ This change translates into important security improvements: - It reduces the liability of the Codacy GitHub App, as it no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). - Contrary to long-living SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. -To minimize any impact, Codacy deprecated the usage of repository SSH keys for now but will keep using them as a fallback mechanism at this first stage. At a later stage, Codacy will delete the repository SSH keys stored in our systems. [See the rollout timeline](#timeline) for more details. +To minimize any impact, Codacy deprecated the usage of repository SSH keys for now but will keep using them as a fallback mechanism at this first stage. At a later stage, Codacy will [delete the repository SSH keys](#timeline) stored in our systems. ## Changes on the Codacy GitHub App required permissions {: id="changes-permissions"} To use installation access tokens, the Codacy GitHub App now requires [repository read permissions for Contents](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). -On the other hand, the Codacy GitHub App no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). This permission will be removed from the Codacy GitHub App according to the [rollout timeline](#timeline). +On the other hand, the Codacy GitHub App no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). This permission will be [removed from the Codacy GitHub App](#timeline) at a later stage. ## What do you need to do if you have a GitHub organization? {: id="to-do"} @@ -61,9 +61,9 @@ To ensure the conditions to use installation access tokens on GitHub organizatio February 19, 2024 - Codacy will remove repository permissions for Administration and drop the usage of repository SSH keys + Codacy will remove repository permissions for Administration from the Codacy GitHub App and drop the usage of repository SSH keys -

Codacy will start using exclusively installation access tokens to clone and integrate with your repositories, with no fallback mechanisms. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

+

Codacy will start using installation access tokens to clone and integrate with your repositories, with no fallback mechanisms. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

If on this date the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

From c223e01ad39a9b2f4d85bb5aba41fec7f5c901b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Wed, 10 Jan 2024 17:51:20 +0000 Subject: [PATCH 32/44] clean: Tweak link text --- .../which-permissions-does-codacy-need-from-my-account.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md index 3c3b3cc783..bde1e40460 100644 --- a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md +++ b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md @@ -207,7 +207,7 @@ If you need to use an integration that you have previously revoked, log in again ## Why does Codacy ask for permission to create SSH keys? !!! note - **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the SSH keys deprecation notice](../release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md). + **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the deprecation notice of SSH keys for GitHub repositories](../release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md). To ensure Codacy keeps working correctly, make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization. From 7071d61360da421411c9438dc5ea3d4e456080a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Thu, 11 Jan 2024 10:23:35 +0000 Subject: [PATCH 33/44] fix: Fix typo Co-authored-by: Nicola Klemenc --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index f4ffa47b7a..3ddb9d4589 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -26,7 +26,7 @@ On the other hand, the Codacy GitHub App no longer requires [read and write repo Make sure an organization owner [approves the updated permissions for the Codacy GitHub App](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization, if not done yet. -Codacy has been requesting repository read permissions for **Contents** since September 2023. Organization owners should had received a GitHub notification to review a request for this additional permission: +Codacy has been requesting repository read permissions for **Contents** since September 2023. Organization owners should have received a GitHub notification to review a request for this additional permission: ![Codacy GitHub App updated permissions request](../images/2023-12-DD-gh-updated-permissions.png) From 864d87177deb92897f36cf25119ddaf462f543a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Thu, 11 Jan 2024 10:26:38 +0000 Subject: [PATCH 34/44] fix: Grammar fix Co-authored-by: Nicola Klemenc --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 3ddb9d4589..8bfa9f54b4 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -45,9 +45,9 @@ To ensure the conditions to use installation access tokens on GitHub organizatio January DD, 2024 - Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated the usage of repositories SSH keys + Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated the usage of repository SSH keys -

From this day on, repositories SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

+

From this day on, repository SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

If not done yet, make sure an organization owner approves Codacy GitHub App updated permissions on your GitHub organization.

From 6c3ea23879c0d0abdba129089bf74012bfc640ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 16:11:29 +0000 Subject: [PATCH 35/44] clean: Update terminology according to feedback --- ...-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 8bfa9f54b4..21c86a0d03 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -3,18 +3,18 @@ rss_title: Codacy release notes RSS feed rss_href: /feed_rss_created.xml --- -# Deprecation of SSH keys for GitHub repositories January DD, 2024 +# Discontinuation of SSH keys for GitHub repositories January DD, 2024 !!! info "This release note applies only to GitHub" -For increased security, Codacy deprecated the usage of **repository SSH keys** for Git operations on GitHub in favor of **installation access tokens**. +For increased security, Codacy is discontinuing the usage of **repository SSH keys** for Git operations on GitHub in favor of **installation access tokens**. This change translates into important security improvements: - It reduces the liability of the Codacy GitHub App, as it no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). - Contrary to long-living SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. -To minimize any impact, Codacy deprecated the usage of repository SSH keys for now but will keep using them as a fallback mechanism at this first stage. At a later stage, Codacy will [delete the repository SSH keys](#timeline) stored in our systems. +To minimize any impact, Codacy is currently discontinuing the usage of repository SSH keys but will keep using them as a fallback mechanism at this first stage. At a later stage, Codacy will [stop using repository SSH keys and delete the keys](#timeline) stored in our systems. ## Changes on the Codacy GitHub App required permissions {: id="changes-permissions"} @@ -45,7 +45,7 @@ To ensure the conditions to use installation access tokens on GitHub organizatio January DD, 2024 - Codacy started using installation access tokens to clone and integrate with your repositories, and deprecated the usage of repository SSH keys + Codacy started using installation access tokens to clone and integrate with your repositories

From this day on, repository SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

If not done yet, make sure an organization owner approves Codacy GitHub App updated permissions on your GitHub organization.

@@ -61,10 +61,10 @@ To ensure the conditions to use installation access tokens on GitHub organizatio February 19, 2024 - Codacy will remove repository permissions for Administration from the Codacy GitHub App and drop the usage of repository SSH keys + Codacy will remove repository permissions for Administration from the Codacy GitHub App and stop using repository SSH keys

Codacy will start using installation access tokens to clone and integrate with your repositories, with no fallback mechanisms. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

-

If on this date the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

+

If on this day the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

From 17782b242a3d36917aab5160d2a35597610cf0ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 16:13:28 +0000 Subject: [PATCH 36/44] feat: Update release date --- .../cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md index 21c86a0d03..442b0b1ecc 100644 --- a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md +++ b/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md @@ -3,7 +3,7 @@ rss_title: Codacy release notes RSS feed rss_href: /feed_rss_created.xml --- -# Discontinuation of SSH keys for GitHub repositories January DD, 2024 +# Discontinuation of SSH keys for GitHub repositories January 12, 2024 !!! info "This release note applies only to GitHub" @@ -44,7 +44,7 @@ To ensure the conditions to use installation access tokens on GitHub organizatio - January DD, 2024 + January 12, 2024 Codacy started using installation access tokens to clone and integrate with your repositories

From this day on, repository SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

From a369df44173ebc91e45799ce007c8cd20c98c171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 16:26:28 +0000 Subject: [PATCH 37/44] clean: Rename MD file for consistency --- .../which-permissions-does-codacy-need-from-my-account.md | 2 +- ... cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md} | 0 docs/release-notes/index.md | 2 +- mkdocs.yml | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename docs/release-notes/cloud/{cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md => cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md} (100%) diff --git a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md index bde1e40460..65e58b657d 100644 --- a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md +++ b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md @@ -207,7 +207,7 @@ If you need to use an integration that you have previously revoked, log in again ## Why does Codacy ask for permission to create SSH keys? !!! note - **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the deprecation notice of SSH keys for GitHub repositories](../release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md). + **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the deprecation notice of SSH keys for GitHub repositories](../release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md). To ensure Codacy keeps working correctly, make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization. diff --git a/docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md similarity index 100% rename from docs/release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md rename to docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index b6f5a06ab7..08bacc6176 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,7 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2024 -- [Deprecation of SSH keys for GitHub repositories January DD, 2024](cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md) +- [Deprecation of SSH keys for GitHub repositories January DD, 2024](cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md) 2023 diff --git a/mkdocs.yml b/mkdocs.yml index 66ab5c2158..8e2aac822e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -660,7 +660,7 @@ nav: - release-notes/index.md - Cloud: - 2024: - - release-notes/cloud/cloud-2024-01-DD-gh-repository-ssh-keys-deprecation.md + - release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md - 2023: - release-notes/cloud/cloud-2023-12.md - release-notes/cloud/cloud-2023-11.md From b1b49c685b731a3cc47e186fe25277ab8736a177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 16:32:32 +0000 Subject: [PATCH 38/44] feat: Update release note title in TOC --- docs/release-notes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 08bacc6176..015716ccae 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,7 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2024 -- [Deprecation of SSH keys for GitHub repositories January DD, 2024](cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md) +- [Discontinuation of SSH keys for GitHub repositories January 12, 2024](cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md) 2023 From 82424d1197e8625eb2506e25e9a56e4040bd51e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 16:43:48 +0000 Subject: [PATCH 39/44] clean: Tweak according to feedback --- .../cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md index 442b0b1ecc..a90d8d8545 100644 --- a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md +++ b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md @@ -11,7 +11,7 @@ For increased security, Codacy is discontinuing the usage of **repository SSH ke This change translates into important security improvements: -- It reduces the liability of the Codacy GitHub App, as it no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). +- It limits the access level of the Codacy GitHub App, as it no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). - Contrary to long-living SSH keys, [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) expire after one hour and Codacy loses access when the GitHub App is uninstalled. To minimize any impact, Codacy is currently discontinuing the usage of repository SSH keys but will keep using them as a fallback mechanism at this first stage. At a later stage, Codacy will [stop using repository SSH keys and delete the keys](#timeline) stored in our systems. From 0c0b4963264df9b2034946464a0da6f1f084e22f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 17:01:13 +0000 Subject: [PATCH 40/44] clean: Tweak for correctness according to feedback --- .../cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md index a90d8d8545..2d79f348e4 100644 --- a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md +++ b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md @@ -20,7 +20,7 @@ To minimize any impact, Codacy is currently discontinuing the usage of repositor To use installation access tokens, the Codacy GitHub App now requires [repository read permissions for Contents](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-contents). -On the other hand, the Codacy GitHub App no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). This permission will be [removed from the Codacy GitHub App](#timeline) at a later stage. +On the other hand, the usage of installation access tokens no longer requires [read and write repository permissions for Administration](https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps?apiVersion=2022-11-28#repository-permissions-for-administration). The Codacy GitHub App still requests this permission during this first stage, while using repository SSH keys as a fallback mechanism. At a later stage, Codacy will [remove the permission from the GitHub App](#timeline). ## What do you need to do if you have a GitHub organization? {: id="to-do"} From 4d7628a1196e29b9da8053e635c4e47809cfff4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 17:17:50 +0000 Subject: [PATCH 41/44] feat: Add step to revoke keys on GH side --- .../cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md index 2d79f348e4..a63b50cf31 100644 --- a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md +++ b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md @@ -64,7 +64,7 @@ To ensure the conditions to use installation access tokens on GitHub organizatio Codacy will remove repository permissions for Administration from the Codacy GitHub App and stop using repository SSH keys

Codacy will start using installation access tokens to clone and integrate with your repositories, with no fallback mechanisms. Also, repository permissions for Administration will be removed from the Codacy GitHub App.

-

If on this day the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

+

If on this day the Codacy GitHub App updated permissions haven't been approved on your GitHub organization yet, your Codacy quality analysis will fail and you'll not be able to add new repositories to Codacy until an organization owner approves the updated permissions.

@@ -72,6 +72,7 @@ To ensure the conditions to use installation access tokens on GitHub organizatio Codacy will no longer store repository SSH keys

On this day, Codacy will delete all the repository SSH keys stored in our systems.

+

For increased security, you can revoke the keys created by Codacy on your GitHub repository.

From 2ebeb5599c039f45b6322446ed4a87ab7b4738e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Fri, 12 Jan 2024 17:40:35 +0000 Subject: [PATCH 42/44] clean: Tweak terminology --- .../which-permissions-does-codacy-need-from-my-account.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md index 65e58b657d..07b16778e9 100644 --- a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md +++ b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md @@ -207,7 +207,7 @@ If you need to use an integration that you have previously revoked, log in again ## Why does Codacy ask for permission to create SSH keys? !!! note - **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the deprecation notice of SSH keys for GitHub repositories](../release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md). + **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the discontinuation notice of SSH keys for GitHub repositories](../release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md). To ensure Codacy keeps working correctly, make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization. From 5a786632980301941d626393bc1afc914810e010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Mon, 15 Jan 2024 17:32:04 +0000 Subject: [PATCH 43/44] feat: Update release date --- ...cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md | 4 ++-- docs/release-notes/index.md | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md index a63b50cf31..2a203ad82a 100644 --- a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md +++ b/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md @@ -3,7 +3,7 @@ rss_title: Codacy release notes RSS feed rss_href: /feed_rss_created.xml --- -# Discontinuation of SSH keys for GitHub repositories January 12, 2024 +# Discontinuation of SSH keys for GitHub repositories January 15, 2024 !!! info "This release note applies only to GitHub" @@ -44,7 +44,7 @@ To ensure the conditions to use installation access tokens on GitHub organizatio - January 12, 2024 + January 15, 2024 Codacy started using installation access tokens to clone and integrate with your repositories

From this day on, repository SSH keys are used exclusively as a fallback mechanism when the Contents permission is missing.

diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 015716ccae..b1212d9e9a 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,7 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2024 -- [Discontinuation of SSH keys for GitHub repositories January 12, 2024](cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md) +- [Discontinuation of SSH keys for GitHub repositories January 15, 2024](cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md) 2023 From f996d95a4d499272364aac8d17ba8aeec2fb2516 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A1udia=20Carpinteiro?= Date: Mon, 15 Jan 2024 17:36:25 +0000 Subject: [PATCH 44/44] clean: Rename file for consistency --- .../which-permissions-does-codacy-need-from-my-account.md | 2 +- ... cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md} | 0 docs/release-notes/index.md | 2 +- mkdocs.yml | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) rename docs/release-notes/cloud/{cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md => cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md} (100%) diff --git a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md index 07b16778e9..d976fcc1f8 100644 --- a/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md +++ b/docs/getting-started/which-permissions-does-codacy-need-from-my-account.md @@ -207,7 +207,7 @@ If you need to use an integration that you have previously revoked, log in again ## Why does Codacy ask for permission to create SSH keys? !!! note - **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the discontinuation notice of SSH keys for GitHub repositories](../release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md). + **GitHub only:** Codacy started using [installation access tokens](https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/generating-an-installation-access-token-for-a-github-app#about-installation-access-tokens) instead of SSH keys to integrate with your GitHub repositories and clone them. SSH keys are currently used as a fallback mechanism when the [Contents permission](#github-cloud) isn't available. For more information, [see the discontinuation notice of SSH keys for GitHub repositories](../release-notes/cloud/cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md). To ensure Codacy keeps working correctly, make sure an organization owner [approves Codacy GitHub App updated permissions](https://docs.github.com/en/apps/using-github-apps/reviewing-and-modifying-installed-github-apps) on your GitHub organization. diff --git a/docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md b/docs/release-notes/cloud/cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md similarity index 100% rename from docs/release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md rename to docs/release-notes/cloud/cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index b1212d9e9a..013fb02050 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -18,7 +18,7 @@ For product updates that are in progress or planned [visit the Codacy public roa 2024 -- [Discontinuation of SSH keys for GitHub repositories January 15, 2024](cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md) +- [Discontinuation of SSH keys for GitHub repositories January 15, 2024](cloud/cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md) 2023 diff --git a/mkdocs.yml b/mkdocs.yml index 8e2aac822e..37e2fa449e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -660,7 +660,7 @@ nav: - release-notes/index.md - Cloud: - 2024: - - release-notes/cloud/cloud-2024-01-12-gh-repository-ssh-keys-discontinuation.md + - release-notes/cloud/cloud-2024-01-15-gh-repository-ssh-keys-discontinuation.md - 2023: - release-notes/cloud/cloud-2023-12.md - release-notes/cloud/cloud-2023-11.md