Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add basic support for GitHub Actions #2512

Merged
merged 2 commits into from
May 7, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 15 additions & 5 deletions Fake.sln
Original file line number Diff line number Diff line change
Expand Up @@ -185,12 +185,10 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Tools.SignTool", "src\
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestTools", "TestTools", "{9200793A-8B59-4242-A5C8-F37CE08DE801}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{092B9791-915B-43BC-A2FD-1EA62BF5DF15}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "app", "app", "{0141CA13-3E9C-4DB7-9BAE-0920F5B7A12D}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Fake.Core.DependencyManager.Paket", "src\app\Fake.Core.DependencyManager.Paket\Fake.Core.DependencyManager.Paket.fsproj", "{F4D3249D-F4EC-4B86-BEA8-3F2314ED9B65}"
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Fake.BuildServer.GitHubActions", "src\app\Fake.BuildServer.GitHubActions\Fake.BuildServer.GitHubActions.fsproj", "{AB09E8EB-A66E-4D60-B47C-4F35F439D020}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Expand Down Expand Up @@ -1172,6 +1170,18 @@ Global
{F4D3249D-F4EC-4B86-BEA8-3F2314ED9B65}.Release|x64.Build.0 = Release|Any CPU
{F4D3249D-F4EC-4B86-BEA8-3F2314ED9B65}.Release|x86.ActiveCfg = Release|Any CPU
{F4D3249D-F4EC-4B86-BEA8-3F2314ED9B65}.Release|x86.Build.0 = Release|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Debug|Any CPU.Build.0 = Debug|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Debug|x64.ActiveCfg = Debug|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Debug|x64.Build.0 = Debug|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Debug|x86.ActiveCfg = Debug|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Debug|x86.Build.0 = Debug|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Release|Any CPU.Build.0 = Release|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Release|x64.ActiveCfg = Release|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Release|x64.Build.0 = Release|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Release|x86.ActiveCfg = Release|Any CPU
{AB09E8EB-A66E-4D60-B47C-4F35F439D020}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -1258,8 +1268,8 @@ Global
{43B8BB3C-9BE7-466D-BF15-18842AF1A4B8} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{3AC9D697-54FA-44CC-B69D-25BA5B656181} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{9200793A-8B59-4242-A5C8-F37CE08DE801} = {CCAC5CAB-03C8-4C11-ADBE-A0D05F6A4F18}
{0141CA13-3E9C-4DB7-9BAE-0920F5B7A12D} = {092B9791-915B-43BC-A2FD-1EA62BF5DF15}
{F4D3249D-F4EC-4B86-BEA8-3F2314ED9B65} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
{AB09E8EB-A66E-4D60-B47C-4F35F439D020} = {7BFFAE76-DEE9-417A-A79B-6A6644C4553A}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {058A0C5E-2216-4306-8AFB-0AE28320C26A}
Expand Down
1 change: 1 addition & 0 deletions help/templates/template.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@
<a href="/apidocs/v5/fake-buildserver-teamfoundation.html" class="navbar-item">Azure
DevOps</a>
<a href="/apidocs/v5/fake-buildserver-gitlab.html" class="navbar-item">GitLab</a>
<a href="/apidocs/v5/fake-buildserver-githubactions.html" class="navbar-item">GitHub Actions</a>
<a href="/apidocs/v5/fake-buildserver-teamcity.html" class="navbar-item">TeamCity</a>
<a href="/apidocs/v5/fake-buildserver-travis.html" class="navbar-item">Travis</a>
</div>
Expand Down
29 changes: 29 additions & 0 deletions src/app/Fake.BuildServer.GitHubActions/AssemblyInfo.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// Auto-Generated by FAKE; do not edit
namespace System

open System.Reflection

[<assembly:AssemblyTitleAttribute("FAKE - F# Make Integration into GitHub Actions buildserver")>][<assembly:AssemblyProductAttribute("FAKE - F# Make")>][<assembly:AssemblyVersionAttribute("5.19.1")>][<assembly:AssemblyInformationalVersionAttribute("5.19.1")>][<assembly:AssemblyFileVersionAttribute("5.19.1")>][<assembly:AssemblyMetadataAttribute("BuildDate",
"2020-05-04")>]

do ()

module internal AssemblyVersionInformation =
[<Literal>]
let AssemblyTitle =
"FAKE - F# Make Integration into GitHub Actions buildserver"

[<Literal>]
let AssemblyProduct = "FAKE - F# Make"

[<Literal>]
let AssemblyVersion = "5.19.1"

[<Literal>]
let AssemblyInformationalVersion = "5.19.1"

[<Literal>]
let AssemblyFileVersion = "5.19.1"

[<Literal>]
let AssemblyMetadata_BuildDate = "2020-05-04"
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net462</TargetFrameworks>
<AssemblyName>Fake.BuildServer.GitHubActions</AssemblyName>
<OutputType>Library</OutputType>
</PropertyGroup>
<PropertyGroup>
<DefineConstants>$(DefineConstants);NETSTANDARD;USE_HTTPCLIENT</DefineConstants>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<DefineConstants>$(DefineConstants);RELEASE</DefineConstants>
</PropertyGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.fs" />
<Compile Include="GitHubActions.fs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Fake.Core.Environment\Fake.Core.Environment.fsproj" />
<ProjectReference Include="..\Fake.Core.Trace\Fake.Core.Trace.fsproj" />
<ProjectReference Include="..\Fake.IO.FileSystem\Fake.IO.FileSystem.fsproj" />
</ItemGroup>
<Import Project="..\..\..\.paket\Paket.Restore.targets" />
</Project>
105 changes: 105 additions & 0 deletions src/app/Fake.BuildServer.GitHubActions/GitHubActions.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
/// Contains support for various build servers
namespace Fake.BuildServer

open Fake.Core
open Fake.IO

/// native support for GitHub Actions specific APIs.
/// The general documentation on how to use CI server integration can be found [here](/buildserver.html).
/// This module does not provide any special APIs please use FAKE APIs and they should integrate into this CI server.
/// If some integration is not working as expected or you have features you would like to use directly please open an issue.
[<RequireQualifiedAccess>]
module GitHubActions =

/// Exported environment variables during build.
/// See the [official documentation](https://help.github.com/en/actions/configuring-and-managing-workflows/using-environment-variables#default-environment-variables) for details.
type Environment =

/// Always set to true, if present.
static member CI = Environment.environVarAsBoolOrDefault "CI"
/// The path to the GitHub home directory used to store user data.
/// For example, /github/home.
static member Home = Environment.environVar "HOME"
/// The name of the workflow.
static member Workflow = Environment.environVar "GITHUB_WORKFLOW"
/// A unique number for each run within a repository.
/// This number does not change if you re-run the workflow run.
static member RunId = Environment.environVar "GITHUB_RUN_ID"
/// A unique number for each run of a particular workflow in a repository.
/// This number begins at 1 for the workflow's first run, and increments with each new run.
/// This number does not change if you re-run the workflow run.
static member RunNumber = Environment.environVar "GITHUB_RUN_NUMBER"
/// The unique identifier (id) of the action.
static member Action = Environment.environVar "GITHUB_ACTION"
/// Always set to true when GitHub Actions is running the workflow.
/// You can use this variable to differentiate when tests are being run locally or by GitHub Actions.
static member Actions = Environment.environVarAsBoolOrDefault "GITHUB_ACTIONS"
/// The name of the person or app that initiated the workflow. For example, octocat.
static member Actor = Environment.environVar "GITHUB_ACTOR"
/// The owner and repository name. For example, octocat/Hello-World.
static member Repository = Environment.environVar "GITHUB_REPOSITORY"
/// The name of the webhook event that triggered the workflow.
static member EventName = Environment.environVar "GITHUB_EVENT_NAME"
/// The path of the file with the complete webhook event payload.
/// For example, /github/workflow/event.json.
static member EventPath = Environment.environVar "GITHUB_EVENT_PATH"
/// The GitHub workspace directory path.
/// The workspace directory contains a subdirectory with a copy of your repository if your workflow uses the actions/checkout action.
/// If you don't use the actions/checkout action, the directory will be empty.
/// For example, /home/runner/work/my-repo-name/my-repo-name.
static member Workspace = Environment.environVar "GITHUB_WORKSPACE"
/// The commit SHA that triggered the workflow.
/// For example, ffac537e6cbbf934b08745a378932722df287a53.
static member Sha = Environment.environVar "GITHUB_SHA"
/// The branch or tag ref that triggered the workflow.
/// For example, refs/heads/feature-branch-1.
/// If neither a branch or tag is available for the event type, the variable will not exist.
static member Ref = Environment.environVar "GITHUB_REF"
/// Only set for forked repositories. The branch of the head repository.
static member HeadRef = Environment.environVar "GITHUB_HEAD_REF"
/// Only set for forked repositories. The branch of the base repository.
static member BaseRef = Environment.environVar "GITHUB_BASE_REF"

/// Implements a TraceListener for GitHub Actions.
type internal GitHubActionsTraceListener() =
interface ITraceListener with
/// Writes the given message to the Console.
member __.Write msg =
let color = ConsoleWriter.colorMap msg
let write = ConsoleWriter.writeAnsiColor

match msg with
| TraceData.ImportantMessage text
| TraceData.ErrorMessage text -> write true color true text
| TraceData.LogMessage (text, newLine)
| TraceData.TraceMessage (text, newLine) -> write false color newLine text
| TraceData.OpenTag (tag, descr) ->
match descr with
| Some d -> write false color true (sprintf "Starting %s '%s': %s" tag.Type tag.Name d)
| _ -> write false color true (sprintf "Starting %s '%s'" tag.Type tag.Name)
| TraceData.CloseTag (tag, time, state) ->
write false color true (sprintf "Finished (%A) '%s' in %O" state tag.Name time)
| TraceData.ImportData (typ, path) -> write false color true (sprintf "Import data '%O': %s" typ path)
| TraceData.TestOutput (test, out, err) ->
write false color true (sprintf "Test '%s' output:\n\tOutput: %s\n\tError: %s" test out err)
| TraceData.BuildNumber number -> write false color true (sprintf "Build Number: %s" number)
| TraceData.TestStatus (test, status) ->
write false color true (sprintf "Test '%s' status: %A" test status)
| TraceData.BuildState (state, _) -> write false color true (sprintf "Build State: %A" state)

let defaultTraceListener =
GitHubActionsTraceListener() :> ITraceListener

let detect () = BuildServer.buildServer = GitHubActions

let install (force: bool) =
if not (detect ())
then failwithf "Cannot run 'install()' on a non-GitHub Actions environment"
if force || not (CoreTracing.areListenersSet ())
then CoreTracing.setTraceListeners [ defaultTraceListener ]
()

let Installer =
{ new BuildServerInstaller() with
member __.Install() = install (false)
member __.Detect() = detect () }
4 changes: 4 additions & 0 deletions src/app/Fake.BuildServer.GitHubActions/paket.references
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
group netcore

FSharp.Core
NETStandard.Library
16 changes: 16 additions & 0 deletions src/app/Fake.Core.Environment/BuildServer.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ type BuildServer =
| Travis
| AppVeyor
| GitLabCI
| GitHubActions
| Bamboo
| BitbucketPipelines
| LocalBuild
Expand Down Expand Up @@ -84,6 +85,18 @@ module BuildServer =
else s
else ""

// Checks if we are on GitHub Actions
/// [omit]
let isGitHubActionsBuild =
Environment.environVarAsBoolOrDefault "GITHUB_ACTIONS" false

/// Build number retrieved from GitHub Actions
/// [omit]
let gitHubActionsBuildNumber =
if isGitHubActionsBuild
then Environment.environVar "GITHUB_RUN_NUMBER"
else ""

/// Build number retrieved from Jenkins
/// [omit]
let jenkinsBuildNumber = tcBuildNumber
Expand All @@ -104,6 +117,7 @@ module BuildServer =
elif not (String.IsNullOrEmpty travisBuildNumber) then Travis
elif not (String.IsNullOrEmpty appVeyorBuildVersion) then AppVeyor
elif isGitlabCI then GitLabCI
elif isGitHubActionsBuild then GitHubActions
elif isTFBuild then TeamFoundation
elif isBambooBuild then Bamboo
elif Environment.hasEnvironVar "BITBUCKET_COMMIT" then BitbucketPipelines
Expand All @@ -119,6 +133,7 @@ module BuildServer =
| Travis -> getVersion travisBuildNumber
| AppVeyor -> getVersion appVeyorBuildVersion
| GitLabCI -> getVersion gitlabCIBuildNumber
| GitHubActions -> getVersion gitHubActionsBuildNumber
| TeamFoundation -> getVersion tfBuildNumber
| Bamboo -> getVersion bambooBuildNumber
| LocalBuild -> getVersion localBuildLabel
Expand All @@ -135,6 +150,7 @@ module BuildServer =
| Travis -> true
| AppVeyor -> true
| GitLabCI -> true
| GitHubActions -> true
| TeamFoundation -> false
| Bamboo -> false
| BitbucketPipelines -> false
Expand Down