@@ -11,15 +11,18 @@ open Fake.DotNet
1111open Fake.Core
1212open Fake.Tools .Git .CommandHelper
1313open Fake.Tools .Git
14+ open Fake.Api
1415open Fake.DotNet .Testing .XUnit2
1516open Fake.Testing .Common
1617open System.Linq
1718
1819let project = " BaGet"
20+ let gitOwner = " ai-traders"
1921// Pattern specifying assemblies to be tested using XUnit
2022let testAssemblies = !! " tests/*.Tests/bin/Release/*/publish/*.Tests.dll"
2123
2224// Read additional information from the release notes document
25+ let changelogFile = " CHANGELOG.md"
2326let release = File.read " CHANGELOG.md" |> ReleaseNotes.parse
2427let changelogVersion = release.AssemblyVersion
2528
@@ -172,10 +175,77 @@ Target.create "RunTests" (fun _ ->
172175 })
173176)
174177
178+ // --------------------------------------------------------------------------------------
179+ // Releases
180+
181+ let changelogUnreleased =
182+ let changeLogString = File.readAsString changelogFile
183+ changeLogString.Contains( " Unreleased" )
184+
185+ let gitDir = ( findGitDir System.Environment.CurrentDirectory) .FullName
186+ let currentSha = gitDir |> Information.getCurrentSHA1
187+ let tagVersion =
188+ if changelogUnreleased then
189+ sprintf " %s -%s " release.AssemblyVersion ( currentSha.Substring( 0 , 8 ))
190+ else
191+ release.AssemblyVersion
192+
193+ let isCurrentCommitTagged =
194+ let ok , msg , error = runGitCommand gitDir <| sprintf " describe --contains %s " currentSha
195+ if ok then
196+ Trace.tracefn " Current SHA %s is tagged" currentSha
197+ else
198+ Trace.tracefn " Current SHA %s is not tagged" currentSha
199+ ok
200+
201+ let zipFile = sprintf @" pkg/baget-%s.zip" tagVersion
202+
203+ Target.create " Zip" ( fun _ ->
204+ Directory.create " pkg"
205+ !! " src/BaGet/bin/Release/netcoreapp2.1/publish/**/*"
206+ |> Zip.zip " src/BaGet/bin/Release/netcoreapp2.1/publish" zipFile
207+ )
208+
209+ Target.create " GitTag" ( fun _ ->
210+ if isCurrentCommitTagged then
211+ failwithf " Already tagged"
212+ if changelogUnreleased then
213+ Trace.tracefn " Changelog is set as Unreleased - this is a preview release"
214+
215+ Trace.tracefn " Executing git tag version=%s " tagVersion
216+ Branches.tag gitDir tagVersion
217+ Branches.pushTag gitDir " origin" tagVersion
218+ Trace.tracefn " Released code version=%s " tagVersion
219+ )
220+
221+ Target.create " GitHubRelease" ( fun _ ->
222+ let token =
223+ match Environment.environVarOrDefault " GITHUB_TOKEN" " " with
224+ | s when not ( System.String.IsNullOrWhiteSpace s) -> s
225+ | _ -> failwith " please set the GITHUB_TOKEN environment variable to a github personal access token with repro access."
226+
227+ let notes =
228+ if changelogUnreleased then
229+ [
230+ " *This is a preview release, which has passed all end-to-end tests, but may not contain all final features.*\n "
231+ sprintf " Try docker image `tomzo/baget:%s `\n " tagVersion
232+ ]
233+ else
234+ ( sprintf " Docker image `tomzo/baget:%s `\n " tagVersion):: release.Notes
235+
236+ GitHub.createClientWithToken token
237+ |> GitHub.draftNewRelease gitOwner project tagVersion changelogUnreleased notes
238+ |> GitHub.uploadFiles [ zipFile]
239+ |> GitHub.publishDraft
240+ |> Async.RunSynchronously)
241+
175242open Fake.Core .TargetOperators
176243
177244Target.create " All" ignore
178245
246+ " GitTag" ==> " GitHubRelease"
247+ " Zip" ==> " GitHubRelease"
248+
179249" SpaRestore"
180250 ==> " SpaBuild"
181251 ==> " SpaPublish"
0 commit comments