From eb215425bb3b2eb480916e98968a0f8c0375d988 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Wed, 26 Jul 2023 13:52:37 +0100 Subject: [PATCH 01/11] Use header for the different repo models Since there is quite a lot of text, put under actual headings rather than as part of the bullet point list --- _episodes/41-code-review.md | 52 +++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index 15b8c7fd5..d04791690 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -30,29 +30,35 @@ and improve our code by engaging in code review process with other team members. > the type of development model you use in your project. > Two commonly used models are: > -> - **fork and pull model** - -> where anyone can **fork** an existing repository -> (to create their copy of the project linked to the source) -> and push changes to their personal fork. -> A contributor can work independently on their own fork as they do not need -> permissions on the source repository to push modifications to a fork they own. -> The changes from contributors can then be **pulled** into the source repository -> by the project maintainer on request and after a code review process. -> This model is popular with open source projects as it -> reduces the start up costs for new contributors -> and allows them to work independently without upfront coordination -> with source project maintainers. -> So, for example, you may use this model when you are an external collaborator on a project -> rather than a core team member. -> - **shared repository model** - -> where collaborators are granted push access to a single shared code repository. -> Even though collaborators have write access to the main development and production branches, -> the best practice of creating feature branches for new developments -> and when changes need to be made is still followed. -> This is to enable easier testing of the new code -> and initiate code review and general discussion about a set of changes -> before they are merged into the development branch. -> This model is more prevalent with teams and organisations collaborating on private projects. +> * Fork and pull model +> * Shared repository model +> +> ### Fork and Pull Model +> +> Where anyone can **fork** an existing repository +> (to create their copy of the project linked to the source) +> and push changes to their personal fork. +> A contributor can work independently on their own fork as they do not need +> permissions on the source repository to push modifications to a fork they own. +> The changes from contributors can then be **pulled** into the source repository +> by the project maintainer on request and after a code review process. +> This model is popular with open source projects as it +> reduces the start up costs for new contributors +> and allows them to work independently without upfront coordination +> with source project maintainers. +> So, for example, you may use this model when you are an external collaborator on a project +> rather than a core team member. +> +> ### Shared Repository Model +> +> Where collaborators are granted push access to a single shared code repository. +> Even though collaborators have write access to the main development and production branches, +> the best practice of creating feature branches for new developments +> and when changes need to be made is still followed. +> This is to enable easier testing of the new code +> and initiate code review and general discussion about a set of changes +> before they are merged into the development branch. +> This model is more prevalent with teams and organisations collaborating on private projects. {: .callout} Regardless of the collaborative code development model you and your collaborators use - From 1c86412bc1f98f12b067d2afc3d179cc635551a5 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Wed, 26 Jul 2023 13:55:30 +0100 Subject: [PATCH 02/11] Add information for protecting the main branch These instructions mean that on a shared repository the pull request system must be used. This prevents accidentally pushing to the main branch, as well as ensuring people get into the habbit of raising pull requests for their changes. --- _episodes/41-code-review.md | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index d04791690..fadea87df 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -52,13 +52,26 @@ and improve our code by engaging in code review process with other team members. > ### Shared Repository Model > > Where collaborators are granted push access to a single shared code repository. -> Even though collaborators have write access to the main development and production branches, -> the best practice of creating feature branches for new developments -> and when changes need to be made is still followed. +> By default, collaborators have write access to the main branch. +> However, best practises is to create feature branches for new developments, +> and protect the main branch. > This is to enable easier testing of the new code > and initiate code review and general discussion about a set of changes > before they are merged into the development branch. > This model is more prevalent with teams and organisations collaborating on private projects. +> It also helps to keep the main branch stable, making it easier for other developers to work on the code. +> +> To protect the main branch in GitHub, go to the repository settings, select `Branches`. +> Click `Add Rule`. Type in the name of your main branch (e.g. `main` and/or `develop`). +> Tick the check box saying require pull requests. This will ensure all changes to the +> branch are done via a pull request. +> +> It is recomended to also tick `Require approvals` and `Require status checks before merging`. +> The first means someone besides the person who raised the pull request will need to approve the change. +> The second ensures that CI has run succesfully before allowing the changes to be made. +> +> See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). + {: .callout} Regardless of the collaborative code development model you and your collaborators use - From 354495be6c7893c510e2bd22f85333b736055475 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Wed, 26 Jul 2023 13:57:52 +0100 Subject: [PATCH 03/11] Add screenshot demonstrating setting branch proection --- _episodes/41-code-review.md | 2 ++ fig/github-branch-protection-settings.png | Bin 0 -> 67401 bytes 2 files changed, 2 insertions(+) create mode 100644 fig/github-branch-protection-settings.png diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index fadea87df..d2067db35 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -66,6 +66,8 @@ and improve our code by engaging in code review process with other team members. > Tick the check box saying require pull requests. This will ensure all changes to the > branch are done via a pull request. > +> ![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) +> > It is recomended to also tick `Require approvals` and `Require status checks before merging`. > The first means someone besides the person who raised the pull request will need to approve the change. > The second ensures that CI has run succesfully before allowing the changes to be made. diff --git a/fig/github-branch-protection-settings.png b/fig/github-branch-protection-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3434a7fc93f173437273d266855d7589f269d5 GIT binary patch literal 67401 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 S%ln;C%SkIsl}LQ}{J#K^t66{m literal 0 HcmV?d00001 From 3feff14c46a2f49abd4d77a2b85f94eee92d64e1 Mon Sep 17 00:00:00 2001 From: Thomas Kiley <138868636+thomaskileyukaea@users.noreply.github.com> Date: Fri, 4 Aug 2023 10:23:05 +0100 Subject: [PATCH 04/11] Amend words to flow better now collaborative development models isn't a list Co-authored-by: Aleksandra Nenadic --- _episodes/41-code-review.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index d2067db35..c21e56d82 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -35,7 +35,7 @@ and improve our code by engaging in code review process with other team members. > > ### Fork and Pull Model > -> Where anyone can **fork** an existing repository +> In this model, anyone can **fork** an existing repository > (to create their copy of the project linked to the source) > and push changes to their personal fork. > A contributor can work independently on their own fork as they do not need @@ -51,7 +51,7 @@ and improve our code by engaging in code review process with other team members. > > ### Shared Repository Model > -> Where collaborators are granted push access to a single shared code repository. +> In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. > However, best practises is to create feature branches for new developments, > and protect the main branch. From fd2d772fcc1b8019fa00f2f93648949665d76c6f Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 10:43:54 +0100 Subject: [PATCH 05/11] Fix callout box --- _episodes/41-code-review.md | 1 - 1 file changed, 1 deletion(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index c21e56d82..13e2e4d2b 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -73,7 +73,6 @@ and improve our code by engaging in code review process with other team members. > The second ensures that CI has run succesfully before allowing the changes to be made. > > See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). - {: .callout} Regardless of the collaborative code development model you and your collaborators use - From a2187b2b312955783f7e43023f0861dc6dffa5f0 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 10:44:10 +0100 Subject: [PATCH 06/11] Fix spelling typos --- _episodes/41-code-review.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index 13e2e4d2b..f0d774e98 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -53,12 +53,12 @@ and improve our code by engaging in code review process with other team members. > > In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. -> However, best practises is to create feature branches for new developments, +> However, it is best practice to create feature branches for new developments, > and protect the main branch. > This is to enable easier testing of the new code > and initiate code review and general discussion about a set of changes > before they are merged into the development branch. -> This model is more prevalent with teams and organisations collaborating on private projects. +> This model is more prevalent with teams and organizations collaborating on private projects. > It also helps to keep the main branch stable, making it easier for other developers to work on the code. > > To protect the main branch in GitHub, go to the repository settings, select `Branches`. @@ -68,9 +68,9 @@ and improve our code by engaging in code review process with other team members. > > ![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) > -> It is recomended to also tick `Require approvals` and `Require status checks before merging`. +> It is recommended to also tick `Require approvals` and `Require status checks before merging`. > The first means someone besides the person who raised the pull request will need to approve the change. -> The second ensures that CI has run succesfully before allowing the changes to be made. +> The second ensures that CI has run successWfully before allowing the changes to be made. > > See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). {: .callout} From 6c55c36c0b83630647feddbac802b982e3c5e60d Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 11:42:11 +0100 Subject: [PATCH 07/11] Move configuration of branch protection to extras This is quite detailed and isn't directly connected to the topic of code review. Further, it is GitHub specific and someones repository might already be setup correctly. --- _config.yml | 1 + _episodes/41-code-review.md | 22 +++---------- _extras/github-repo-settings.md | 57 +++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 _extras/github-repo-settings.md diff --git a/_config.yml b/_config.yml index 2b6226a81..df004e2c7 100644 --- a/_config.yml +++ b/_config.yml @@ -93,6 +93,7 @@ extras_order: - guide - common-issues - discuss + - github-repo-settings - vscode - functional-programming - persistence diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index f0d774e98..d1c2a07f4 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -54,25 +54,11 @@ and improve our code by engaging in code review process with other team members. > In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. > However, it is best practice to create feature branches for new developments, -> and protect the main branch. -> This is to enable easier testing of the new code -> and initiate code review and general discussion about a set of changes -> before they are merged into the development branch. +> and protect the main branch. See our [recommended GitHub settings](../github-repo-settings#protecting-the-main-branch) +> for how to do this. +> While it requires more upfront coordination, it is easier to share each others +> work, so it works well for more stable teams. > This model is more prevalent with teams and organizations collaborating on private projects. -> It also helps to keep the main branch stable, making it easier for other developers to work on the code. -> -> To protect the main branch in GitHub, go to the repository settings, select `Branches`. -> Click `Add Rule`. Type in the name of your main branch (e.g. `main` and/or `develop`). -> Tick the check box saying require pull requests. This will ensure all changes to the -> branch are done via a pull request. -> -> ![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) -> -> It is recommended to also tick `Require approvals` and `Require status checks before merging`. -> The first means someone besides the person who raised the pull request will need to approve the change. -> The second ensures that CI has run successWfully before allowing the changes to be made. -> -> See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). {: .callout} Regardless of the collaborative code development model you and your collaborators use - diff --git a/_extras/github-repo-settings.md b/_extras/github-repo-settings.md new file mode 100644 index 000000000..f814f7184 --- /dev/null +++ b/_extras/github-repo-settings.md @@ -0,0 +1,57 @@ +--- +title: "Additional Material: GitHub Repo Settings" +layout: episode +teaching: 5 +exercises: 5 +questions: +- "What are the recommend settings for a GitHub repository?" +- "How can we prevent inadvertent pushes to main that don't go through code review?" +objectives: +- "How to set up branch protection on the main branch" +keypoints: +- "Setting branch protection ensures everyone is following the same process." +--- + +## Introduction + +Here outlines some recommendations for how a GitHub repository should be configured. +These are particularly important when working on a shared repository (as described in +the [code review episode](../41-code-review#collaborative-code-development-models)). + +## Protecting the main branch + +By default, any collaborator can push to any branch on a shared repository. +It is possible to prevent this by "protecting" the main branch. + +This has a number of advantages: + +* Avoids someone accidentally pushing work-in-progress changes to the branch + that everyone else downloads. +* Ensures everyone follows a code review process. +* Ensures all changes are checked by continuous integration. + +### How to protect the main branch + +To protect the main branch in GitHub, go to the repository settings, select `Branches`. +Click `Add Rule`. Type in the name of your main branch (e.g. `main` and/or `develop`). +Tick the check box saying require pull requests. This will ensure all changes to the +branch are done via a pull request. + +![GitHub add a branch protection rule settings screen with recommended settings enabled for a branch called main](../fig/github-branch-protection-settings.png) + +It is recommended to also tick `Require approvals`. + +This means someone besides the person who raised the pull request will need to approve the change. + +It is also recommended to tick `Require status checks before merging`. + +This ensures that CI has run successfully before allowing the changes to be made. + +Finally, it is recommended to tick `Do not allow bypassing the above settings`. + +This means that administrators of the repository will have to follow the same process to. +If there becomes a need to push to the main branch, these settings can be changed +by administrators to allow this, setting this means that administrators cannot push by mistake +during the normal course of their work. + +See [GitHubs documentation for more information about protecting branches](https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-protected-branches/managing-a-branch-protection-rule). From 1ebfb52f2e22f6702595ba1d5822a6b9b7d96e08 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 11:42:50 +0100 Subject: [PATCH 08/11] Make formatting of headers in callout box smaller Since this text is a callout box, having full size headers feels wrong. --- _episodes/41-code-review.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index d1c2a07f4..c4a03d502 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -33,7 +33,7 @@ and improve our code by engaging in code review process with other team members. > * Fork and pull model > * Shared repository model > -> ### Fork and Pull Model +> **Fork and Pull Model** > > In this model, anyone can **fork** an existing repository > (to create their copy of the project linked to the source) @@ -49,7 +49,7 @@ and improve our code by engaging in code review process with other team members. > So, for example, you may use this model when you are an external collaborator on a project > rather than a core team member. > -> ### Shared Repository Model +> **Shared Repository Model** > > In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. From c8fd99450a5b0ed3c0ad400b6e167ebe0f72c6f5 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 12:03:07 +0100 Subject: [PATCH 09/11] Simplify the branch protection extra It is only about protecting branches, so remove padding to indicate it might be about other GitHub settings - can be changed to that in the future if required --- _extras/github-repo-settings.md | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/_extras/github-repo-settings.md b/_extras/github-repo-settings.md index f814f7184..b358f726e 100644 --- a/_extras/github-repo-settings.md +++ b/_extras/github-repo-settings.md @@ -1,25 +1,9 @@ --- -title: "Additional Material: GitHub Repo Settings" -layout: episode -teaching: 5 -exercises: 5 -questions: -- "What are the recommend settings for a GitHub repository?" -- "How can we prevent inadvertent pushes to main that don't go through code review?" -objectives: -- "How to set up branch protection on the main branch" -keypoints: -- "Setting branch protection ensures everyone is following the same process." +title: "Additional Material: Protecting the Main Branch on a Shared GitHub Repository" --- ## Introduction -Here outlines some recommendations for how a GitHub repository should be configured. -These are particularly important when working on a shared repository (as described in -the [code review episode](../41-code-review#collaborative-code-development-models)). - -## Protecting the main branch - By default, any collaborator can push to any branch on a shared repository. It is possible to prevent this by "protecting" the main branch. @@ -30,7 +14,7 @@ This has a number of advantages: * Ensures everyone follows a code review process. * Ensures all changes are checked by continuous integration. -### How to protect the main branch +## How to protect the main branch To protect the main branch in GitHub, go to the repository settings, select `Branches`. Click `Add Rule`. Type in the name of your main branch (e.g. `main` and/or `develop`). From f2cdce5675fce68e5c79e0329d957ec111a43766 Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 12:04:24 +0100 Subject: [PATCH 10/11] Update code review section to indicate the extra is about branch protection --- _episodes/41-code-review.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index c4a03d502..b9d67be43 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -54,7 +54,7 @@ and improve our code by engaging in code review process with other team members. > In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. > However, it is best practice to create feature branches for new developments, -> and protect the main branch. See our [recommended GitHub settings](../github-repo-settings#protecting-the-main-branch) +> and protect the main branch. See the extra on [protecting the main branch](../github-repo-settings) > for how to do this. > While it requires more upfront coordination, it is easier to share each others > work, so it works well for more stable teams. From e72a4062f9147bdb10ab2ac3a968d4dce3d3efdd Mon Sep 17 00:00:00 2001 From: Thomas Kiley Date: Fri, 4 Aug 2023 12:05:58 +0100 Subject: [PATCH 11/11] Rename extra to protect-main-branch This extra now only covers protecting the main branch --- _config.yml | 2 +- _episodes/41-code-review.md | 2 +- _extras/{github-repo-settings.md => protect-main-branch.md} | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename _extras/{github-repo-settings.md => protect-main-branch.md} (100%) diff --git a/_config.yml b/_config.yml index df004e2c7..434f152ab 100644 --- a/_config.yml +++ b/_config.yml @@ -93,7 +93,7 @@ extras_order: - guide - common-issues - discuss - - github-repo-settings + - protect-main-branch - vscode - functional-programming - persistence diff --git a/_episodes/41-code-review.md b/_episodes/41-code-review.md index b9d67be43..f9414206e 100644 --- a/_episodes/41-code-review.md +++ b/_episodes/41-code-review.md @@ -54,7 +54,7 @@ and improve our code by engaging in code review process with other team members. > In this model, collaborators are granted push access to a single shared code repository. > By default, collaborators have write access to the main branch. > However, it is best practice to create feature branches for new developments, -> and protect the main branch. See the extra on [protecting the main branch](../github-repo-settings) +> and protect the main branch. See the extra on [protecting the main branch](../protect-main-branch) > for how to do this. > While it requires more upfront coordination, it is easier to share each others > work, so it works well for more stable teams. diff --git a/_extras/github-repo-settings.md b/_extras/protect-main-branch.md similarity index 100% rename from _extras/github-repo-settings.md rename to _extras/protect-main-branch.md