using CliWrap.Buffered; using Microsoft.Extensions.Configuration; using NuGet.Versioning; using Octokit; using ParallelPipelines.Application.Attributes; using ParallelPipelines.Domain.Entities; using ParallelPipelines.Host.Helpers; namespace Deploy.Steps; [DependsOnStep] public class CreateGithubRelease(IPipelineContext pipelineContext) : IStep { public async Task RunStep(CancellationToken cancellationToken) { var github = new GitHubClient(new ProductHeaderValue("SharpIDE-CI")); var token = pipelineContext.Configuration.GetValue("GITHUB_TOKEN"); var credentials = new Credentials(token); github.Credentials = credentials; var versionFile = await PipelineFileHelper.GitRootDirectory.GetFile("./src/SharpIDE.Godot/version.txt"); if (versionFile.Exists is false) throw new FileNotFoundException(versionFile.FullName); var versionText = await File.ReadAllTextAsync(versionFile.FullName, cancellationToken); var version = NuGetVersion.Parse(versionText); var versionString = version.ToNormalizedString(); var releaseTag = $"v{versionString}"; var newRelease = new NewRelease(releaseTag) { Name = releaseTag, Body = "", Draft = true, Prerelease = false, GenerateReleaseNotes = true }; var owner = "MattParkerDev"; var repo = "SharpIDE"; var release = await github.Repository.Release.Create(owner, repo, newRelease); var windowsReleaseZip = await PipelineFileHelper.GitRootDirectory.GetFile("./artifacts/publish-godot/sharpide-win-x64.zip"); await using var stream = windowsReleaseZip.OpenRead(); var upload = new ReleaseAssetUpload { FileName = $"sharpide-win-x64-{versionString}.zip", ContentType = "application/octet-stream", RawData = stream }; var asset = await github.Repository.Release.UploadAsset(release, upload, cancellationToken); return null; } }