Adding build information with GitHub Actions
How can you add build information, such as build time, branch, commit ID, etc., into your application?
The problem
When you publish an application, it is beneficial to show exactly which source code was used for that build and when it was compiled.
The solution
There are various ways to solve this. Since I make my release build my applications in a CI/CD pipeline, I use this method. Although this solution is for GitHub Actions, it should be easy to port to other pipelines.
First, I have this class (a bit simplified):
public static partial class BuildInformation
{
static BuildInformation()
{
Initialize();
}
static partial void Initialize();
public static string? Branch { get; private set; }
public static string? BuildTimeString { get; private set; }
public static string? CommitId { get; private set; }
public static string? DotNetVersionString { get; private set; }
This is a static class you can use to get your build information. This is a partial class. The other part of the class is in a separate file that will have the actual values:
public static partial class BuildInformation
{
static partial void Initialize()
{
Branch = "mybranch";
BuildTimeString = "2038-01-18T03:14:40Z";
CommitId = "0123456789abcdef01234567890abcdef0123456";
DotNetVersionString = "Fake 8.0.205";
}
}
The above is used in debug mode. The trick is to replace this file in your CI/CD pipeline. Here is how it’s done in GitHub Actions:
env:
BUILD_INFO_FILE: ./Source/BuildInfoSample/BuildInformation-Build.cs
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Get build information
shell: pwsh
run: |
echo "CURRENT_TIME_UTC_STRING=$((Get-Date).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ"))" >> $env:GITHUB_ENV
echo "NET_VERSION_STRING=$(dotnet --version)" >> $env:GITHUB_ENV
- name: Create build time file
shell: pwsh
run: |
echo "namespace BuildInfoSample;" > $env:BUILD_INFO_FILE
echo "public static partial class BuildInformation" >> $env:BUILD_INFO_FILE
echo "{" >> $env:BUILD_INFO_FILE
echo " static partial void Initialize()" >> $env:BUILD_INFO_FILE
echo " {" >> $env:BUILD_INFO_FILE
echo " Branch = ""$"";" >> $env:BUILD_INFO_FILE
echo " BuildTimeString = ""$"";" >> $env:BUILD_INFO_FILE
echo " CommitId = ""$"";" >> $env:BUILD_INFO_FILE
echo " DotNetVersionString = ""$"";" >> $env:BUILD_INFO_FILE
echo " }" >> $env:BUILD_INFO_FILE
echo "}" >> $env:BUILD_INFO_FILE
Again, this is a bit simplified. In my full sample, that you find here, also has information about MAUI workloads.
Summary
I have used this method for several years. It is a simple solution that accomplishes its purpose.