Candoumbe.Pipelines
0.7.0-rc0004
See the version list below for details.
dotnet add package Candoumbe.Pipelines --version 0.7.0-rc0004
NuGet\Install-Package Candoumbe.Pipelines -Version 0.7.0-rc0004
<PackageReference Include="Candoumbe.Pipelines" Version="0.7.0-rc0004" />
paket add Candoumbe.Pipelines --version 0.7.0-rc0004
#r "nuget: Candoumbe.Pipelines, 0.7.0-rc0004"
// Install Candoumbe.Pipelines as a Cake Addin #addin nuget:?package=Candoumbe.Pipelines&version=0.7.0-rc0004&prerelease // Install Candoumbe.Pipelines as a Cake Tool #tool nuget:?package=Candoumbe.Pipelines&version=0.7.0-rc0004&prerelease
Candoumbe.Pipelines
A starter development kit to script your CI/CD using Nuke.
Give a star
⭐ If you like or are using this project please give it a star. Thanks! ⭐
Disclaimer
This project adheres to semantic versioning. Major version zero (0.y.z) is for initial development.
Anything MAY change at any time.
The public API SHOULD NOT be considered stable.
The problem
Most of the time, to set up a CI/CD for your .NET project, you have two options :
1. Going through your repository and use its embeded GUI to create the pipeline
This approach is nice and helpful to get started. But most of the time, the history of changes made to the pipeline is separated from the history of the code base.
2. Writing a pipeline file of some sort
Most of the time in YAML, the file that describes the steps required to build a project are providers specific. So even though you can write YAML, knowning how to write an Azure DevOps pipeline does not really help when it comes to writing a pipeline for GitHub Actions.
The solution
Nuke is a library written by Matthias Koch that helps creating builds.
This project offers an opinionated way at writing pipelines by giving a set of components (more on that later) with the following benefits :
- no need to go your code management tool to set up your project CI/CD.
- no more YAML file : yeah YAML is great but the tooling around it is not great and the structure itself is error prone.
- it's just a C# project that every team member can contribute to !
- it sits right with your source code so that each change to the pipeline is just a commit into your codebase.
Try it out
To get started you'll have to :
- install Nuke.GlobalTool dotnet tool (locally or globally)
- run
dotnet nuke :setup
to setup your pipeline project - replace the
Nuke.Common
nuget dependency with Candoumbe.Pipelines
From this point, you should be able to customize your pipeline by adding [components] \o/.
How does it works ?
This library is built on top of Nuke, an open source library started by Matthias Koch. It provides a set of components that, when added to a pipeline, bring clever default features.
Components are C# interfaces that come with a default / opinionated implementation. They are grouped in namespaces which correspond to their main task.
Candoumbe.Pipelines.Components
: contains the core components needed for general required tasks.
Let's say you have the following Build.cs
class as your starting pipeline
class Build : NukeBuild
{
public static void Main() => Execute<Build>(x => x.Compile());
Target Compile => _ => _
.Executes(() => {
// Code omitted for brievity
});
}
you can get rid of the Compile
property and use the ICompile component instead.
class Build : NukeBuild, ICompile
{
public static void Main() => Execute<Build>(x => ((ICompile)x).Compile());
}
In the example above, the build pipeline benefits from the ICompile component which comes with a default implementation of the Compile
target.
Candoumbe.Pipelines.Components.Workflows
This workspace contains components related to branching strategies and providing tools that can help normalize how teams works.
IGitFlow and IGitHubFlow are two main components that helps handle branching strategy locally.
Some components are used to set the workflow to use throughout a repository and streamline the work of a developer and a team.
working on a feature / hotfix
%%{init: {"flowchart": {"htmlLabels": false}} }%%
flowchart
A((start)) --> B[["./build feature"]]
A -->O[["./build hotfix"]]
O --> P{is on 'hotfix' branch ?}
P -- yes --> finish-hotfix
P -- no --> Q{{computes semver}}
Q --> R{{creates 'hotfix/<semver>' branch}}
R --> S[work on your hotfix]
S --> T{Are you done}
T -- yes --> O
T -- not yet --> S
B --> C{is on 'feature/*' branch ?}
C -- yes --> finish-feature
C -- no --> D[Creates a new feature/* branch]
D --> E[Work on your feature]
E --> F{Are you done ?}
F --yes --> B
F -- not yet --> E
subgraph finish-feature[Finish feature]
N{{Merges changes to develop branch}}
end
subgraph finish-hotfix[Finish hostfix]
Y{{Merges changes to main branch}}
end
finish-hotfix --> Z
finish-feature --> Z((end))
using IGitFlowWithPullRequest or IGitHubFlowWithPullRequest components, the library can automagically create a pull request once you're done working on your feature / hotfix.
class Build : NukeBuild, IGitFlowWithPullRequest
{
public static void Main() => Execute<Build>(x => x.Compile());
Target Compile => _ => _
.Executes(() => {
// Code omitted for brievity
});
}
or
class Build : NukeBuild, IGitHubFlowWithPullRequest
{
public static void Main() => Execute<Build>(x => x.Compile());
Target Compile => _ => _
.Executes(() => {
// Code omitted for brievity
});
}
depending on the workflow that better suits you.
working on a release
To start working on a release, simply call ./build.cmd release
and your pipeline will trigger the appropriate commands to get you started.
Calling ./build.cmd release
from the release branch created will trigger
the appropriate command to finish your release.
%%{init: {"flowchart": {"htmlLabels": false}} }%%
flowchart
A((start)) --> B["./build release"]
B --> C{is on 'release/*' branch ?}
C -- no --> create-branch
subgraph create-branch[Create a release branch]
G{{computes semver version}} --> H{{create release/version branch}}
end
create-branch --> D[Work on your release]
C -- yes --> finish-release
D --> E{Are you done ?}
E --yes --> B
E -- not yet --> D
subgraph finish-release[Finish release]
J[Update changelog] --> K{{validate changelog modifications}}
K --> M{{create tag}}
M --> N{{Merges changes to main branch}}
N --> O{{Merges changes to develop branch}}
end
finish-release --> Z((end))
Candoumbe.Pipelines.Components.NuGet
Contains classes required to push nuget packages to repositories.
Candoumbe.Pipelines.Components.GitHub
Contains classes and components needed to interact with GitHub repositories (creating pull requests).
Candoumbe.Pipelines.Components.Docker
Contains classes and components needed to build and push docker images.
⚠️ Some components may require additional packages and/or tools to be installed in order to be fully functional.
For example, the default implementation of the IMutationTest component uses Stryker
to run mutation tests.
You can refer to Nuke's documentation to see how to reference required tools.
Want to contribute ?
You can contribute by opening an issue or submitting a feature request.
PRs are welcome, check out the contribution guidelines if you want to contribute to this project !
Special thanks
- Matthias Koch for the marvelous Nuke library. This project would never exists without its work.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net6.0
- Candoumbe.Miscutilities (>= 0.11.1)
- Nuke.Common (>= 7.0.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.12.1 | 322 | 11/12/2024 |
0.11.0 | 487 | 9/14/2024 |
0.11.0-rc.1 | 56 | 9/14/2024 |
0.10.0 | 470 | 7/11/2024 |
0.10.0-remove-nuget-req0001 | 111 | 2/17/2024 |
0.9.0 | 1,178 | 1/25/2024 |
0.9.0-rc0009 | 109 | 1/25/2024 |
0.9.0-rc0001 | 107 | 1/23/2024 |
0.8.0 | 250 | 12/15/2023 |
0.7.0 | 938 | 9/23/2023 |
0.7.0-rc0004 | 158 | 9/18/2023 |
0.7.0-rc0003 | 195 | 9/15/2023 |
0.7.0-rc0001 | 153 | 9/14/2023 |
0.7.0-rc0000 | 132 | 9/13/2023 |
0.6.1 | 330 | 8/31/2023 |
0.6.1-beta0017 | 138 | 9/2/2023 |
0.6.1-beta0005 | 136 | 8/30/2023 |
0.6.0 | 448 | 8/15/2023 |
0.6.0-rc0003 | 147 | 8/15/2023 |
0.6.0-rc0002 | 151 | 8/15/2023 |
0.6.0-rc0001 | 158 | 8/14/2023 |
0.6.0-rc0000 | 172 | 8/13/2023 |
0.5.0 | 404 | 7/24/2023 |
0.5.0-rc0002 | 175 | 7/24/2023 |
0.5.0-rc0001 | 196 | 7/20/2023 |
0.5.0-rc0000 | 146 | 7/20/2023 |
0.5.0-pulish-nupkg-by-0060 | 173 | 7/14/2023 |
0.5.0-pulish-nupkg-by-0059 | 160 | 7/14/2023 |
0.5.0-pulish-nupkg-by-0058 | 165 | 7/14/2023 |
0.5.0-beta0000 | 170 | 7/20/2023 |
0.5.0-alpha0071 | 175 | 7/17/2023 |
0.4.5 | 206 | 7/17/2023 |
0.4.5-beta0001 | 155 | 7/17/2023 |
0.4.4 | 208 | 7/14/2023 |
0.4.3 | 220 | 7/10/2023 |
0.4.3-beta0006 | 146 | 7/8/2023 |
0.4.3-beta0004 | 152 | 7/7/2023 |
0.4.3-beta0003 | 152 | 7/6/2023 |
0.4.3-beta0001 | 156 | 7/6/2023 |
0.4.2 | 211 | 7/5/2023 |
0.4.1 | 188 | 7/5/2023 |
0.4.1-beta0014 | 156 | 7/5/2023 |
0.4.0 | 212 | 7/3/2023 |
0.4.0-beta0016 | 168 | 7/3/2023 |
0.4.0-beta0015 | 148 | 7/2/2023 |
0.4.0-beta0014 | 148 | 7/2/2023 |
0.4.0-beta0013 | 139 | 6/30/2023 |
0.4.0-beta0012 | 1,837 | 6/29/2023 |
0.4.0-beta0011 | 166 | 6/28/2023 |
0.4.0-beta0007 | 167 | 6/9/2023 |
0.4.0-beta0006 | 146 | 5/30/2023 |
0.4.0-beta0005 | 147 | 5/30/2023 |
0.4.0-beta0002 | 154 | 5/30/2023 |
0.4.0-beta0000 | 168 | 3/28/2023 |
0.3.0 | 1,367 | 2/5/2023 |
0.3.0-beta0001 | 249 | 1/30/2023 |
0.3.0-alpha0011 | 232 | 1/29/2023 |
0.2.0 | 317 | 1/22/2023 |
0.2.0-publish-using-a-0001 | 169 | 6/29/2023 |
0.2.0-coldfix-restore0001 | 168 | 6/29/2023 |
0.2.0-beta0001 | 147 | 6/29/2023 |
0.2.0-alpha0048 | 180 | 12/24/2022 |
0.2.0-alpha0046 | 160 | 12/24/2022 |
0.2.0-alpha0040 | 170 | 11/26/2022 |
0.2.0-alpha0039 | 176 | 11/20/2022 |
0.2.0-alpha0036 | 192 | 11/10/2022 |
0.2.0-alpha0035 | 167 | 11/9/2022 |
0.2.0-alpha0034 | 157 | 11/9/2022 |
0.2.0-alpha0032 | 143 | 11/5/2022 |
0.2.0-alpha0022 | 185 | 10/30/2022 |
0.2.0-alpha0020 | 147 | 10/30/2022 |
0.2.0-alpha0018 | 152 | 10/23/2022 |
0.2.0-alpha0016 | 144 | 10/23/2022 |
0.2.0-alpha0014 | 179 | 10/23/2022 |
0.1.0-alpha0003 | 177 | 10/23/2022 |
### 🚀 New features
• Added IDoHotfixWorkflow component which represents the hotfix workflow
• Added IDoFeatureWorkflow component which represents the feature workflow
• Added IDoColdfixWorkflow component which represents the coldfix workflow
• ICreateGithubRelease.Assets property can be used to specify which artifacts to associate with a Github release ([#103](https://github.com/candoumbe/Pipelines/issues/103))
• IMutationTest component can send --config-file option to Stryker CLI ([#90](https://github.com/candoumbe/Pipelines/issues/90))
### 🚨 Breaking changes
• Removed Github.IPullRequest.Token property. This property was previously used by GitHub.IGitFlowWithPullRequest and GitHub.IGitFlowWithPullRequest when finishing a feature/coldfix is.
• Refactored IWorkflow component and removed inheritance from IHaveMainBranch component
• Refactored ICompile component to no longer extend IRestore component
• Refactored IPack component to no longer extend ICompile component
• Refactored IMutationTest.MutationTestsProjects type from (Project SourceProject, IEnumerable<Project> TestsProjects) to [MutationTestProjectConfiguration](./src/Candoumbe.Pipelines/Components/IMutationTest.cs):
this new type allows to specify the path to the configuration file to use during each mutation test run.
• IMutationTest component no longer implements IUnitTest but only IHaveTests
### 🛠️ Fixes
• Removed nofetch option (when calling gitversion tool) in order to compute semver version number more accurately ([#96](https://github.com/candoumbe/Pipelines/issues/96)).
• IMutationTest.MutationTests output the value of the --project parameter **with*• the filename extension ([#109](https://github.com/candoumbe/Pipelines/issues/109))
• Marked IMutationTest.StrykerDashboardApiKey property as a secret ([#110](https://github.com/candoumbe/Pipelines/issues/110)).
### 🧹 Housekeeping
• Refactoring of IMutationTest component to improve maintenability : the way CLI options required by Stryker are computed is now centralized.
• Added GitHubToken value in parameters.local.json : this value will be consumed directly to interact with the github repository.
• IGitflow, IGithubflow components extends IDoHotfixWorkflow component
• IGitflow, IGithubflow components extends IDoHotfixWorkflow component
• Added NugetApi valuen in parameters.local.json to interact directly with NuGet from local environment
• Added documentation for IMutationTest classes
• Deprecated IHaveSecret component.
Full changelog at https://github.com/candoumbe/Pipelines/blob/release/0.7.0/CHANGELOG.md