2016-02-15 10:07:39 -08:00
using System ;
2016-02-12 10:11:30 -08:00
using System.IO ;
2016-03-16 14:39:02 -07:00
using System.Net.Http ;
using System.Text ;
2016-02-15 10:07:39 -08:00
using Microsoft.DotNet.Cli.Build.Framework ;
2016-03-07 12:20:50 -08:00
using Microsoft.WindowsAzure.Storage ;
using Microsoft.WindowsAzure.Storage.Blob ;
2016-02-12 10:11:30 -08:00
using static Microsoft . DotNet . Cli . Build . Framework . BuildHelpers ;
namespace Microsoft.DotNet.Cli.Build
{
public static class PublishTargets
{
2016-03-07 12:20:50 -08:00
private static CloudBlobContainer BlobContainer { get ; set ; }
2016-03-07 14:52:41 -08:00
private static string Channel { get ; set ; }
2016-03-07 12:20:50 -08:00
private static string Version { get ; set ; }
2016-03-17 22:22:22 -07:00
private static string NuGetVersion { get ; set ; }
2016-03-07 12:20:50 -08:00
[Target]
public static BuildTargetResult InitPublish ( BuildTargetContext c )
{
CloudStorageAccount storageAccount = CloudStorageAccount . Parse ( Environment . GetEnvironmentVariable ( "CONNECTION_STRING" ) . Trim ( '"' ) ) ;
CloudBlobClient blobClient = storageAccount . CreateCloudBlobClient ( ) ;
BlobContainer = blobClient . GetContainerReference ( "dotnet" ) ;
Version = c . BuildContext . Get < BuildVersion > ( "BuildVersion" ) . SimpleVersion ;
2016-03-17 22:22:22 -07:00
NuGetVersion = c . BuildContext . Get < BuildVersion > ( "BuildVersion" ) . NuGetVersion ;
2016-03-07 14:52:41 -08:00
Channel = c . BuildContext . Get < string > ( "Channel" ) ;
2016-03-07 12:20:50 -08:00
return c . Success ( ) ;
}
[ Target ( nameof ( PrepareTargets . Init ) ,
nameof ( PublishTargets . InitPublish ) ,
2016-03-16 14:39:02 -07:00
nameof ( PublishTargets . PublishArtifacts ) ,
nameof ( PublishTargets . TriggerDockerHubBuilds ) ) ]
2016-03-07 14:52:41 -08:00
[Environment("PUBLISH_TO_AZURE_BLOB", "1", "true")] // This is set by CI systems
2016-02-12 10:11:30 -08:00
public static BuildTargetResult Publish ( BuildTargetContext c )
{
2016-03-07 12:20:50 -08:00
return c . Success ( ) ;
}
2016-02-16 11:39:17 -08:00
2016-03-18 02:23:24 -07:00
[ Target (
nameof ( PublishTargets . PublishVersionBadge ) ,
nameof ( PublishTargets . PublishSdkInstallerFile ) ,
//nameof(PublishTargets.PublishDebFileToDebianRepo),
nameof ( PublishTargets . PublishCombinedFrameworkSDKHostFile ) ,
nameof ( PublishTargets . PublishCombinedFrameworkHostFile ) ,
nameof ( PublishTargets . PublishLatestVersionTextFile ) ) ]
2016-03-07 12:20:50 -08:00
public static BuildTargetResult PublishArtifacts ( BuildTargetContext c )
{
return c . Success ( ) ;
}
2016-02-12 10:11:30 -08:00
2016-03-07 12:20:50 -08:00
[Target]
public static BuildTargetResult PublishVersionBadge ( BuildTargetContext c )
{
var versionBadge = c . BuildContext . Get < string > ( "VersionBadge" ) ;
var latestVersionBadgeBlob = $"{Channel}/Binaries/Latest/{Path.GetFileName(versionBadge)}" ;
var versionBadgeBlob = $"{Channel}/Binaries/{Version}/{Path.GetFileName(versionBadge)}" ;
2016-02-12 10:11:30 -08:00
2016-03-07 12:20:50 -08:00
PublishFileAzure ( versionBadgeBlob , versionBadge ) ;
PublishFileAzure ( latestVersionBadgeBlob , versionBadge ) ;
return c . Success ( ) ;
}
[Target]
2016-03-18 02:23:24 -07:00
[BuildPlatforms(BuildPlatform.Windows, BuildPlatform.OSX)] //, BuildPlatform.Ubuntu)]
2016-03-08 13:39:41 -08:00
public static BuildTargetResult PublishSdkInstallerFile ( BuildTargetContext c )
2016-03-07 12:20:50 -08:00
{
2016-03-16 18:16:51 -07:00
var installerFile = c . BuildContext . Get < string > ( "CombinedFrameworkSDKHostInstallerFile" ) ;
2016-03-07 12:20:50 -08:00
var installerFileBlob = $"{Channel}/Installers/{Version}/{Path.GetFileName(installerFile)}" ;
var latestInstallerFile = installerFile . Replace ( Version , "latest" ) ;
var latestInstallerFileBlob = $"{Channel}/Installers/Latest/{Path.GetFileName(latestInstallerFile)}" ;
PublishFileAzure ( installerFileBlob , installerFile ) ;
PublishFileAzure ( latestInstallerFileBlob , installerFile ) ;
return c . Success ( ) ;
}
[Target]
public static BuildTargetResult PublishLatestVersionTextFile ( BuildTargetContext c )
{
var osname = Monikers . GetOSShortName ( ) ;
var latestVersionBlob = $"{Channel}/dnvm/latest.{osname}.{CurrentArchitecture.Current}.version" ;
2016-03-17 22:22:22 -07:00
var latestVersionFile = Path . Combine ( Dirs . Stage2 , "sdk" , NuGetVersion , ".version" ) ;
2016-03-07 12:20:50 -08:00
PublishFileAzure ( latestVersionBlob , latestVersionFile ) ;
return c . Success ( ) ;
}
2016-03-08 13:39:41 -08:00
[Target(nameof(PublishSdkInstallerFile))]
2016-03-08 23:33:18 +00:00
[BuildPlatforms(BuildPlatform.Ubuntu)]
public static BuildTargetResult PublishDebFileToDebianRepo ( BuildTargetContext c )
{
var packageName = Monikers . GetDebianPackageName ( c ) ;
2016-03-08 13:39:41 -08:00
var installerFile = c . BuildContext . Get < string > ( "SdkInstallerFile" ) ;
2016-03-16 18:16:51 -07:00
var uploadUrl = $"https://dotnetcli.blob.core.windows.net/dotnet/{Channel}/Installers/{Version}/{Path.GetFileName(installerFile)}" ;
2016-03-08 23:33:18 +00:00
var uploadJson = GenerateUploadJsonFile ( packageName , Version , uploadUrl ) ;
Cmd ( Path . Combine ( Dirs . RepoRoot , "scripts" , "publish" , "repoapi_client.sh" ) , "-addpkg" , uploadJson )
. Execute ( )
. EnsureSuccessful ( ) ;
return c . Success ( ) ;
}
2016-03-16 14:39:02 -07:00
[Target]
[Environment("DOCKER_HUB_REPO")]
[Environment("DOCKER_HUB_TRIGGER_TOKEN")]
public static BuildTargetResult TriggerDockerHubBuilds ( BuildTargetContext c )
{
string dockerHubRepo = Environment . GetEnvironmentVariable ( "DOCKER_HUB_REPO" ) ;
string dockerHubTriggerToken = Environment . GetEnvironmentVariable ( "DOCKER_HUB_TRIGGER_TOKEN" ) ;
Uri baseDockerHubUri = new Uri ( "https://registry.hub.docker.com/u/" ) ;
Uri dockerHubTriggerUri ;
if ( ! Uri . TryCreate ( baseDockerHubUri , $"{dockerHubRepo}/trigger/{dockerHubTriggerToken}/" , out dockerHubTriggerUri ) )
{
return c . Failed ( "Invalid DOCKER_HUB_REPO and/or DOCKER_HUB_TRIGGER_TOKEN" ) ;
}
c . Info ( $"Triggering automated DockerHub builds for {dockerHubRepo}" ) ;
using ( HttpClient client = new HttpClient ( ) )
{
StringContent requestContent = new StringContent ( "{\"build\": true}" , Encoding . UTF8 , "application/json" ) ;
try
{
HttpResponseMessage response = client . PostAsync ( dockerHubTriggerUri , requestContent ) . Result ;
if ( ! response . IsSuccessStatusCode )
{
StringBuilder sb = new StringBuilder ( ) ;
sb . AppendLine ( $"HTTP request to {dockerHubTriggerUri.ToString()} was unsuccessful." ) ;
sb . AppendLine ( $"Response status code: {response.StatusCode}. Reason phrase: {response.ReasonPhrase}." ) ;
sb . Append ( $"Respone content: {response.Content.ReadAsStringAsync().Result}" ) ;
return c . Failed ( sb . ToString ( ) ) ;
}
}
catch ( AggregateException e )
{
return c . Failed ( $"HTTP request to {dockerHubTriggerUri.ToString()} failed. {e.ToString()}" ) ;
}
}
return c . Success ( ) ;
}
2016-03-08 23:33:18 +00:00
private static string GenerateUploadJsonFile ( string packageName , string version , string uploadUrl )
{
var repoID = Environment . GetEnvironmentVariable ( "REPO_ID" ) ;
var uploadJson = Path . Combine ( Dirs . Packages , "package_upload.json" ) ;
File . Delete ( uploadJson ) ;
using ( var fileStream = File . Create ( uploadJson ) )
{
using ( StreamWriter sw = new StreamWriter ( fileStream ) )
{
2016-03-16 18:16:51 -07:00
sw . WriteLine ( "{" ) ;
sw . WriteLine ( $" \" name \ ":\"{packageName}\"," ) ;
sw . WriteLine ( $" \" version \ ":\"{version}\"," ) ;
sw . WriteLine ( $" \" repositoryId \ ":\"{repoID}\"," ) ;
sw . WriteLine ( $" \" sourceUrl \ ":\"{uploadUrl}\"" ) ;
sw . WriteLine ( "}" ) ;
2016-03-08 23:33:18 +00:00
}
}
return uploadJson ;
}
2016-03-15 17:41:42 -07:00
[Target]
public static BuildTargetResult PublishCombinedFrameworkSDKHostFile ( BuildTargetContext c )
{
var compressedFile = c . BuildContext . Get < string > ( "CombinedFrameworkSDKHostCompressedFile" ) ;
var compressedFileBlob = $"{Channel}/Binaries/{Version}/{Path.GetFileName(compressedFile)}" ;
var latestCompressedFile = compressedFile . Replace ( Version , "latest" ) ;
var latestCompressedFileBlob = $"{Channel}/Binaries/Latest/{Path.GetFileName(latestCompressedFile)}" ;
PublishFileAzure ( compressedFileBlob , compressedFile ) ;
PublishFileAzure ( latestCompressedFileBlob , compressedFile ) ;
return c . Success ( ) ;
}
[Target]
public static BuildTargetResult PublishCombinedFrameworkHostFile ( BuildTargetContext c )
{
var compressedFile = c . BuildContext . Get < string > ( "CombinedFrameworkHostCompressedFile" ) ;
var compressedFileBlob = $"{Channel}/Binaries/{Version}/{Path.GetFileName(compressedFile)}" ;
var latestCompressedFile = compressedFile . Replace ( Version , "latest" ) ;
var latestCompressedFileBlob = $"{Channel}/Binaries/Latest/{Path.GetFileName(latestCompressedFile)}" ;
2016-03-14 16:44:52 -07:00
PublishFileAzure ( compressedFileBlob , compressedFile ) ;
PublishFileAzure ( latestCompressedFileBlob , compressedFile ) ;
return c . Success ( ) ;
}
2016-03-07 12:20:50 -08:00
private static BuildTargetResult PublishFile ( BuildTargetContext c , string file )
{
var env = PackageTargets . GetCommonEnvVars ( c ) ;
Cmd ( "powershell" , "-NoProfile" , "-NoLogo" ,
Path . Combine ( Dirs . RepoRoot , "scripts" , "publish" , "publish.ps1" ) , file )
2016-02-12 10:11:30 -08:00
. Environment ( env )
. Execute ( )
. EnsureSuccessful ( ) ;
2016-03-07 12:20:50 -08:00
return c . Success ( ) ;
}
private static void PublishFileAzure ( string blob , string file )
{
CloudBlockBlob blockBlob = BlobContainer . GetBlockBlobReference ( blob ) ;
2016-03-10 10:23:52 -08:00
blockBlob . UploadFromFileAsync ( file , FileMode . Open ) . Wait ( ) ;
if ( Path . GetExtension ( blockBlob . Uri . AbsolutePath . ToLower ( ) ) = = ".svg" )
2016-02-12 10:11:30 -08:00
{
2016-03-10 10:23:52 -08:00
blockBlob . Properties . ContentType = "image/svg+xml" ;
2016-03-10 16:03:43 -08:00
blockBlob . Properties . CacheControl = "no-cache" ;
2016-03-10 10:23:52 -08:00
blockBlob . SetPropertiesAsync ( ) . Wait ( ) ;
2016-02-12 10:11:30 -08:00
}
}
}
}