From 7ac7ac6241b4fbaf1cc4eab29214b1480f2455aa Mon Sep 17 00:00:00 2001 From: NimRegev Date: Thu, 29 Sep 2022 08:52:09 +0300 Subject: [PATCH 1/5] Update git token processes --- _docs/administration/user-settings.md | 11 +-- _docs/runtime/monitor-manage-runtimes.md | 83 +++++++++++++++++--- images/runtime/update-git-runtime-token.png | Bin 0 -> 45536 bytes 3 files changed, 77 insertions(+), 17 deletions(-) create mode 100644 images/runtime/update-git-runtime-token.png diff --git a/_docs/administration/user-settings.md b/_docs/administration/user-settings.md index c84072d9..21954e8b 100644 --- a/_docs/administration/user-settings.md +++ b/_docs/administration/user-settings.md @@ -5,13 +5,14 @@ group: administration toc: true --- -As a user in Codefresh, you can manage the access tokens defined in your account, and optionally, enable access for Codefresh support. +As a user in Codefresh, you can authorize access to your Git provider accounts, and optionally, enable access for Codefresh support. * Enable access for Codefresh support Optional. Enable access to your account for troubleshooting purposes. -* Manage Git tokens for authentication +* Authorize Git providers +Git tokens for authentication The Git personal token is a user-specific access token per provisioned runtime, and is required to authenticate Git-based actions per runtime in Codefresh. If your admin has set up authentication with OAuth2, you can authorize access to GitHub using OAuth2. @@ -49,7 +50,7 @@ To authorize with OAuth2, you have to supply your credentials. When authorized, > If you need access to more than one runtime, you can use the same token for multiple runtimes. -You must however authorize GitHub access or add the personal access token individually for each runtime. +You must however authorize Git provider access or add the personal access token individually for each runtime. {% include @@ -68,7 +69,7 @@ To authorize with OAuth2, you have to supply your credentials. When authorized, * To use a Git PAT, generate a valid personal access token from your Git provider **How to** -1. In the CSDP UI, go to [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. +1. In the Codefresh UI, go to [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. 1. Select the runtime, and then select one of the following: * To add a token, select **Add Token**. * To update an existing token by replacing it with a new token, select **Update Token**. @@ -77,7 +78,7 @@ To authorize with OAuth2, you have to supply your credentials. When authorized, * In the Add Token panel, click **Authorize Access to GitHub**. > If the application is not registered, you get an error. For example, _Git app not registered_. Contact your admin for help. * Enter your credentials, and select **Sign In**. - * Complete the verification, for example, if you two-factor authentication is configured. + * Complete the verification, for example, if two-factor authentication is configured. {% include diff --git a/_docs/runtime/monitor-manage-runtimes.md b/_docs/runtime/monitor-manage-runtimes.md index 5c2cebe6..b71188a0 100644 --- a/_docs/runtime/monitor-manage-runtimes.md +++ b/_docs/runtime/monitor-manage-runtimes.md @@ -9,12 +9,18 @@ toc: true --- -The **Runtimes** page displays the provisioned runtimes in your account, both hybrid, and the hosted runtime if you have one. View runtime components and information in List or Topology view formats. Managed provisioned runtimes in the view mode that suits you. +The **Runtimes** page displays the provisioned runtimes in your account, both hybrid, and the hosted runtime if you have one. +Select the view mode to view runtime components and information, and manage provisioned runtimes in the view mode that suits you. > Unless specified otherwise, management options are common to both hybrid and hosted runtimes. -To monitor provisioned hybrid runtimes, including recovering runtimes for failed clusters, see [Monitor provisioned hybrid runtimes]({{site.baseurl}}/docs/runtime/monitoring-troubleshooting/). +* Add managed clusters to hybrid or hosted runtimes (see [Adding & managing external clusters]({{site.baseurl}}/docs/runtime/managed-cluster/)) +* Add and manage Git Sources associated with hybrid or hosted runtimes (see [Adding & managing Git Sources]({{site.baseurl}}/docs/runtime/git-sources/)) +* Upgrade provisioned hybrid runtimes +* Uninstall hybrid or hosted runtimes +* Update Git runtime tokens +To monitor provisioned hybrid runtimes, including recovering runtimes for failed clusters, see [Monitor provisioned hybrid runtimes]({{site.baseurl}}/docs/runtime/monitoring-troubleshooting/). ### Runtime views @@ -76,16 +82,8 @@ Here is a description of the information in the Topology view. |**Health/Sync status** |The health and sync status of the runtime or cluster. {::nomarkdown} {:/} | |**Search and View options** | {::nomarkdown} {:/}| -### Hybrid/hosted runtime management -Work in either the List or Topology views to manage provisioned runtimes. If an option is valid only for hybrid runtimes, it is indicated as such. - -* Add managed clusters to hybrid or hosted runtimes (see [Adding & managing external clusters]({{site.baseurl}}/docs/runtime/managed-cluster/)) -* Add and manage Git Sources associated with hybrid or hosted runtimes (see [Adding & managing Git Sources]({{site.baseurl}}/docs/runtime/git-sources/)) -* Upgrade provisioned hybrid runtimes -* Uninstall hybrid or hosted runtimes - -#### (Hybrid) Upgrade provisioned runtimes +### (Hybrid) Upgrade provisioned runtimes Upgrade provisioned hybrid runtimes to install critical security updates or to install the latest version of all components. Upgrade a provisioned hybrid runtime by running a silent upgrade or through the CLI wizard. If you have managed clusters for the hybrid runtime, upgrading the runtime automatically updates runtime components within the managed cluster as well. @@ -161,7 +159,7 @@ For both silent or CLI-wizard based upgrades, make sure you have: * To manually define the shared configuration repo, add the `--shared-config-repo` flag with the path to the repo. 1. Confirm to start the upgrade. -#### Uninstall provisioned runtimes +### Uninstall provisioned runtimes Uninstall provisioned hybrid and hosted runtimes that are not in use. Uninstall a runtime by running a silent uninstall, or through the CLI wizard. > Uninstalling a runtime removes the Git Sources and managed clusters associated with the runtime. @@ -227,6 +225,67 @@ Pass the mandatory flags in the uninstall command: 1. If you get errors, run the uninstall command again, with the `--force` flag. + +### Update Git runtime tokens + +Provisioned runtimes require valid Git tokens to authenticate the runtimes. + +There are two different situations when you need to updating Git runtime tokens: +* Update invalid, revoked, or expired tokens: Codefresh automatically flags runtimes with such tokens. It is mandatory to update the Git tokens for these runtimes to continue working with the platform. +* Update valid tokens: Optional. You may want to update Git runtime tokens, even valid runtime tokens, by deleting the existing token and replacing it with a new runtime token. + +The methods for updating any Git runtime token is the same regardless of the reason for the update: +* OAuth2 authorization, if your admin has registered an OAuth Application for Codefresh +* Git access token authentication, by generating a personal access token in your Git provider account with the correct permissions + +**Before you begin** +* To authenticate through a Git access token, generate an access token for the runtime with the correct scopes: `repo` and `admin-repo` + +**How to** +1. Do one of the following: + * If you see a notification in the Codefresh UI about invalid runtime tokens, click **[Update Token]**. + In the Runtimes page, you can see runtimes with invalid tokens are prefixed by the key icon. Mouse over shows invalid token. + * To update an existing runtime token, go to [Runtimes](https://g.codefresh.io/2.0/account-settings/runtimes){:target="\_blank"}. +1. Select the runtime for which to update the Git token. +1. From the context menu with the additional actions at the top-right, select **Update Git Runtime token**. + + {% include + image.html + lightbox="true" + file="/images/runtime/update-git-runtime-token.png" + url="/images/runtime/update-git-runtime-token.png" + alt="Update Git runtime token option" + caption="Update Git runtime token option" + max-width="40%" +%} + +{:start="4"} +1. Do one of the following: + * If your admin has set up OAuth access, click **Authorize Access to Git Provider**. Go to _step 5_. + * Alternatively, authenticate with an access token from your Git provider. Go to _step 6_. + +{:start="5"} +1. For OAuth2 authorization: + > If the application is not registered, you get an error. Contact your admin for help. + * Enter your credentials, and select **Sign In**. + * If required, as for example if two-factor authentication is configured, complete the verification. + + {% include + image.html + lightbox="true" + file="/images/administration/user-settings/oauth-user-authentication.png" + url="/images/administration/user-settings/oauth-user-authentication.png" + alt="Authorizing access with OAuth2" + caption="Authorizing access with OAuth2" + max-width="30%" + %} + +{:start="6"} +1. For Git token authentication, expand **Advanced authorization options**, and then paste the generated token in the **Git runtime token** field. + +1. Click **Update Token**. + + ### Related articles [Monitor provisioned hybrid runtimes]({{site.baseurl}}/docs/runtime/monitoring-troubleshooting/) [Add Git Sources to runtimes]({{site.baseurl}}/docs/runtime/git-sources/) diff --git a/images/runtime/update-git-runtime-token.png b/images/runtime/update-git-runtime-token.png new file mode 100644 index 0000000000000000000000000000000000000000..dc3e1e67f5cd228af895c816f3596bebac34d397 GIT binary patch literal 45536 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 literal 0 HcmV?d00001 From 625a7cd08d3a289e227d01a01ee128418411d056 Mon Sep 17 00:00:00 2001 From: NimRegev Date: Sun, 2 Oct 2022 08:57:08 +0300 Subject: [PATCH 2/5] Update token topics Updated reference and user settings topics for git token (pending new screesnhots) --- _docs/administration/user-settings.md | 92 ++++++++------------------- _docs/reference/git-tokens.md | 33 ++++------ 2 files changed, 38 insertions(+), 87 deletions(-) diff --git a/_docs/administration/user-settings.md b/_docs/administration/user-settings.md index 21954e8b..91cc9e5e 100644 --- a/_docs/administration/user-settings.md +++ b/_docs/administration/user-settings.md @@ -5,19 +5,18 @@ group: administration toc: true --- -As a user in Codefresh, you can authorize access to your Git provider accounts, and optionally, enable access for Codefresh support. +As a user in Codefresh, you can manage your account by authorizing access to your Git provider accounts, and optionally, enabling access for Codefresh support. * Enable access for Codefresh support - Optional. Enable access to your account for troubleshooting purposes. -* Authorize Git providers -Git tokens for authentication - - The Git personal token is a user-specific access token per provisioned runtime, and is required to authenticate Git-based actions per runtime in Codefresh. - If your admin has set up authentication with OAuth2, you can authorize access to GitHub using OAuth2. - Or, you can always generate a personal access token from GitHub and then add the same to Codefresh to authorize access. +* Authorize Git providers + The Git personal token is a user-specific access token per provisioned runtime, and is required to authenticate Git-based actions when using Codefresh. + If your admin has set up authentication with OAuth2, you can authorize access using OAuth2. + Or, you can always generate a personal access token from your Git provider and then add the same to Codefresh to authorize access. + > If you need access to more than one runtime, you can use the same token for multiple runtimes. + You must however authorize access individually for each runtime. ### Enable access for Codefresh support Enable Codefresh support personnel to access your user account. Access to your account is useful for visibility during troubleshooting. @@ -39,77 +38,40 @@ You can disable this security setting at any time. max-width="50%" %} +### Authorize Git access with OAuth2 or personal access tokens +Authorize Git access with OAuth2 if your account admin has set up Codefresh as an OAuth application, or alternatively through personal access tokens from your Git provider. +* For OAuth2: The adminstrator pre-configures the permissions and expiry date. Once you supply your credentials for authorization, you are automatically directed to the Git Personal Tokens page. +* For Git PAT: Generate a valid personal access token from your Git provider with `repo` scope for commits and other actions. -### Update/delete Git personal access tokens -Update your Git personal access token for hosted and hybrid runtimes when needed from the User Settings page. -To authorize with OAuth2, you have to supply your credentials. When authorized, you are automatically directed to the Git Personal Tokens page. - -* For OAuth2, the permissions and expiry date are pre-configured by the administrator. -* For Git personal access tokens, when generating a new token, make sure you select `repo` scope for commits and other actions. - - -> If you need access to more than one runtime, you can use the same token for multiple runtimes. -You must however authorize Git provider access or add the personal access token individually for each runtime. - - -{% include - image.html - lightbox="true" - file="/images/getting-started/github-pat.png" - url="/images/getting-started/github-pat.png" - alt="Permissions for Git personal token" - caption="Permissions for Git personal token" - max-width="50%" -%} - -To authorize with OAuth2, you have to supply your credentials. When authorized, you are automatically directed to the Git Personal Tokens page. +{::nomarkdown} +
+{:/} -**Before you begin** -* To use a Git PAT, generate a valid personal access token from your Git provider -**How to** 1. In the Codefresh UI, go to [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. 1. Select the runtime, and then select one of the following: * To add a token, select **Add Token**. * To update an existing token by replacing it with a new token, select **Update Token**. - * To delete an existing token, select **Delete Token**. 1. For OAuth2: - * In the Add Token panel, click **Authorize Access to GitHub**. - > If the application is not registered, you get an error. For example, _Git app not registered_. Contact your admin for help. - * Enter your credentials, and select **Sign In**. - * Complete the verification, for example, if two-factor authentication is configured. - - - {% include - image.html - lightbox="true" - file="/images/administration/user-settings/oauth-user-authentication.png" - url="/images/administration/user-settings/oauth-user-authentication.png" - alt="Authorizing access with OAuth2" - caption="Authorizing access with OAuth2" - max-width="30%" - %} - - + > If the application is not registered, the button is disabled. Contact your admin for help. + * Click **Authorize Access to GitHub**. + * Enter your credentials, and select **Sign In**. + * Complete the verification if required, as when two-factor authentication is configured, for example. + {:start="4"} 1. For Git personal access tokens: - Paste the generated token in the **Token** field, and select **+Add Token**. - - {% include - image.html - lightbox="true" - file="/images/administration/user-settings/user-settings-pat.png" - url="/images/administration/user-settings/user-settings-pat.png" - alt="Adding a Git personal access token" - caption="Adding a Git personal access token" - max-width="30%" - %} - + * Expand **Advanced authorization options**. + + * In the **Git Personal Access Token** field, paste the token you generated. -The token is generated and you are redirected to the User Settings page where you can see the new Git token assigned to the runtime. + +{:start="5"} +1. Click **Add Token**. + In the Git Personal Access Tokens list, you can see that the new token is assigned to the runtime. + ### Related articles [Git tokens in Codefresh]({{site.baseurl}}/docs/reference/git-tokens/) \ No newline at end of file diff --git a/_docs/reference/git-tokens.md b/_docs/reference/git-tokens.md index 603d50f1..b8be1c95 100644 --- a/_docs/reference/git-tokens.md +++ b/_docs/reference/git-tokens.md @@ -10,17 +10,19 @@ toc: true Codefresh requires two types of Git tokens for authentication: -* A token per runtime (Git runtime token) +* A token for runtime installation (Git runtime token) * A personal access token for each runtime, unique to every user (Git user token) -You can update expired, revoked, or invalid Git runtime and personal user tokens. +The Git runtime token is used for runtime installation. After installation, you need to authorize Git access for every provisioned runtime either through OAuth2 or through a personal access token from your Git provider. +Every user can see the list of runtimes and the personal access tokens assigned to each runtime in [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. Codefresh always flags and notifies you of invalid, revoked, or expired tokens. + ### Git runtime tokens The Git runtime token is required to provision Codefresh runtimes. The Git runtime token is specific to a runtime, and is mandatory for runtime installation. -An expired, revoked, or invalid Git runtime token is flagged by a notification in the UI. You can then generate a new Git runtime token from your Git provider, and update it in Codefresh. + #### Git runtime token permissions -Git runtime tokens need both repo and admim repo access to create webhooks for Git events. +Git runtime tokens need both `repo` and `admim repo` access to create webhooks for Git events. {% include image.html @@ -32,29 +34,16 @@ Git runtime tokens need both repo and admim repo access to create webhooks for G max-width="60%" %} -#### How to update a Git runtime token -Update Git runtime tokens when needed. - -**Before you begin** -* Generate a new runtime token with the correct permissions - -**How to** - -1. In the Codefresh UI, when you see a notification, select **[Update Token]**. - In the **Runtimes** page, runtimes with invalid tokens are prefixed by the key icon. Mouse over shows invalid token. -1. Select the runtime, and then on the top-right of the page, select and then **+Add Token**. -1. Paste the generated personal access token. -1. If there are no validation errors, select **Add**. ### Git personal tokens -The Git personal token is a user-specific personal access token per provisioned runtime. Unique to each user, it is required to authenticate Git-based actions per runtime in Codefresh. -If not provided during runtime installation, user can add personal access tokens (PATs) after installation through [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"} in the UI, using either OAuth to authorize access or generate one from GitHub. +The Git personal token is a user-specific personal access token per provisioned runtime. Unique to each user, it is required to authenticate Git-based actions per runtime in Codefresh after installation. +You can manage personal access tokens for runtimes using either OAuth to authorize access or a personal access token from your Git provider. -If users have access to multiple runtimes, they can use the same personal access token for all the runtimes. -> Users must configure the token for each runtime. +> If you have access to multiple runtimes, you can use the same personal access token for all the runtimes. + You must configure the token for each runtime. #### Git personal token permissions -Git personal tokens need repo access for commits and other actions. +Git personal tokens need `repo` access for commits and other actions. {% include image.html From 86e162e6b0ec29be7ebb3972be5417284b3261e1 Mon Sep 17 00:00:00 2001 From: NimRegev Date: Wed, 2 Nov 2022 15:51:45 +0200 Subject: [PATCH 3/5] Update content --- _docs/administration/user-settings.md | 63 +++++++++++++++++++++--- _docs/reference/git-tokens.md | 71 ++++++++++++++++++--------- 2 files changed, 105 insertions(+), 29 deletions(-) diff --git a/_docs/administration/user-settings.md b/_docs/administration/user-settings.md index 91cc9e5e..2c33c6aa 100644 --- a/_docs/administration/user-settings.md +++ b/_docs/administration/user-settings.md @@ -11,11 +11,13 @@ As a user in Codefresh, you can manage your account by authorizing access to you Optional. Enable access to your account for troubleshooting purposes. * Authorize Git providers - The Git personal token is a user-specific access token per provisioned runtime, and is required to authenticate Git-based actions when using Codefresh. + The Git personal token is a user-specific access token, required to authenticate Git-based actions from Codefresh clients, per provisioned runtime. + + The authorization method depends on the Git provider and on what authorization has been set up by ypur adin. If your admin has set up authentication with OAuth2, you can authorize access using OAuth2. Or, you can always generate a personal access token from your Git provider and then add the same to Codefresh to authorize access. - > If you need access to more than one runtime, you can use the same token for multiple runtimes. + > If you have access to more than one runtime, you can use the same token for multiple runtimes. You must however authorize access individually for each runtime. ### Enable access for Codefresh support @@ -38,17 +40,49 @@ You can disable this security setting at any time. max-width="50%" %} -### Authorize Git access with OAuth2 or personal access tokens +### Authorize Git access with OAuth or personal access tokens Authorize Git access with OAuth2 if your account admin has set up Codefresh as an OAuth application, or alternatively through personal access tokens from your Git provider. * For OAuth2: The adminstrator pre-configures the permissions and expiry date. Once you supply your credentials for authorization, you are automatically directed to the Git Personal Tokens page. -* For Git PAT: Generate a valid personal access token from your Git provider with `repo` scope for commits and other actions. +#### Generate personal access token for GitHub -{::nomarkdown} -
-{:/} +#### Authorize access for Bitbucket +Bitbucket requires your Bitbucket account name and a personal access token to authorize access. + +**Generate personal access token** +1. Log in to your Bitbucket Cloud or Server account. +1. Select **Manage account > Account settings > Personal access tokens**. +1. Select these scopes: `repository write`,`Project read`. +1. Copy the personal access token generated as you will need it to authorize access. +**How to** +1. In the Codefresh UI, go to [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. +1. Select the runtime, and then select one of the following: + * To add a token, select **Add Token**. + * To update an existing token by replacing it with a new token, select **Update Token**. +1. From the **Select Git provider** drop-down, select **Bitbucket**. +1. In the **Bitbucket username field**, enter the username of your Bitbucket account. +1. In the **Bitbucket Personal Access Token** field, paste the token you generated. + + + + +{:start="6"} +1. Click **Add Token**. + In the Git Personal Access Tokens list, you can see that the new token is assigned to the runtime. + +#### Authorize access for GitHub +**Before you begin** +Make sure you have: +* For Bitbucket only, your Bitbucket account username +* If needed, a _personal access token_ with the required scopes: + * [GitHub]({{site.baseurl}}/docs/reference/git-tokens/#github-tokens) + * [GitLab]({{site.baseurl}}/docs/reference/git-tokens/#gitlab-tokens) + * [Bitbucket]({{site.baseurl}}/docs/reference/git-tokens/#bitbucket-tokens) + + +**How to** 1. In the Codefresh UI, go to [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. 1. Select the runtime, and then select one of the following: * To add a token, select **Add Token**. @@ -72,6 +106,21 @@ Authorize Git access with OAuth2 if your account admin has set up Codefresh as a {:start="5"} 1. Click **Add Token**. In the Git Personal Access Tokens list, you can see that the new token is assigned to the runtime. + + + + + +{::nomarkdown} +
+{:/} + + + + + + + ### Related articles [Git tokens in Codefresh]({{site.baseurl}}/docs/reference/git-tokens/) \ No newline at end of file diff --git a/_docs/reference/git-tokens.md b/_docs/reference/git-tokens.md index b8be1c95..2ef2c766 100644 --- a/_docs/reference/git-tokens.md +++ b/_docs/reference/git-tokens.md @@ -10,42 +10,59 @@ toc: true Codefresh requires two types of Git tokens for authentication: -* A token for runtime installation (Git runtime token) -* A personal access token for each runtime, unique to every user (Git user token) +* Git runtime token for runtime installation + Used by: + * Argo CD clone repositories and pull changes to sync the desired state in Git to the live state on the cluster. + * Argo Events to create webhooks in Git repositories for Event Sources in Delivery Pipelines + + The Git runtime token is runtime-specific but not user-specific. + + +* Git user token, a user-specific personal access token for each runtime, unique to every user + Unique to every user, the Git user token is used to authenticate the user for client-based actions, such as Git clone and push operations on specific repositories. + Git user token requirements translate to permission scopes which differ for the different Git providers. + + After installation, you need to authorize Git access for every provisioned runtime either through OAuth2 or through a personal access token from your Git provider. + Every user can view the list of runtimes and tokens assigned to each runtime in [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. Codefresh flags and notifies you of invalid, revoked, or expired tokens. + -The Git runtime token is used for runtime installation. After installation, you need to authorize Git access for every provisioned runtime either through OAuth2 or through a personal access token from your Git provider. -Every user can see the list of runtimes and the personal access tokens assigned to each runtime in [User Settings](https://g.codefresh.io/2.0/user-settings){:target="\_blank"}. Codefresh always flags and notifies you of invalid, revoked, or expired tokens. ### Git runtime tokens -The Git runtime token is required to provision Codefresh runtimes. The Git runtime token is specific to a runtime, and is mandatory for runtime installation. +The Git runtime token is mandatory for runtime installation. -#### Git runtime token permissions -Git runtime tokens need both `repo` and `admim repo` access to create webhooks for Git events. +#### GitHub & GitHub Enterprise runtime token scopes + +* `repo` +* `admin:repo_hook` + +#### GitLab Cloud & GitLab Server runtime token scopes + +* `api` +* `read_repository` + + +### Bitbucket Cloud & Bitbucket Server runtime token scopes + +* `Project admin`* +* `Repository write` +* `Project read` -{% include - image.html - lightbox="true" - file="/images/getting-started/quick-start/quick-start-git-event-permissions.png" - url="/images/getting-started/quick-start/quick-start-git-event-permissions.png" - alt="Permissions for Git runtime token" - caption="Permissions for Git runtime token" - max-width="60%" - %} ### Git personal tokens -The Git personal token is a user-specific personal access token per provisioned runtime. Unique to each user, it is required to authenticate Git-based actions per runtime in Codefresh after installation. -You can manage personal access tokens for runtimes using either OAuth to authorize access or a personal access token from your Git provider. +The Git personal token is a user-specific personal access token per provisioned runtime. Unique to each user, it is required after installation to authenticate Git-based actions per runtime in Codefresh. > If you have access to multiple runtimes, you can use the same personal access token for all the runtimes. You must configure the token for each runtime. -#### Git personal token permissions -Git personal tokens need `repo` access for commits and other actions. -{% include + +#### GitHub & GitHub Enterprise personal user token scopes +* `repo` + + + +#### GitLab Cloud & GitLab Server personal user token scopes + +* `write_repository` (includes `read-repository`) +* `api-read` + +#### Bitbucket Cloud & Bitbucket Server personal user token scopes + +* `Project read` +* `Repository write` ### Related articles [User settings]({{site.baseurl}}/docs/administration/user-settings/) \ No newline at end of file From d389874debcabd32f4a5a3f835fd6d2a6ab23aab Mon Sep 17 00:00:00 2001 From: NimRegev Date: Wed, 2 Nov 2022 16:26:37 +0200 Subject: [PATCH 4/5] Update git-tokens.md --- _docs/reference/git-tokens.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/_docs/reference/git-tokens.md b/_docs/reference/git-tokens.md index 2ef2c766..e9c83f54 100644 --- a/_docs/reference/git-tokens.md +++ b/_docs/reference/git-tokens.md @@ -32,20 +32,27 @@ Codefresh requires two types of Git tokens for authentication: The Git runtime token is mandatory for runtime installation. -#### GitHub & GitHub Enterprise runtime token scopes +#### GitHub and GitHub Enterprise runtime token scopes * `repo` * `admin:repo_hook` -#### GitLab Cloud & GitLab Server runtime token scopes +{::nomarkdown} +
+{:/} + +#### GitLab Cloud and GitLab Server runtime token scopes * `api` * `read_repository` +{::nomarkdown} +
+{:/} ### Bitbucket Cloud & Bitbucket Server runtime token scopes -* `Project admin`* +* `Project admin` * `Repository write` * `Project read` @@ -57,7 +64,9 @@ The Git personal token is a user-specific personal access token per provisioned > If you have access to multiple runtimes, you can use the same personal access token for all the runtimes. You must configure the token for each runtime. - +{::nomarkdown} +
+{:/} #### GitHub & GitHub Enterprise personal user token scopes * `repo` @@ -71,12 +80,19 @@ The Git personal token is a user-specific personal access token per provisioned caption="Permissions for Git personal token" max-width="60%" %}--> +{::nomarkdown} +
+{:/} #### GitLab Cloud & GitLab Server personal user token scopes * `write_repository` (includes `read-repository`) * `api-read` +{::nomarkdown} +
+{:/} + #### Bitbucket Cloud & Bitbucket Server personal user token scopes * `Project read` From a604250e341e74597855f51fd379ae69134fc813 Mon Sep 17 00:00:00 2001 From: NimRegev Date: Wed, 2 Nov 2022 16:33:42 +0200 Subject: [PATCH 5/5] Update git-tokens.md --- _docs/reference/git-tokens.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/_docs/reference/git-tokens.md b/_docs/reference/git-tokens.md index e9c83f54..a8e28e3d 100644 --- a/_docs/reference/git-tokens.md +++ b/_docs/reference/git-tokens.md @@ -31,6 +31,9 @@ Codefresh requires two types of Git tokens for authentication: ### Git runtime tokens The Git runtime token is mandatory for runtime installation. +{::nomarkdown} +
+{:/} #### GitHub and GitHub Enterprise runtime token scopes @@ -50,13 +53,15 @@ The Git runtime token is mandatory for runtime installation.
{:/} -### Bitbucket Cloud & Bitbucket Server runtime token scopes +#### Bitbucket Cloud & Bitbucket Server runtime token scopes * `Project admin` * `Repository write` * `Project read` - +{::nomarkdown} +

+{:/} ### Git personal tokens The Git personal token is a user-specific personal access token per provisioned runtime. Unique to each user, it is required after installation to authenticate Git-based actions per runtime in Codefresh.