Skip to content

Commit f3e9e1d

Browse files
authored
Merge pull request #2 from SAFE-Stack/release-automation
Release automation
2 parents 5420e13 + 82d8a44 commit f3e9e1d

File tree

7 files changed

+161
-0
lines changed

7 files changed

+161
-0
lines changed

.github/workflows/release.yaml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: SAFE META package release
2+
3+
on:
4+
release:
5+
types: [published]
6+
7+
jobs:
8+
release:
9+
runs-on: ubuntu-latest
10+
11+
steps:
12+
- name: Checkout
13+
uses: actions/checkout@v4
14+
15+
- name: Tool Restore
16+
run: dotnet tool restore
17+
18+
- name: Release
19+
working-directory: ./Build
20+
env:
21+
VERSION: ${{ github.ref_name }}
22+
RELEASE_NOTES_URL: ${{ github.event.release.html_url }}
23+
RELEASE_NOTES_BODY: ${{ github.event.release.body }}
24+
NUGET_API_KEY: ${{secrets.NUGET_API_KEY}}
25+
run: dotnet run --project Build.fsproj -- Publish

Build/Build.fs

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
open Fake.Core
2+
open Fake.Core.TargetOperators
3+
open Fake.IO
4+
5+
let execContext = Context.FakeExecutionContext.Create false "build.fsx" []
6+
Context.setExecutionContext (Context.RuntimeContext.Fake execContext)
7+
8+
module Processes =
9+
let createProcess exe args dir =
10+
// Use `fromRawCommand` rather than `fromRawCommandLine`, as its behaviour is less likely to be misunderstood.
11+
// See https://github.com/SAFE-Stack/SAFE-template/issues/551.
12+
CreateProcess.fromRawCommand exe args
13+
|> CreateProcess.withWorkingDirectory dir
14+
|> CreateProcess.ensureExitCode
15+
16+
17+
let run proc arg dir = proc arg dir |> Proc.run |> ignore
18+
19+
let dotnet = createProcess "dotnet"
20+
21+
let runDotnet = run dotnet
22+
23+
let sourceFolder = Path.getFullName """..\src"""
24+
let outputFolder = Path.getFullName """..\nugetPackages"""
25+
26+
let projects = [ "SAFE.Client"; "SAFE.Server" ]
27+
28+
Target.create "Bundle" (fun _ ->
29+
let version = Environment.environVarOrFail "VERSION"
30+
let releaseNotes = Environment.environVarOrFail "RELEASE_NOTE_URL"
31+
32+
projects
33+
|> List.map (fun project ->
34+
Processes.runDotnet
35+
[
36+
"pack"
37+
"-o"
38+
outputFolder
39+
$"-p:PackageVersion={version}"
40+
$"-p:PackageReleaseNotes={releaseNotes}"
41+
]
42+
$"""{sourceFolder}/{project}""")
43+
|> ignore)
44+
45+
46+
Target.create "Publish" (fun _ ->
47+
let nugetApiKey = Environment.environVarOrFail "NUGET_API_KEY"
48+
49+
let nugetArgs = [
50+
"push"
51+
"*.nupkg"
52+
"--api-key"
53+
nugetApiKey
54+
"--source"
55+
"""https://api.nuget.org/v3/index.json"""
56+
]
57+
58+
Processes.runDotnet [ "nuget"; yield! nugetArgs ] outputFolder)
59+
60+
"Bundle" ==> "Publish" |> ignore
61+
62+
[<EntryPoint>]
63+
let main args =
64+
try
65+
match args with
66+
| [| target |] -> Target.runOrDefault target
67+
| _ -> Target.runOrDefault "Bundle"
68+
69+
0
70+
with e ->
71+
printfn "%A" e
72+
1

Build/Build.fsproj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project Sdk="Microsoft.NET.Sdk">
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<TargetFramework>net8.0</TargetFramework>
6+
</PropertyGroup>
7+
<ItemGroup>
8+
<Compile Include="Build.fs" />
9+
</ItemGroup>
10+
<Import Project="..\.paket\Paket.Restore.targets" />
11+
</Project>

Build/paket.references

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Fake.Core.Target

SAFE.Meta.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SAFE.Client", "src\SAFE.Cli
99
EndProject
1010
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SAFE.Server", "src\SAFE.Server\SAFE.Server.fsproj", "{0C8F62AC-D5D8-43E6-A4C7-159E530C3CE5}"
1111
EndProject
12+
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Build", "Build\Build.fsproj", "{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}"
13+
EndProject
1214
Global
1315
GlobalSection(SolutionConfigurationPlatforms) = preSolution
1416
Debug|Any CPU = Debug|Any CPU
@@ -26,6 +28,10 @@ Global
2628
{0C8F62AC-D5D8-43E6-A4C7-159E530C3CE5}.Debug|Any CPU.Build.0 = Debug|Any CPU
2729
{0C8F62AC-D5D8-43E6-A4C7-159E530C3CE5}.Release|Any CPU.ActiveCfg = Release|Any CPU
2830
{0C8F62AC-D5D8-43E6-A4C7-159E530C3CE5}.Release|Any CPU.Build.0 = Release|Any CPU
31+
{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
32+
{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}.Debug|Any CPU.Build.0 = Debug|Any CPU
33+
{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}.Release|Any CPU.ActiveCfg = Release|Any CPU
34+
{F49104E3-DBA9-4A2D-B839-B4E60BCAE698}.Release|Any CPU.Build.0 = Release|Any CPU
2935
EndGlobalSection
3036
GlobalSection(NestedProjects) = preSolution
3137
{5BCFE180-027E-40F9-847B-7B36F10BD5D7} = {59161B7D-F517-4F4B-B28D-33E34B8A930E}

paket.dependencies

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ source https://api.nuget.org/v3/index.json
22
framework: net8.0
33
storage: none
44

5+
nuget Fake.Core.Target
56
nuget FSharp.Core ~> 8
67

78
nuget Fable.Remoting.Giraffe ~> 5

paket.lock

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,56 @@ NUGET
7878
Fable.Core (>= 3.1.5)
7979
Fable.Parsimmon (>= 4.0)
8080
FSharp.Core (>= 4.7)
81+
Fake.Core.CommandLineParsing (6.0)
82+
FParsec (>= 1.1.1)
83+
FSharp.Core (>= 6.0.3)
84+
Fake.Core.Context (6.0)
85+
FSharp.Core (>= 6.0.3)
86+
Fake.Core.Environment (6.0)
87+
FSharp.Core (>= 6.0.3)
88+
Fake.Core.FakeVar (6.0)
89+
Fake.Core.Context (>= 6.0)
90+
FSharp.Core (>= 6.0.3)
91+
Fake.Core.Process (6.0)
92+
Fake.Core.Environment (>= 6.0)
93+
Fake.Core.FakeVar (>= 6.0)
94+
Fake.Core.String (>= 6.0)
95+
Fake.Core.Trace (>= 6.0)
96+
Fake.IO.FileSystem (>= 6.0)
97+
FSharp.Core (>= 6.0.3)
98+
System.Collections.Immutable (>= 6.0)
99+
Fake.Core.String (6.0)
100+
FSharp.Core (>= 6.0.3)
101+
Fake.Core.Target (6.0)
102+
Fake.Core.CommandLineParsing (>= 6.0)
103+
Fake.Core.Context (>= 6.0)
104+
Fake.Core.Environment (>= 6.0)
105+
Fake.Core.FakeVar (>= 6.0)
106+
Fake.Core.Process (>= 6.0)
107+
Fake.Core.String (>= 6.0)
108+
Fake.Core.Trace (>= 6.0)
109+
FSharp.Control.Reactive (>= 5.0.2)
110+
FSharp.Core (>= 6.0.3)
111+
Fake.Core.Trace (6.0)
112+
Fake.Core.Environment (>= 6.0)
113+
Fake.Core.FakeVar (>= 6.0)
114+
FSharp.Core (>= 6.0.3)
115+
Fake.IO.FileSystem (6.0)
116+
Fake.Core.String (>= 6.0)
117+
Fake.Core.Trace (>= 6.0)
118+
FSharp.Core (>= 6.0.3)
81119
Feliz (2.7)
82120
Fable.ReactDom.Types (>= 18.2)
83121
Feliz.CompilerPlugins (>= 2.2)
84122
FSharp.Core (>= 4.7.2)
85123
Feliz.CompilerPlugins (2.2)
86124
Fable.AST (>= 4.2.1)
87125
FSharp.Core (>= 4.7.2)
126+
FParsec (1.1.1)
127+
FSharp.Core (>= 4.3.4)
128+
FSharp.Control.Reactive (5.0.5)
129+
FSharp.Core (>= 4.7.2)
130+
System.Reactive (>= 5.0 < 6.0)
88131
FSharp.Control.Websockets (0.2.3)
89132
FSharp.Core (>= 6.0)
90133
Microsoft.IO.RecyclableMemoryStream (>= 2.2.1)
@@ -118,9 +161,11 @@ NUGET
118161
FSharp.Control.Websockets (>= 0.2.2)
119162
Giraffe (>= 6.0)
120163
Microsoft.AspNetCore.Authentication.JwtBearer (>= 6.0.3)
164+
System.Collections.Immutable (8.0)
121165
System.IdentityModel.Tokens.Jwt (7.3.1)
122166
Microsoft.IdentityModel.JsonWebTokens (>= 7.3.1)
123167
Microsoft.IdentityModel.Tokens (>= 7.3.1)
168+
System.Reactive (5.0)
124169
System.Text.Encodings.Web (8.0)
125170
System.Text.Json (8.0.1)
126171
System.Text.Encodings.Web (>= 8.0)

0 commit comments

Comments
 (0)