Hi everyone, in today's post we will talk about how to create Nuget packages (C#) and publish to GitHub packages using GitHub Actions.
Base Knowledge
For a complete understanding of the subject, it's advisable to understand the concepts of Nuget and GitHub Packages and to help you with this, I have left two useful links below.
Introduction to GitHub Packages
Implementing .NET / Nuget Package
The first step is to create a new project in .NET, you can use your favorite IDE to do this. This project should be a simple class library as it is just a package that contains reusable implementations.
Note: I'm using JetBrains Rider
In my project I implemented some basic methods just for example, you can see the implementation details here Common Packages
After implementing what you need in your .NET project, create a new repository on GitHub and push your code. The next steps will be necessary to already have the repository created.
Generating GitHub Token
The next step is to generate the token that will represent the secret to authenticate to GitHub Packages and allow publication. In the right menu, go to Settings
In the left menu, go to Developer settings
Let's use a classic token
Click the Generate new token dropdown and select Generate new token (classic)
Set a name for your token, the expiration date and select the write:packages scope
At the bottom, click on the green Generate Token button to actually create the token and obtain the secret.
Go back to the repository you created for the .NET application (Nuget Package). Now let's use the GitHub Secret to store the token to be used by the pipeline. To do this, in the repository. select Settings
In the left menu, select Secret and variables and click Actions.
Select New repository secret, define a name for the secret and in values paste the token we generated earlier. Finally, click Add secret.
Now we have the token that will be used for authentication and publication authorization as a GitHub Secret where it will be used by the pipeline.
Pipeline / Workflow
Once we have our application implemented and the publishing token configured, it's time to prepare our CI/CD pipeline to generate the package and publish it to GitHub packages.
The pipeline itself is simple and easy to understand, as you can see below
Let's understand part by part
Name: Represents the name of the workflow
on: It's the trigger of workflows
push: It's the type of trigger, for example, the pipeline will be executed on every push
tags: As we defined the trigger of our pipeline as a push event, we also need to inform the push type, in our example it will be a tag push with a pre-defined format.
Basically, the pipeline / workflow will be triggered with each push of tags that follow the pattern (..*)
In the second part, we have the definition of jobs where we need to define at least one job, the OS to be used by the Runner and the necessary steps.
Checkout Repository -> It's basically a git clone of the repository inside the VM (Runner) that will execute the steps.
Set up .NET Core -> Step to download and install dependencies to run .NET commands
Build -> It's a build of the application to ensure everything is working
In the last part we have
Package -> It's the command to create a nuget package in .NET where the package name will be the same as the project name and the version will be the git tag.
Publish -> Finally, this is the step that takes the nuget package generated in the previous step and publishes it to GitHub Packages
To publish to your GitHub package, simply point to your GitHub Packages, that is, just replace the username in the url as shown below.
nuget.pkg.github.com/your-username/index.json
Note that I'm using a secret in the publish command, called "NUGET_AUTH_TOKEN" which is basically the secret we created previously with the token that allows publishing.
Executing the pipeline
To run the pipeline, you need to create a git tag and submit it, the commands are shown below.
git tag 1.5.0
git push origin 1.5.0
I've set a version of 1.5.0, but feel free to use whatever version you like. After push, the pipeline will run automatically
To view packages, you can go to your profile again and select Packages
Now, you can import the package into your .NET project by pointing to the GitHub package URL. Remembering that the package is published as private, to make it public just click on the package and make it visible to everyone.
That's all folks, stay tuned for the next posts.
Top comments (4)
It is useful for anyone who wants to publish NuGet packages either publicly or privately. You have explained the process in a simple and easy-to-understand manner. I appreciate the your effort in sharing this knowledge with the community.
What inspired you to write this post? Was there a specific problem you were trying to solve? I would love to hear more about your experience with publishing NuGet packages to GitHub. 😊
Hi, thank you very much for the feedback.
My inspiration is always to share knowledge with the community, but for this post I was inspired by a problem encountered during my work routine. Some core teams were trying to publish not only nuget packages, but npm as well, but they were facing a certain difficulty, even because they had no experience with this, so the idea came up to create this post so as not only to help these teams at work, but also the community itself.
Thank @reniciuspagotto for so detailed tutorial!
Thank you so much