From 00f45d94d402b3fda5496f2f9543d63c8f6cb083 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Thu, 15 Jun 2023 08:30:45 -0700 Subject: [PATCH 01/18] Extremely rough draft of major steps Not pretty, but this at least roughs out the steps needed to do the work of combining groups, branch protections, and code owners. --- doc/tutorials/protected_workflow/index.md | 118 ++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 doc/tutorials/protected_workflow/index.md diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md new file mode 100644 index 00000000000000..ac7bf5e6fef9ee --- /dev/null +++ b/doc/tutorials/protected_workflow/index.md @@ -0,0 +1,118 @@ +--- +stage: Create +group: Code Review +info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments" +type: reference, howto +--- + +# Tutorial: Build a protected workflow for your project **(FREE)** + +In this tutorial, you'll set up a workflow for a project that protects your 1.x and 2.x release branches, and ensures work is reviewed by the correct team members. + +To build a protected workflow for a project: + +1. [Create `manager` and `engineering` groups](#create-manager-and-engineering-groups) +1. [Create subgroups for `frontend` and `backend`](#create-subgroups-for-frontend-and-backend) +1. [Add users to the subgroups](#add-users-to-the-subgroups) +1. [Create protections for your release branches](#create-protections-for-your-release-branches) +1. [Create the release branches](#create-the-release-branches) +1. [Add Code Owners for files in the branches](#add-code-owners-for-files-in-the-branches) +1. [Enforce CODEOWNERS with an approval rule](#enforce-codeowners-with-an-approval-rule) + +## Prerequisites + +- You must have the Owner role in the project. +- You need a list of managers. +- You need a list of your backend and frontend engineers. + +## Create `manager` and `engineering` groups + +1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**. +1. Select **Create group**. +1. For **Group name**, enter `Managers`. +1. For the **Group URL**, enter `managers`. +1. Set the **Visibility level** to `Public`. +1. XXXX Personalize it. +1. Invite the team managers to the group. + +Do the same for the `engineering` group, but we're not going to do the same for `frontend` or `backend`, because we're going to use subgroups to simplify the amount of data entry you have to do. + +## Create subgroups for `frontend` and `backend` + +If your engineering team contains both backend and frontend engineers, there's no need to add these users manually to all of the groups they belong to if you use sub-groups. Instead, we'll use `engineering` (which you just created) as an umbrella group, and create two subgroups. Instead of adding individuals to the engineering group, you'll add the two subgroups (`frontend` and `backend`) as members of `engineering`. + +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `engineering`. +1. On the overview page for the `engineering` group, in the upper-right corner, select **New subgroup**. +1. Select **Create group**. +1. XXX Fill in the fields. `frontend` +1. Select **Create group**. + +Repeat this process to create a `backend` subgroup. + +## Add users to the subgroups + +Before you begin, make sure you have [created the `frontend` and `backend` subgroups](#create-subgroups-for-frontend-and-backend). + +Instead of adding users to the `engineering` group, you'll add them to the subgroup they belong to, and the users will inherit membership in the parent `engineering` group. + +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `frontend`. +1. Select **Manage > Members**. +1. Select **Invite members**. +1. Fill in the fields. +1. Select **Invite**. + +Now do the same with the `backend` group. The same user can be a member of both `backend` and `frontend`. + +## Create protections for your release branches + +After you create and populate your groups and subgroups, you're ready to begin using these groups to protect your branches. We'll assume here that your project uses [semantic versioning](https://semver.org/), and we'll focus on protecting your 1.x and 2.x branches. Projects have multiple releases, so rather than creating protections for each branch individually, we're going to use wildcards to set up protections for all branches in those major versions. + +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project. +1. Select **Settings > Repository**. +1. Expand **Protected branches**. +1. From the **Branch** dropdown list, type the branch name and a wildcard. + +- **Allowed to push and merge** is set to **No one**. +- **Allowed to merge** is set to **Developers**. + +Also, follow the instructions at https://docs.gitlab.com/ee/user/project/protected_branches.html#require-everyone-to-submit-merge-requests-for-a-protected-branch to require everyone to create merge requests for this branch. You don't want people pushing directly to this branch. + +Turn on the Require approval from code owners toggle. + +## Create the release branches + +Now that you have protections in place, create the 2.0 branch (https://docs.gitlab.com/ee/user/project/protected_branches.html#create-a-new-branch-with-protections) + +## Add Code Owners for files in the branches + +Now that you've created protections for the branch, it's time to set up code owners for it. + +```plaintext +# Every file must be approved by someone in engineering +* @your-org/engineering + +# Changes to CODEOWNERS should be reviewed by a manager +.gitlab/CODEOWNERS @your-org/managers + +^[Frontend] @your-org/frontend +*.scss +*.js + +^[Backend] @your-org/backend +*.rb +``` + +You'll need to push this to `main`, and then make sure that code pushed to the 1.x and 2.x branches contains this CODEOWNERS file. + +## Enforce CODEOWNERS with an approval rule + +Hmm. The problem: FREE customers only get optional rules. Required approvals? you've got to be PREMIUM or higher. + +1. Go to your project and select **Settings > Merge requests**. +1. In the **Merge request approvals** section, scroll to **Approval rules**. +1. Select **Add approval rule**. +1. Create a rule named `SOME TITLE HERE`. +1. Select **All protected branches**. This setting applies the rule to all branches matching `1.x` or `2.x`. +1. Set the **Approvals required** to `1` to make the rule required. +1. Add the `managers` group as approvers. +1. Select **Add approval rule**. -- GitLab From 6e3b8e3f3e1c35744565eb3cd46dab6720029f6a Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Thu, 15 Jun 2023 13:53:04 -0700 Subject: [PATCH 02/18] Build first few subheads, add first image Begin stepping through the process and refining it, and add the first screencap to illustrate a breakpoint in the process. --- .../img/subgroup_structure_v16_1.png | Bin 0 -> 16992 bytes doc/tutorials/protected_workflow/index.md | 68 +++++++++++++----- 2 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 doc/tutorials/protected_workflow/img/subgroup_structure_v16_1.png diff --git a/doc/tutorials/protected_workflow/img/subgroup_structure_v16_1.png b/doc/tutorials/protected_workflow/img/subgroup_structure_v16_1.png new file mode 100644 index 0000000000000000000000000000000000000000..3c4ee02d0f4633e0a1c33c87012269ea28daccb6 GIT binary patch literal 16992 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 E0IB*qHvj+t literal 0 HcmV?d00001 diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index ac7bf5e6fef9ee..f0b74ba0c81a77 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -7,12 +7,13 @@ type: reference, howto # Tutorial: Build a protected workflow for your project **(FREE)** -In this tutorial, you'll set up a workflow for a project that protects your 1.x and 2.x release branches, and ensures work is reviewed by the correct team members. +When a team starts a new project, they need an efficient workflow that still routes changes through appropriate approval channels. In GitLab, you can create groups of users, combine those groups with branch protections, then enforce those protections with approval rules. -To build a protected workflow for a project: +This tutorial sets up protections for Excelsior Project's 1.x and 2.x release branches, and creates a minimal approval workflow for it: -1. [Create `manager` and `engineering` groups](#create-manager-and-engineering-groups) -1. [Create subgroups for `frontend` and `backend`](#create-subgroups-for-frontend-and-backend) +1. [Create the `engineering` groups](#create-the-engineering-group) +1. [Create the Excelsior project](#create-the-excelsior-project) +1. [Create subgroups in `engineering`](#create-subgroups-in-engineering) 1. [Add users to the subgroups](#add-users-to-the-subgroups) 1. [Create protections for your release branches](#create-protections-for-your-release-branches) 1. [Create the release branches](#create-the-release-branches) @@ -21,33 +22,64 @@ To build a protected workflow for a project: ## Prerequisites -- You must have the Owner role in the project. +- You need the Owner role (??) on your XXXXXX - You need a list of managers. - You need a list of your backend and frontend engineers. -## Create `manager` and `engineering` groups +## Create the `engineering` group 1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**. 1. Select **Create group**. -1. For **Group name**, enter `Managers`. -1. For the **Group URL**, enter `managers`. +1. For **Group name**, enter `Engineering`. +1. For the **Group URL**, enter `engineering`. 1. Set the **Visibility level** to `Public`. -1. XXXX Personalize it. -1. Invite the team managers to the group. +1. Personalize your experience so GitLab shows the most helpful information to you: + - For **Role**, select `System administrator`. + - For **Who will be using this group?** select `My company or team`. + - For **What will you use this group for?** select `I want to manage my code.` +1. Skip inviting members to the group, as you'll add users in the next step. +1. Select **Create group**. + +Next, you'll add subgroups to this `engineering` group for more granular control. -Do the same for the `engineering` group, but we're not going to do the same for `frontend` or `backend`, because we're going to use subgroups to simplify the amount of data entry you have to do. +## Create subgroups in `engineering` -## Create subgroups for `frontend` and `backend` +Users with different job duties have different tasks and different areas of specialty. Look for points of commonality when creating groups. What do the users have in common? Do they work on a specific project, like `Excelsior`? Do they handle specific tasks, like frontend engineering or managerial duties? When you find the points of commonality, you're ready to create your groups. -If your engineering team contains both backend and frontend engineers, there's no need to add these users manually to all of the groups they belong to if you use sub-groups. Instead, we'll use `engineering` (which you just created) as an umbrella group, and create two subgroups. Instead of adding individuals to the engineering group, you'll add the two subgroups (`frontend` and `backend`) as members of `engineering`. +Now that we have an `engineering` group, let's add three subgroups to it: `frontend`, `backend`, and `managers`. 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `engineering`. 1. On the overview page for the `engineering` group, in the upper-right corner, select **New subgroup**. -1. Select **Create group**. -1. XXX Fill in the fields. `frontend` -1. Select **Create group**. - -Repeat this process to create a `backend` subgroup. +1. For the **Subgroup name**, enter `Managers`. +1. Set the **Visibility level** to `Public`. +1. Select **Create subgroup**. + +Repeat this process to create subgroups for `backend` and `frontend`. When you're done, search for the `engineering` group one more time. Its overview page should show three subgroups, like this: + +![The engineering group has three subgroups](img/subgroup_structure_v16_1.png) + +If your engineering team contains both backend and frontend engineers, there's no need to add these users manually to all of the groups they belong to if you use subgroups. Instead, we'll use `engineering` (which you just created) as an umbrella group, and create two subgroups. Instead of adding individuals to the engineering group, you'll add the two subgroups (`frontend` and `backend`) as members of `engineering`. + +## Create the Excelsior project + +Now that your group structure is in place, let's create the `Excelsior` project. + +1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**. +1. Select **Create blank project**. +1. Enter the project details: + - In the **Project name** field, enter `Excelsior`. + - In the **Project slug** field, enter the path to your project. The GitLab instance uses the + slug as the URL path to the project. To change the slug, first enter the project name, + then change the slug. + - In the **Project deployment target (optional)** field, select your project's deployment target. + This information helps GitLab better understand its users and their deployment requirements. + - To modify the project's [viewing and access rights](../public_access.md) for + users, change the **Visibility Level**. + - To create README file so that the Git repository is initialized, has a default branch, and + can be cloned, select **Initialize repository with a README**. + - To analyze the source code in the project for known security vulnerabilities, + select **Enable Static Application Security Testing (SAST)**. +1. Select **Create project**. ## Add users to the subgroups -- GitLab From d8ab177cf058189b92f0db49b9e2900572a7eb54 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Thu, 15 Jun 2023 17:03:28 -0700 Subject: [PATCH 03/18] Continue building out page, add second image Continue scaffolding out the page as I work through the details, and add a second screenshot for extra explanation. Polish and wrap words Begin wrapping up these first sections, so I can move on to later sections in the tutorial. Polish and line-wrap another couple of sections More section-specific work to wrap up early sections so I can focus on later ones. Polish wildcard section Get this section in a better shape so I can move on to the next one. Polish branch-protection area This section adds protection for release branches, and adds an image at the end of this major step to show a success state. --- .../img/branch_list_v16_1.png | Bin 0 -> 10023 bytes .../img/new_project_v16_2.png | Bin 0 -> 21608 bytes doc/tutorials/protected_workflow/index.md | 117 ++++++++++++------ 3 files changed, 81 insertions(+), 36 deletions(-) create mode 100644 doc/tutorials/protected_workflow/img/branch_list_v16_1.png create mode 100644 doc/tutorials/protected_workflow/img/new_project_v16_2.png diff --git a/doc/tutorials/protected_workflow/img/branch_list_v16_1.png b/doc/tutorials/protected_workflow/img/branch_list_v16_1.png new file mode 100644 index 0000000000000000000000000000000000000000..a06bc472296bb12da784d9522adedcb15e90e674 GIT binary patch literal 10023 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 Mp00i_>zopr03>n?3;+NC literal 0 HcmV?d00001 diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index f0b74ba0c81a77..46940e3b2e0920 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -5,11 +5,17 @@ info: "To determine the technical writer assigned to the Stage/Group associated type: reference, howto --- + + # Tutorial: Build a protected workflow for your project **(FREE)** -When a team starts a new project, they need an efficient workflow that still routes changes through appropriate approval channels. In GitLab, you can create groups of users, combine those groups with branch protections, then enforce those protections with approval rules. +When a team starts a new project, they need a workflow that balances efficiency +with appropriate approval channels. In GitLab, you can create user groups, +combine those groups with branch protections, and then enforce those protections +with approval rules. -This tutorial sets up protections for Excelsior Project's 1.x and 2.x release branches, and creates a minimal approval workflow for it: +This tutorial sets up protections for Excelsior Project's `1.x` and `2.x` +release branches, and creates a minimal approval workflow for the project: 1. [Create the `engineering` groups](#create-the-engineering-group) 1. [Create the Excelsior project](#create-the-excelsior-project) @@ -28,6 +34,9 @@ This tutorial sets up protections for Excelsior Project's 1.x and 2.x release br ## Create the `engineering` group +As part of setting up Excelsior Project, you should create a GitLab group to own +the project. Here, we'll set up the Engineering group: + 1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**. 1. Select **Create group**. 1. For **Group name**, enter `Engineering`. @@ -37,83 +46,119 @@ This tutorial sets up protections for Excelsior Project's 1.x and 2.x release br - For **Role**, select `System administrator`. - For **Who will be using this group?** select `My company or team`. - For **What will you use this group for?** select `I want to manage my code.` -1. Skip inviting members to the group, as you'll add users in the next step. +1. Skip inviting members to the group. You'll add users in a later section of this tutorial. 1. Select **Create group**. Next, you'll add subgroups to this `engineering` group for more granular control. ## Create subgroups in `engineering` -Users with different job duties have different tasks and different areas of specialty. Look for points of commonality when creating groups. What do the users have in common? Do they work on a specific project, like `Excelsior`? Do they handle specific tasks, like frontend engineering or managerial duties? When you find the points of commonality, you're ready to create your groups. +The `engineering` group is a good start, but it's not granular enough for Excelsior Project's +backend engineers, frontend engineers, and managers. These team members are all +part of Engineering, but they have different tasks, and different areas of specialty. -Now that we have an `engineering` group, let's add three subgroups to it: `frontend`, `backend`, and `managers`. +Here, we'll create three more granular subgroups in the Engineering group. +Let's segment users by the type of work they do: `frontend`, `backend`, and `managers`. -1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `engineering`. -1. On the overview page for the `engineering` group, in the upper-right corner, select **New subgroup**. +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) + and search for `engineering`. +1. On the overview page for the `engineering` group, in the upper-right corner, + select **New subgroup**. 1. For the **Subgroup name**, enter `Managers`. 1. Set the **Visibility level** to `Public`. 1. Select **Create subgroup**. -Repeat this process to create subgroups for `backend` and `frontend`. When you're done, search for the `engineering` group one more time. Its overview page should show three subgroups, like this: +Repeat this process to create subgroups for `backend` and `frontend`. When you're done, +search for the `engineering` group one more time. Its overview page should show +three subgroups, like this: ![The engineering group has three subgroups](img/subgroup_structure_v16_1.png) -If your engineering team contains both backend and frontend engineers, there's no need to add these users manually to all of the groups they belong to if you use subgroups. Instead, we'll use `engineering` (which you just created) as an umbrella group, and create two subgroups. Instead of adding individuals to the engineering group, you'll add the two subgroups (`frontend` and `backend`) as members of `engineering`. +In a later step, this hierarchy simplifies data entry and permissions handling. ## Create the Excelsior project -Now that your group structure is in place, let's create the `Excelsior` project. +Now that your group structure is in place, let's create the `excelsior` project +in GitLab for the teams to work in. Because both frontend and backend engineers +are involved, `excelsior` should belong to `engineering` instead of any of the +smaller subgroups you just created. -1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New project/repository**. +To create the new `excelsior` project: + +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and + search for `engineering`. +1. On the overview page for the `engineering` group, on the left sidebar, at the top, + select **Create new...** (**{plus}**) and **In this group > New project/repository**. 1. Select **Create blank project**. 1. Enter the project details: - - In the **Project name** field, enter `Excelsior`. - - In the **Project slug** field, enter the path to your project. The GitLab instance uses the - slug as the URL path to the project. To change the slug, first enter the project name, - then change the slug. - - In the **Project deployment target (optional)** field, select your project's deployment target. - This information helps GitLab better understand its users and their deployment requirements. - - To modify the project's [viewing and access rights](../public_access.md) for - users, change the **Visibility Level**. - - To create README file so that the Git repository is initialized, has a default branch, and - can be cloned, select **Initialize repository with a README**. - - To analyze the source code in the project for known security vulnerabilities, - select **Enable Static Application Security Testing (SAST)**. + - In the **Project name** field, enter `Excelsior`. The **Project slug** should + auto-populate with `excelsior`. + - For **Visibility Level**, select `Public`. + - Select **Initialize repository with a README** to add an initial file to the repository. 1. Select **Create project**. +GitLab creates the `excelsior` project for you, and redirects you to its homepage. +It should look like this: + +![Your new, almost-empty excelsior project](img/new_project_v16_2.png) + ## Add users to the subgroups -Before you begin, make sure you have [created the `frontend` and `backend` subgroups](#create-subgroups-for-frontend-and-backend). +In the previous step, you created an `engineering` group to own the new `excelsior` +project. Here, you'll add team members to their appropriate subgroups, and take +advantage of group inheritance. For example, when you add a user to the `frontend` +subgroup, the user _also_ inherits membership in the parent (`engineering`) group. -Instead of adding users to the `engineering` group, you'll add them to the subgroup they belong to, and the users will inherit membership in the parent `engineering` group. +To add a user to the `frontend` subgroup: -1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `frontend`. +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) + and search for `frontend`. 1. Select **Manage > Members**. 1. Select **Invite members**. -1. Fill in the fields. +1. Fill in the fields. Give each user `Developer` access by default, increasing it + to `Maintainer` if this user reviews the work of others. 1. Select **Invite**. +1. Repeat these steps until you've added all of the frontend engineers into the + `frontend` subgroup. -Now do the same with the `backend` group. The same user can be a member of both `backend` and `frontend`. +Now do the same with the `backend` and `managers` groups. The same user can be a +member of multiple subgroups. ## Create protections for your release branches -After you create and populate your groups and subgroups, you're ready to begin using these groups to protect your branches. We'll assume here that your project uses [semantic versioning](https://semver.org/), and we'll focus on protecting your 1.x and 2.x branches. Projects have multiple releases, so rather than creating protections for each branch individually, we're going to use wildcards to set up protections for all branches in those major versions. +After you create and populate your groups and subgroups, let's set up +group-level protections for branches. The `excelsior` project uses +[semantic versioning](https://semver.org/), so you must protect the +`1.x` and `2.x` branches. You want to: + +- Use wildcards to protect multiple branches at a time. +- Require all users to submit changes through merge requests. + +To set up these protections: 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project. -1. Select **Settings > Repository**. +1. On the left sidebar, select **Settings > Repository**. 1. Expand **Protected branches**. -1. From the **Branch** dropdown list, type the branch name and a wildcard. +1. From the **Branch** dropdown list, type `1.x`, then and select **Create wildcard `1.x`**. +1. To require everyone to submit merge requests, rather than pushing directly to + these branches: + 1. Set **Allowed to push and merge** to **No one**. + 1. Set **Allowed to merge** to **Maintainers**. +1. To require Code Owners to review changes to files they work on, toggle **Require approval from code owners**. + + NOTE: + Required approvals are available only for GitLab Premium and higher tiers. -- **Allowed to push and merge** is set to **No one**. -- **Allowed to merge** is set to **Developers**. +1. Select **Protect**. -Also, follow the instructions at https://docs.gitlab.com/ee/user/project/protected_branches.html#require-everyone-to-submit-merge-requests-for-a-protected-branch to require everyone to create merge requests for this branch. You don't want people pushing directly to this branch. +![main and 1.x are now protected](img/branch_list_v16_1.png) -Turn on the Require approval from code owners toggle. +Your `main` and `1.x` branches are now protected. Repeat these steps to protect +your `2.x` branches. ## Create the release branches -Now that you have protections in place, create the 2.0 branch (https://docs.gitlab.com/ee/user/project/protected_branches.html#create-a-new-branch-with-protections) +Now that you have protections in place, [create the 2.0 branch](../../user/project/protected_branches.md#create-a-new-branch-with-protections) ## Add Code Owners for files in the branches -- GitLab From 7bace552a149beca05846f41bc2ffb96e6992a36 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Fri, 16 Jun 2023 20:36:17 +0000 Subject: [PATCH 04/18] Reorder jump links I had to switch some steps around. --- doc/tutorials/protected_workflow/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 46940e3b2e0920..1aea89a024d670 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -17,9 +17,9 @@ with approval rules. This tutorial sets up protections for Excelsior Project's `1.x` and `2.x` release branches, and creates a minimal approval workflow for the project: -1. [Create the `engineering` groups](#create-the-engineering-group) -1. [Create the Excelsior project](#create-the-excelsior-project) +1. [Create the `engineering` groups](#create-the-engineering-groups) 1. [Create subgroups in `engineering`](#create-subgroups-in-engineering) +1. [Create the Excelsior project](#create-the-excelsior-project) 1. [Add users to the subgroups](#add-users-to-the-subgroups) 1. [Create protections for your release branches](#create-protections-for-your-release-branches) 1. [Create the release branches](#create-the-release-branches) -- GitLab From ae4e9e0ef320b783767167025450ca424a37f6f4 Mon Sep 17 00:00:00 2001 From: Kati Paizee Date: Mon, 26 Jun 2023 19:20:15 +0000 Subject: [PATCH 05/18] Revisions from first light edit Revise for brevity and style. I went a little TOO verbose in a few places. --- doc/tutorials/protected_workflow/index.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 1aea89a024d670..1476e63eed6b48 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -9,7 +9,7 @@ type: reference, howto # Tutorial: Build a protected workflow for your project **(FREE)** -When a team starts a new project, they need a workflow that balances efficiency +When your team starts a new project, they need a workflow that balances efficiency with appropriate approval channels. In GitLab, you can create user groups, combine those groups with branch protections, and then enforce those protections with approval rules. @@ -34,8 +34,8 @@ release branches, and creates a minimal approval workflow for the project: ## Create the `engineering` group -As part of setting up Excelsior Project, you should create a GitLab group to own -the project. Here, we'll set up the Engineering group: +Before setting up Excelsior Project, you should create a group to own +the project. Here, you'll set up the Engineering group: 1. On the left sidebar, at the top, select **Create new...** (**{plus}**) and **New group**. 1. Select **Create group**. @@ -53,12 +53,12 @@ Next, you'll add subgroups to this `engineering` group for more granular control ## Create subgroups in `engineering` -The `engineering` group is a good start, but it's not granular enough for Excelsior Project's -backend engineers, frontend engineers, and managers. These team members are all -part of Engineering, but they have different tasks, and different areas of specialty. +The `engineering` group is a good start, but Excelsior Project's +backend engineers, frontend engineers, and managers +have different tasks, and different areas of specialty. -Here, we'll create three more granular subgroups in the Engineering group. -Let's segment users by the type of work they do: `frontend`, `backend`, and `managers`. +Here, you'll create three more granular subgroups in the Engineering group to +segment users by the type of work they do: `frontend`, `backend`, and `managers`. 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `engineering`. @@ -74,12 +74,11 @@ three subgroups, like this: ![The engineering group has three subgroups](img/subgroup_structure_v16_1.png) -In a later step, this hierarchy simplifies data entry and permissions handling. ## Create the Excelsior project -Now that your group structure is in place, let's create the `excelsior` project -in GitLab for the teams to work in. Because both frontend and backend engineers +Now that your group structure is in place, create the `excelsior` project +for the teams to work in. Because both frontend and backend engineers are involved, `excelsior` should belong to `engineering` instead of any of the smaller subgroups you just created. -- GitLab From c47cf9ee726f5dd31e7ab551ce854a60db1e6370 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Mon, 26 Jun 2023 12:31:02 -0700 Subject: [PATCH 06/18] Rebase, fix double line break Now that I'm back from PTO, let's rebase this work to catch it up with 'master', and then fix the one markdownlint problem I introduced at the end of my last pre-PTO day. --- doc/tutorials/protected_workflow/index.md | 1 - 1 file changed, 1 deletion(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 1476e63eed6b48..c5fe87fee24695 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -74,7 +74,6 @@ three subgroups, like this: ![The engineering group has three subgroups](img/subgroup_structure_v16_1.png) - ## Create the Excelsior project Now that your group structure is in place, create the `excelsior` project -- GitLab From 842f25fe2bfc856b9922cef57e2276f33bf24849 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Mon, 26 Jun 2023 15:03:31 -0700 Subject: [PATCH 07/18] Continue fleshing out tutorial, add 2 images More scaffolding. Write more subheadings. Shift the info about the CODEOWNERS file to the right place. Add two more screenshots. Make clearer what you need to select after running searches. Update jump links to new subheading titles Fixes the last markdownlint errors by updating these links to their new versions. Finishes approval-rules subheading Completes the section for approval rules, including a screenshot of the finished result. Wrap up final two subheads, add images Configure branch rules, then describe how to create a branch. --- .../img/approval_rules_v16_2.png | Bin 0 -> 9312 bytes .../img/branch_is_protected_v16_2.png | Bin 0 -> 8894 bytes .../img/branch_list_v16_1.png | Bin 10023 -> 13071 bytes .../protected_workflow/img/new_file_v16_2.png | Bin 0 -> 9452 bytes .../img/search_engineering_v16_2.png | Bin 0 -> 6244 bytes doc/tutorials/protected_workflow/index.md | 254 ++++++++++++------ 6 files changed, 173 insertions(+), 81 deletions(-) create mode 100644 doc/tutorials/protected_workflow/img/approval_rules_v16_2.png create mode 100644 doc/tutorials/protected_workflow/img/branch_is_protected_v16_2.png create mode 100644 doc/tutorials/protected_workflow/img/new_file_v16_2.png create mode 100644 doc/tutorials/protected_workflow/img/search_engineering_v16_2.png diff --git a/doc/tutorials/protected_workflow/img/approval_rules_v16_2.png b/doc/tutorials/protected_workflow/img/approval_rules_v16_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a7db9488bad688f59031a3c9998eec0546a362ad GIT binary patch literal 9312 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%0AB$&EQ(Jl2Y-CVleg)!LN&H3U4*R{?n8?ug@ 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/protected_workflow/img/branch_is_protected_v16_2.png b/doc/tutorials/protected_workflow/img/branch_is_protected_v16_2.png new file mode 100644 index 0000000000000000000000000000000000000000..c4ea048a41ebb5b2de930af874790c51dd779a3b GIT binary patch literal 8894 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 D(53QN delta 9562 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 GLK6U8xHpLa diff --git a/doc/tutorials/protected_workflow/img/new_file_v16_2.png b/doc/tutorials/protected_workflow/img/new_file_v16_2.png new file mode 100644 index 0000000000000000000000000000000000000000..d42b461f9c57fa21696be31fe55db8187622641c GIT binary patch literal 9452 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
  • Members**. +1. On the top right, select **Invite a group**. +1. For **Select a group to invite**, select `Engineering / Managers`. +1. Select the role that members of this subgroup should receive in the `engineering` group. + When adding the `Managers` subgroup, select `Maintainer`. When adding the other + subgroups, use the `Developer` role. +1. Optional. Select an expiration date. +1. Select **Invite**. + Repeat this process to create subgroups for `backend` and `frontend`. When you're done, search for the `engineering` group one more time. Its overview page should show three subgroups, like this: ![The engineering group has three subgroups](img/subgroup_structure_v16_1.png) +This approach minimizes future data entry and potential inconsistencies. + +### Add users to the subgroups + +After you create the subgroups, take advantage of group inheritance by adding +team members to their appropriate _subgroups_, instead of the `engineering` group. +For example, when you add a user to the `frontend` subgroup, the user inherits +membership in the parent (`engineering`) group. + +To add a user to the `frontend` subgroup: + +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) + and search for `frontend`. Select the `Frontend` group. +1. Select **Manage > Members**. +1. Select **Invite members**. +1. Fill in the fields. Give each user `Developer` access by default, increasing it + to `Maintainer` if this user reviews the work of others. +1. Select **Invite**. +1. Repeat these steps until you've added all of the frontend engineers into the + `frontend` subgroup. + +Now do the same with the `backend` and `managers` groups. The same user can be a +member of multiple subgroups. + ## Create the Excelsior project Now that your group structure is in place, create the `excelsior` project @@ -84,7 +127,7 @@ smaller subgroups you just created. To create the new `excelsior` project: 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and - search for `engineering`. + search for `engineering`. Select the group named `Engineering`. 1. On the overview page for the `engineering` group, on the left sidebar, at the top, select **Create new...** (**{plus}**) and **In this group > New project/repository**. 1. Select **Create blank project**. @@ -100,94 +143,143 @@ It should look like this: ![Your new, almost-empty excelsior project](img/new_project_v16_2.png) -## Add users to the subgroups +You'll use a feature on this page in the next step. -In the previous step, you created an `engineering` group to own the new `excelsior` -project. Here, you'll add team members to their appropriate subgroups, and take -advantage of group inheritance. For example, when you add a user to the `frontend` -subgroup, the user _also_ inherits membership in the parent (`engineering`) group. +### Add a basic CODEOWNERS file -To add a user to the `frontend` subgroup: +Add a CODEOWNERS file to the root directory of your project to route reviews to +the right subgroup. This example sets up four rules: -1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) - and search for `frontend`. -1. Select **Manage > Members**. -1. Select **Invite members**. -1. Fill in the fields. Give each user `Developer` access by default, increasing it - to `Maintainer` if this user reviews the work of others. -1. Select **Invite**. -1. Repeat these steps until you've added all of the frontend engineers into the - `frontend` subgroup. +- All changes should be reviewed by someone in the `engineering` group. +- A manager should review any change to the CODEOWNERS file itself. +- Frontend engineers should review changes to frontend files. +- Backend engineers should review changes to backend files. -Now do the same with the `backend` and `managers` groups. The same user can be a -member of multiple subgroups. +NOTE: +GitLab Free supports only optional reviews. To make reviews required, you need +GitLab Premium or Ultimate. -## Create protections for your release branches +To add this file to your `excelsior` project: -After you create and populate your groups and subgroups, let's set up -group-level protections for branches. The `excelsior` project uses -[semantic versioning](https://semver.org/), so you must protect the -`1.x` and `2.x` branches. You want to: +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and + search for `Excelsior`. Select the project named `Excelsior`. +1. Next to the branch name, select the plus icon (**{plus}**), then **New file**: + ![Create a new file in the project](new_file_v16_2.png) +1. For **Filename**, enter `CODEOWNERS`. This will create a file named `CODEOWNERS` + in the root directory of your project. +1. Paste this example into the editing area, changing `@engineering/` if it + does not match your group structure: -- Use wildcards to protect multiple branches at a time. -- Require all users to submit changes through merge requests. + ```plaintext + # All changes should be reviewed by someone in the engineering group + * @engineering -To set up these protections: + # A manager should review any changes to this file + CODEOWNERS @engineering/managers -1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) to find your project. -1. On the left sidebar, select **Settings > Repository**. -1. Expand **Protected branches**. -1. From the **Branch** dropdown list, type `1.x`, then and select **Create wildcard `1.x`**. -1. To require everyone to submit merge requests, rather than pushing directly to - these branches: - 1. Set **Allowed to push and merge** to **No one**. - 1. Set **Allowed to merge** to **Maintainers**. -1. To require Code Owners to review changes to files they work on, toggle **Require approval from code owners**. + # Frontend files should be reviewed by FE engineers + ^[Frontend] @engineering/frontend + *.scss + *.js - NOTE: - Required approvals are available only for GitLab Premium and higher tiers. + # Backend files should be reviewed by BE engineers + ^[Backend] @engineering/backend + *.rb + ``` -1. Select **Protect**. +1. For a **Commit message**, paste in: -![main and 1.x are now protected](img/branch_list_v16_1.png) + ```plaintext + Adds a new CODEOWNERS file -Your `main` and `1.x` branches are now protected. Repeat these steps to protect -your `2.x` branches. + Creates a small CODEOWNERS file to: + - Route backend and frontend changes to the right teams + - Route CODEOWNERS file changes to managers + - Request all changes be reviewed + ``` -## Create the release branches +1. Select **Commit changes**. -Now that you have protections in place, [create the 2.0 branch](../../user/project/protected_branches.md#create-a-new-branch-with-protections) +The CODEOWNERS file is now in place in the `main` branch of your project, and +available for all future branches created in this project. -## Add Code Owners for files in the branches +## Configure approval rules -Now that you've created protections for the branch, it's time to set up code owners for it. +The CODEOWNERS file describes the appropriate reviewers for directories and +file types. Approval rules direct merge requests to those reviewers. +In GitLab Free, approval rules are optional. Required approvals are +available only in GitLab Premium and GitLab Ultimate. -```plaintext -# Every file must be approved by someone in engineering -* @your-org/engineering +Here, you will set up an approval rule that uses the information in your new CODEOWNERS +file and adds protection for release branches: -# Changes to CODEOWNERS should be reviewed by a manager -.gitlab/CODEOWNERS @your-org/managers +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and + search for `Excelsior`. Select the project named `Excelsior`. +1. On the left sidebar, select **Settings > Merge requests**. +1. In the **Merge request approvals** section, scroll to **Approval rules**. +1. Select **Add approval rule**. +1. Create a rule named `Enforce CODEOWNERS`. +1. Select **All protected branches**. +1. To make the rule required in GitLab Premium and GitLab Ultimate, + set the **Approvals required** to `1`. +1. Add the `managers` group as approvers. +1. Select **Add approval rule**. -^[Frontend] @your-org/frontend -*.scss -*.js +When added, the `Enforce CODEOWNERS` rule looks like this: -^[Backend] @your-org/backend -*.rb -``` +![New approval rule in place](img/approval_rules_v16_2.png) -You'll need to push this to `main`, and then make sure that code pushed to the 1.x and 2.x branches contains this CODEOWNERS file. +## Create protections for your release branches -## Enforce CODEOWNERS with an approval rule +You've configured several protections for your project, and you're now ready to +combine those protections together to safeguard your project's release branches: -Hmm. The problem: FREE customers only get optional rules. Required approvals? you've got to be PREMIUM or higher. +- Your users are sorted into logical groups and subgroups. +- Your CODEOWNERS file describes the subject matter experts for file types and directories. +- Your approval rule encourages (in GitLab Free) or requires (in GitLab Premium and GitLab Ultimate) + the subject matter experts to review changes. -1. Go to your project and select **Settings > Merge requests**. -1. In the **Merge request approvals** section, scroll to **Approval rules**. -1. Select **Add approval rule**. -1. Create a rule named `SOME TITLE HERE`. -1. Select **All protected branches**. This setting applies the rule to all branches matching `1.x` or `2.x`. -1. Set the **Approvals required** to `1` to make the rule required. -1. Add the `managers` group as approvers. -1. Select **Add approval rule**. +Your `excelsior` project uses [semantic versioning](https://semver.org/) for +release branch names, so you know the release branches follow the pattern `1.x` +and `1.x.x`. You want all code added to these branches to be reviewed by subject +matter experts, and for managers to make the final decision on what work is merged +into the release branch. + +Rather than create protections for a branch at a time, configure two wildcard branch rules +to protect them all: + +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and + search for `Excelsior`. Select the project named `Excelsior`. +1. On the left sidebar, select **Settings > Repository**. +1. Expand **Protected branches**. +1. From the **Branch** dropdown list, type `1.*`, then and select **Create wildcard `1.*`**. +1. To require everyone to submit merge requests, rather than pushing commits directly: + 1. Set **Allowed to merge** to **Maintainers**. + 1. Set **Allowed to push and merge** to **No one**. + 1. Leave **Allowed to force push** disabled. +1. In GitLab Premium and GitLab Ultimate, to require Code Owners to review changes + to files they work on, toggle **Require approval from code owners**. +1. Select **Protect**. + +Repeat this process and create another wildcard branch rule for `1.*.*` branches. +The rules are in place, even though the branches don't exist yet: + +![main and 1.x are now protected](img/branch_list_v16_1.png) + +### Create the release branches + +Now that all branch protections in place, you're ready to create your 1.0 release branch: + +1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and + search for `Excelsior`. Select the project named `Excelsior`. +1. On the left sidebar, select **Code > Branches**. +1. On the top right, select **New branch**. Name it `1.0`. +1. Select **Create branch**. +1. On the left sidebar, select **Code > Branches**. In the list of branches, + branch `1.0` should be show that it is protected: + + ![List of branches, showing 1.0 is protected](img/branch_is_protected_v16_2.png) + +Congratulations! Your engineers can work independently in their feature branches, +and all code submitted for consideration for the 1.0 release branch will +be reviewed by subject matter experts. -- GitLab From de24a321586654260be4128327c3d1223d216bef Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Tue, 27 Jun 2023 13:22:33 -0700 Subject: [PATCH 08/18] Show results with screencaps Show how the user can determine if branches are protected. Peace of mind is a good thing. --- .../img/protections_in_place_v16_2.png | Bin 0 -> 22111 bytes doc/tutorials/protected_workflow/index.md | 16 ++++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 doc/tutorials/protected_workflow/img/protections_in_place_v16_2.png diff --git a/doc/tutorials/protected_workflow/img/protections_in_place_v16_2.png b/doc/tutorials/protected_workflow/img/protections_in_place_v16_2.png new file mode 100644 index 0000000000000000000000000000000000000000..b21a714562efaf7e70a4d1cc8dfc7f3cb541ec44 GIT binary patch literal 22111 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 93da861e3caf74..e80e87b138a9d5 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -164,7 +164,7 @@ To add this file to your `excelsior` project: 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `Excelsior`. Select the project named `Excelsior`. 1. Next to the branch name, select the plus icon (**{plus}**), then **New file**: - ![Create a new file in the project](new_file_v16_2.png) + ![Create a new file in the project](img/new_file_v16_2.png) 1. For **Filename**, enter `CODEOWNERS`. This will create a file named `CODEOWNERS` in the root directory of your project. 1. Paste this example into the editing area, changing `@engineering/` if it @@ -275,10 +275,18 @@ Now that all branch protections in place, you're ready to create your 1.0 releas 1. On the left sidebar, select **Code > Branches**. 1. On the top right, select **New branch**. Name it `1.0`. 1. Select **Create branch**. -1. On the left sidebar, select **Code > Branches**. In the list of branches, - branch `1.0` should be show that it is protected: - ![List of branches, showing 1.0 is protected](img/branch_is_protected_v16_2.png) +The branch protections are now visible in the UI: + +- On the left sidebar, select **Code > Branches**. In the list of branches, + branch `1.0` should be show that it is protected: + + ![List of branches, showing 1.0 is protected](img/branch_is_protected_v16_2.png) + +- On the left sidebar, select **Settings > Repository**, then expand **Branch rules** + to see details about all protected branches: + + ![List of protected branches and their protections](img/protections_in_place_v16_2.png) Congratulations! Your engineers can work independently in their feature branches, and all code submitted for consideration for the 1.0 release branch will -- GitLab From c1057a51a0b13e65167020dc3c2d0abf522bb951 Mon Sep 17 00:00:00 2001 From: Joe Woodward Date: Thu, 29 Jun 2023 19:25:50 +0000 Subject: [PATCH 09/18] Good suggestions from tech review Lots of good review on this process. Steps updated as a result. --- doc/tutorials/protected_workflow/index.md | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index e80e87b138a9d5..2a12c277c82a94 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -45,7 +45,7 @@ the project. Here, you'll set up the Engineering group: 1. Personalize your experience so GitLab shows the most helpful information to you: - For **Role**, select `System administrator`. - For **Who will be using this group?** select `My company or team`. - - For **What will you use this group for?** select `I want to manage my code.` + - For **What will you use this group for?** select `I want to store my code.` 1. Skip inviting members to the group. You'll add users in a later section of this tutorial. 1. Select **Create group**. @@ -81,9 +81,8 @@ Next, add the subgroup as a member of the `engineering` group: 1. On the left sidebar, select **Manage > Members**. 1. On the top right, select **Invite a group**. 1. For **Select a group to invite**, select `Engineering / Managers`. -1. Select the role that members of this subgroup should receive in the `engineering` group. - When adding the `Managers` subgroup, select `Maintainer`. When adding the other - subgroups, use the `Developer` role. +1. When adding the subgroups select the role `Maintainer`. + This configures the highest role a member of the subgroup can inherit when accessing the `engineering` group and its projects. 1. Optional. Select an expiration date. 1. Select **Invite**. @@ -159,7 +158,7 @@ NOTE: GitLab Free supports only optional reviews. To make reviews required, you need GitLab Premium or Ultimate. -To add this file to your `excelsior` project: +To add a CODEOWNERS file to your `excelsior` project: 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `Excelsior`. Select the project named `Excelsior`. @@ -178,12 +177,12 @@ To add this file to your `excelsior` project: CODEOWNERS @engineering/managers # Frontend files should be reviewed by FE engineers - ^[Frontend] @engineering/frontend + [Frontend] @engineering/frontend *.scss *.js # Backend files should be reviewed by BE engineers - ^[Backend] @engineering/backend + [Backend] @engineering/backend *.rb ``` @@ -273,15 +272,15 @@ Now that all branch protections in place, you're ready to create your 1.0 releas 1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and search for `Excelsior`. Select the project named `Excelsior`. 1. On the left sidebar, select **Code > Branches**. -1. On the top right, select **New branch**. Name it `1.0`. +1. On the top right, select **New branch**. Name it `1.0.0`. 1. Select **Create branch**. The branch protections are now visible in the UI: - On the left sidebar, select **Code > Branches**. In the list of branches, - branch `1.0` should be show that it is protected: + branch `1.0.0` should be show that it is protected: - ![List of branches, showing 1.0 is protected](img/branch_is_protected_v16_2.png) + ![List of branches, showing 1.0.0 is protected](img/branch_is_protected_v16_2.png) - On the left sidebar, select **Settings > Repository**, then expand **Branch rules** to see details about all protected branches: @@ -289,5 +288,5 @@ The branch protections are now visible in the UI: ![List of protected branches and their protections](img/protections_in_place_v16_2.png) Congratulations! Your engineers can work independently in their feature branches, -and all code submitted for consideration for the 1.0 release branch will +and all code submitted for consideration for the 1.0.0 release branch will be reviewed by subject matter experts. -- GitLab From f982a96873abddfe4d65c22a5f3aa6b9011b82a3 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Thu, 6 Jul 2023 13:00:22 -0700 Subject: [PATCH 10/18] Begin addressing technical feedback Reshape a subheading into "Enforce CODEOWNER approval on branches" and talk about protecting the * branches and the 1.* branches. We don't need 1.*.*. Shift useful info into a note. Use Joe's info about inheritance to rewrite the intro to adding users to subgroups. --- doc/tutorials/protected_workflow/index.md | 31 ++++++++++++++--------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 2a12c277c82a94..0d74ab1a47cdb0 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -22,8 +22,8 @@ release branches, and creates a minimal approval workflow for the project: 1. [Create the Excelsior project](#create-the-excelsior-project) 1. [Add a basic CODEOWNERS file](#add-a-basic-codeowners-file) 1. [Configure approval rules](#configure-approval-rules) +1. [Enforce CODEOWNER approval on branches](#enforce-codeowner-approval-on-branches) 1. [Create the release branches](#create-the-release-branches) -1. [Create protections for your release branches](#create-protections-for-your-release-branches) ## Prerequisites @@ -96,10 +96,16 @@ This approach minimizes future data entry and potential inconsistencies. ### Add users to the subgroups -After you create the subgroups, take advantage of group inheritance by adding -team members to their appropriate _subgroups_, instead of the `engineering` group. -For example, when you add a user to the `frontend` subgroup, the user inherits -membership in the parent (`engineering`) group. +When you add a subgroup to a parent group (`engineering`) you set an upper bound for +what roles the subgroup members can inherit for projects that are owned by `engineering`. +In the previous step, you limited members of the `manager` subgroup to the `Maintainer` role +for projects owned by `engineering`. As a result: + +- User 1 is added to the `manager` subgroup with the `Guest` role, and receives + the `Guest` role on `engineering` projects. +- User 2 is added to the `manager` group with the `Owner` role. This role is higher + than the maximum role (`Maintainer`) you set, so User 2 receives the `Maintainer` + role instead of `Owner`. To add a user to the `frontend` subgroup: @@ -204,11 +210,12 @@ available for all future branches created in this project. ## Configure approval rules -The CODEOWNERS file describes the appropriate reviewers for directories and -file types. Approval rules direct merge requests to those reviewers. +NOTE: In GitLab Free, approval rules are optional. Required approvals are available only in GitLab Premium and GitLab Ultimate. +The CODEOWNERS file describes the appropriate reviewers for directories and +file types. Approval rules direct merge requests to those reviewers. Here, you will set up an approval rule that uses the information in your new CODEOWNERS file and adds protection for release branches: @@ -228,10 +235,10 @@ When added, the `Enforce CODEOWNERS` rule looks like this: ![New approval rule in place](img/approval_rules_v16_2.png) -## Create protections for your release branches +## Enforce CODEOWNER approval on branches You've configured several protections for your project, and you're now ready to -combine those protections together to safeguard your project's release branches: +combine those protections together to safeguard your project's important branches: - Your users are sorted into logical groups and subgroups. - Your CODEOWNERS file describes the subject matter experts for file types and directories. @@ -251,7 +258,7 @@ to protect them all: search for `Excelsior`. Select the project named `Excelsior`. 1. On the left sidebar, select **Settings > Repository**. 1. Expand **Protected branches**. -1. From the **Branch** dropdown list, type `1.*`, then and select **Create wildcard `1.*`**. +1. From the **Branch** dropdown list, type `*`, then and select **Create wildcard `*`**. 1. To require everyone to submit merge requests, rather than pushing commits directly: 1. Set **Allowed to merge** to **Maintainers**. 1. Set **Allowed to push and merge** to **No one**. @@ -260,8 +267,8 @@ to protect them all: to files they work on, toggle **Require approval from code owners**. 1. Select **Protect**. -Repeat this process and create another wildcard branch rule for `1.*.*` branches. -The rules are in place, even though the branches don't exist yet: +Repeat this process and create another wildcard branch rule for `1.*` branches. +The rules are in place, even though no `1.*` branches exist yet: ![main and 1.x are now protected](img/branch_list_v16_1.png) -- GitLab From d337d99fb474a75b94a620245f1409a11868e034 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Thu, 6 Jul 2023 13:20:54 -0700 Subject: [PATCH 11/18] Set groups to private instead of public Kai recommends it. I'd love to know why, but in the interest of getting this work done, I'll change it first and ask questions after. --- doc/tutorials/protected_workflow/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 0d74ab1a47cdb0..1c5af461e43f52 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -41,7 +41,7 @@ the project. Here, you'll set up the Engineering group: 1. Select **Create group**. 1. For **Group name**, enter `Engineering`. 1. For the **Group URL**, enter `engineering`. -1. Set the **Visibility level** to `Public`. +1. Set the **Visibility level** to `Private`. 1. Personalize your experience so GitLab shows the most helpful information to you: - For **Role**, select `System administrator`. - For **Who will be using this group?** select `My company or team`. @@ -71,7 +71,7 @@ First, create the new subgroup: 1. On the overview page for the `engineering` group, in the upper-right corner, select **New subgroup**. 1. For the **Subgroup name**, enter `Managers`. -1. Set the **Visibility level** to `Public`. +1. Set the **Visibility level** to `Private`. 1. Select **Create subgroup**. Next, add the subgroup as a member of the `engineering` group: -- GitLab From 24694d4e691bcb85aef9ab41b8370d13853c1b83 Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Thu, 6 Jul 2023 13:31:44 -0700 Subject: [PATCH 12/18] Close loophole on editing rules in situ Fix the setting to ensure users can't edit the approval settings as part of the merge request itself. It's quite the loophole. --- doc/tutorials/protected_workflow/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 1c5af461e43f52..8b8823247c8e68 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -230,6 +230,9 @@ file and adds protection for release branches: set the **Approvals required** to `1`. 1. Add the `managers` group as approvers. 1. Select **Add approval rule**. +1. Scroll to **Approval settings** and make sure + **Prevent editing approval rules in merge requests** is selected. +1. Select **Save changes**. When added, the `Enforce CODEOWNERS` rule looks like this: -- GitLab From cdc19f6917c934b8057f4b22d2dcda857772df6c Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Thu, 6 Jul 2023 14:09:49 -0700 Subject: [PATCH 13/18] Update protected-branch image, revise instructions Fix the instructions for how to protect the default branch. Reshoot the image showing protections on just main and 1.*. --- .../img/branch_list_v16_1.png | Bin 13071 -> 11202 bytes doc/tutorials/protected_workflow/index.md | 12 +++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/doc/tutorials/protected_workflow/img/branch_list_v16_1.png b/doc/tutorials/protected_workflow/img/branch_list_v16_1.png index e62458fcd44aa126d95185a12b518efef30d55f4..d557c4a935088740058a6ef8679146e68e431b08 100644 GIT binary patch delta 10729 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 Uo{BDEU|?YIboFyt=akR{06`wSlmGw# delta 12612 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 Repository**. 1. Expand **Protected branches**. -1. From the **Branch** dropdown list, type `*`, then and select **Create wildcard `*`**. +1. From the **Branch** dropdown list, type `1.*`, then and select **Create wildcard `1.*`**. 1. To require everyone to submit merge requests, rather than pushing commits directly: 1. Set **Allowed to merge** to **Maintainers**. 1. Set **Allowed to push and merge** to **No one**. @@ -269,9 +269,11 @@ to protect them all: 1. In GitLab Premium and GitLab Ultimate, to require Code Owners to review changes to files they work on, toggle **Require approval from code owners**. 1. Select **Protect**. +1. In the table of branches, find the rule marked as `Default`. (Depending on + your version of GitLab, this branch may be named `main` or `master`.) Set the + values for this branch to match the settings you used for the `1.*` rule. -Repeat this process and create another wildcard branch rule for `1.*` branches. -The rules are in place, even though no `1.*` branches exist yet: +Your rules are now in place, even though no `1.*` branches exist yet: ![main and 1.x are now protected](img/branch_list_v16_1.png) -- GitLab From fcc8900007425f0faae61b3bc7cfecfa9b94a2f2 Mon Sep 17 00:00:00 2001 From: Kati Paizee Date: Tue, 11 Jul 2023 20:42:31 +0000 Subject: [PATCH 14/18] First round of style review edits Change formatting, condense down wording --- doc/tutorials/protected_workflow/index.md | 48 ++++++++++------------- 1 file changed, 21 insertions(+), 27 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 7ef451963818cc..ab94a86662b4d7 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -2,7 +2,6 @@ stage: Create group: Code Review info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/#assignments" -type: reference, howto --- @@ -16,7 +15,7 @@ groups with branch protections, and then enforce those protections with approval This tutorial sets up protections for Excelsior Project's `1.x` and `1.x.x` release branches, and creates a minimal approval workflow for the project: -1. [Create the `engineering` groups](#create-the-engineering-group) +1. [Create the `engineering` group](#create-the-engineering-group) 1. [Create subgroups in `engineering`](#create-subgroups-in-engineering) 1. [Add users to the subgroups](#add-users-to-the-subgroups) 1. [Create the Excelsior project](#create-the-excelsior-project) @@ -41,11 +40,11 @@ the project. Here, you'll set up the Engineering group: 1. Select **Create group**. 1. For **Group name**, enter `Engineering`. 1. For the **Group URL**, enter `engineering`. -1. Set the **Visibility level** to `Private`. +1. Set the **Visibility level** to **Private**. 1. Personalize your experience so GitLab shows the most helpful information to you: - - For **Role**, select `System administrator`. - - For **Who will be using this group?** select `My company or team`. - - For **What will you use this group for?** select `I want to store my code.` + - For **Role**, select **System administrator**. + - For **Who will be using this group?** select **My company or team**. + - For **What will you use this group for?** select **I want to store my code**. 1. Skip inviting members to the group. You'll add users in a later section of this tutorial. 1. Select **Create group**. @@ -71,7 +70,7 @@ First, create the new subgroup: 1. On the overview page for the `engineering` group, in the upper-right corner, select **New subgroup**. 1. For the **Subgroup name**, enter `Managers`. -1. Set the **Visibility level** to `Private`. +1. Set the **Visibility level** to **Private**. 1. Select **Create subgroup**. Next, add the subgroup as a member of the `engineering` group: @@ -81,7 +80,7 @@ Next, add the subgroup as a member of the `engineering` group: 1. On the left sidebar, select **Manage > Members**. 1. On the top right, select **Invite a group**. 1. For **Select a group to invite**, select `Engineering / Managers`. -1. When adding the subgroups select the role `Maintainer`. +1. When adding the subgroups select the role **Maintainer**. This configures the highest role a member of the subgroup can inherit when accessing the `engineering` group and its projects. 1. Optional. Select an expiration date. 1. Select **Invite**. @@ -94,18 +93,17 @@ three subgroups, like this: This approach minimizes future data entry and potential inconsistencies. -### Add users to the subgroups +## Add users to the subgroups -When you add a subgroup to a parent group (`engineering`) you set an upper bound for -what roles the subgroup members can inherit for projects that are owned by `engineering`. -In the previous step, you limited members of the `manager` subgroup to the `Maintainer` role +In the previous step, when you added your subgroups to the parent group (`engineering`), you limited +members of the subgroups to the Maintainer role. This is the highest role they can inherit for projects owned by `engineering`. As a result: -- User 1 is added to the `manager` subgroup with the `Guest` role, and receives - the `Guest` role on `engineering` projects. -- User 2 is added to the `manager` group with the `Owner` role. This role is higher - than the maximum role (`Maintainer`) you set, so User 2 receives the `Maintainer` - role instead of `Owner`. +- User 1 is added to the `manager` subgroup with the Guest role, and receives + the Guest role on `engineering` projects. +- User 2 is added to the `manager` group with the Owner role. This role is higher + than the maximum role (Maintainer) you set, so User 2 receives the Maintainer + role instead of Owner. To add a user to the `frontend` subgroup: @@ -113,8 +111,8 @@ To add a user to the `frontend` subgroup: and search for `frontend`. Select the `Frontend` group. 1. Select **Manage > Members**. 1. Select **Invite members**. -1. Fill in the fields. Give each user `Developer` access by default, increasing it - to `Maintainer` if this user reviews the work of others. +1. Fill in the fields. Select the **Developer** role by default, increasing it + to **Maintainer** if this user reviews the work of others. 1. Select **Invite**. 1. Repeat these steps until you've added all of the frontend engineers into the `frontend` subgroup. @@ -139,7 +137,7 @@ To create the new `excelsior` project: 1. Enter the project details: - In the **Project name** field, enter `Excelsior`. The **Project slug** should auto-populate with `excelsior`. - - For **Visibility Level**, select `Public`. + - For **Visibility Level**, select **Public**. - Select **Initialize repository with a README** to add an initial file to the repository. 1. Select **Create project**. @@ -150,7 +148,7 @@ It should look like this: You'll use a feature on this page in the next step. -### Add a basic CODEOWNERS file +## Add a basic CODEOWNERS file Add a CODEOWNERS file to the root directory of your project to route reviews to the right subgroup. This example sets up four rules: @@ -257,11 +255,9 @@ into the release branch. Rather than create protections for a branch at a time, configure wildcard branch rules to protect multiple branches: -1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and - search for `Excelsior`. Select the project named `Excelsior`. 1. On the left sidebar, select **Settings > Repository**. 1. Expand **Protected branches**. -1. From the **Branch** dropdown list, type `1.*`, then and select **Create wildcard `1.*`**. +1. From the **Branch** dropdown list, type `1.*`, and then select **Create wildcard `1.*`**. 1. To require everyone to submit merge requests, rather than pushing commits directly: 1. Set **Allowed to merge** to **Maintainers**. 1. Set **Allowed to push and merge** to **No one**. @@ -277,12 +273,10 @@ Your rules are now in place, even though no `1.*` branches exist yet: ![main and 1.x are now protected](img/branch_list_v16_1.png) -### Create the release branches +## Create the release branches Now that all branch protections in place, you're ready to create your 1.0 release branch: -1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and - search for `Excelsior`. Select the project named `Excelsior`. 1. On the left sidebar, select **Code > Branches**. 1. On the top right, select **New branch**. Name it `1.0.0`. 1. Select **Create branch**. -- GitLab From 098c9b0e8da53d4d96a1746aaca2c5ab5b6adf9c Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Tue, 11 Jul 2023 20:48:07 +0000 Subject: [PATCH 15/18] Change branch name to 1.0.0 Add the final .0 to the branch name --- doc/tutorials/protected_workflow/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index ab94a86662b4d7..edc201903db571 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -275,7 +275,7 @@ Your rules are now in place, even though no `1.*` branches exist yet: ## Create the release branches -Now that all branch protections in place, you're ready to create your 1.0 release branch: +Now that all branch protections in place, you're ready to create your 1.0.0 release branch: 1. On the left sidebar, select **Code > Branches**. 1. On the top right, select **New branch**. Name it `1.0.0`. -- GitLab From 4e9c2c6e90bd697037ea1f93d2f2d0c30d6cec2f Mon Sep 17 00:00:00 2001 From: Kati Paizee Date: Tue, 11 Jul 2023 20:53:51 +0000 Subject: [PATCH 16/18] Remove extra line We don't need to explain quite so much. --- doc/tutorials/protected_workflow/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index edc201903db571..bc89e9fb78d3b3 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -91,8 +91,6 @@ three subgroups, like this: ![The engineering group has three subgroups](img/subgroup_structure_v16_1.png) -This approach minimizes future data entry and potential inconsistencies. - ## Add users to the subgroups In the previous step, when you added your subgroups to the parent group (`engineering`), you limited -- GitLab From 53a0670e03bf75b993055b09c20f948a1e54281a Mon Sep 17 00:00:00 2001 From: Kati Paizee Date: Tue, 11 Jul 2023 20:55:47 +0000 Subject: [PATCH 17/18] Strip starting line we don't need Users should already be in this spot. --- doc/tutorials/protected_workflow/index.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index bc89e9fb78d3b3..6dd8b8af7affe9 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -215,8 +215,6 @@ file types. Approval rules direct merge requests to those reviewers. Here, you will set up an approval rule that uses the information in your new CODEOWNERS file and adds protection for release branches: -1. On the left sidebar, at the top, select **Search GitLab** (**{search}**) and - search for `Excelsior`. Select the project named `Excelsior`. 1. On the left sidebar, select **Settings > Merge requests**. 1. In the **Merge request approvals** section, scroll to **Approval rules**. 1. Select **Add approval rule**. -- GitLab From 574f47d578f9e3f2f69977cc59a5b4092ce32a5c Mon Sep 17 00:00:00 2001 From: Amy Qualls Date: Tue, 11 Jul 2023 21:16:06 +0000 Subject: [PATCH 18/18] Apply 1 suggestion(s) to 1 file(s) --- doc/tutorials/protected_workflow/index.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/doc/tutorials/protected_workflow/index.md b/doc/tutorials/protected_workflow/index.md index 6dd8b8af7affe9..5245bdc5ba9442 100644 --- a/doc/tutorials/protected_workflow/index.md +++ b/doc/tutorials/protected_workflow/index.md @@ -206,10 +206,6 @@ available for all future branches created in this project. ## Configure approval rules -NOTE: -In GitLab Free, approval rules are optional. Required approvals are -available only in GitLab Premium and GitLab Ultimate. - The CODEOWNERS file describes the appropriate reviewers for directories and file types. Approval rules direct merge requests to those reviewers. Here, you will set up an approval rule that uses the information in your new CODEOWNERS -- GitLab