Skip to content

Commit

Permalink
Dev Integrate to Master (#180)
Browse files Browse the repository at this point in the history
* Add a silent try catch while printing previous log tail (#87)

* Added console event generator for kudu (#85)

* Fixed the bug where symlinks couldn't be created for zip extraction + (#84)

added recursive permissions change for zip deploy/zip controller

* ANT84 Linux Consumption Remote Build Patch (#88)

* ANT84 Linux Consumption Server Side Build Patch

* Add logger for dependencies

* Remove zip context validation

* Fix error message when doing zip deploy with WEBSITE_RUN_FROM_PACKAGE

* Add ability to grab the FRAMEWORK_VERSION for function apps (#91)

* Kudu Fixes (#90)

* Using Log4Net to generate kudu event logs

* Added lts support for Oryx on NODE. Made compressing python packages default. Fixed minor bugs with kudu event logs

* Changed the log path in Log4Net config

* Added Express Build support for NETCore. Added a filter to avoid excessive logging for certain paths.

* Modified python compress arguments

* Added debug arguments for oryx build

* Added a fix for NETCore express build scenario + Removing Oryx Manifest file for Zip Deploy

* Minor change

* Fix python 3.7 path in Oryx Build (#92)

* Fix python 3.7 path

* Fix syntax

* Fix missing Docker logs (#96)

* Fix missing Docker logs

* Retrieve logs for the last seven days from the latest timestamp

* Added KuduConsole Log4Net logger + Some Bug Fixes (#97)

* Added log4net support for KuduConsole

* Fix FileNotFound exception for LogStream Service

* Fix Oryx Build command not picking up the version

* ANT86 add zipdeploy endpoint support for ARM call (#94)

* Add zipdeploy endpoint for ANT86

* Remove ZipDeployController

* ANT86 Patch on Linux Consumption Remote Build (#95)

* Warm up linux conusmption function app after remote build

* Also take SCM_RUN_FROM_PACKAGE from app setting

* Trigger a recycle after wardeploy (#98)

* Trigger a recycle after wardeploy

- This is a port of this PR - projectkudu/kudu#3050 - from the Kudu repo.
- Current implementation of /wardeploy triggers a recycle of container, only on Xenon and Linux. This recycle is performed using the restartTrigger.txt file.
- This commit adds support to /wardeploy for triggering a recycle of classic Windows web apps in addition to just Xenon and Linux, if the app setting WEBSITE_RECYCLE_PREVIEW_ENABLED is defined. Besides, the recyle will be performed using the /api/app/restart API.
- The new behavior is hidden behind a WEBSITE_RECYCLE_PREVIEW_ENABLED flag, which is added only temporarily. This flag will eventually be removed and the new behavior will become the default.

* Incorporated CR comment

* Kudu Fixes + Enhancements - Oct (#101)

* Adding some trace to zip formation

* Added Artifacts support as a flag

* Fix broken Deployments for Node 12.9 and remove Oryx Symlink Files on Zip Deploy (#102)

* Fixing node_modules symlink deletion +

* Add support to remove the symlink file using rm

* Fix Node 10.16/12.9 broken deployments

* Add Intermediate directory support for PHP (#103)

* Update function app language version regex to take account lengthy function version (#108)

* Add SyncTriggers query param for zipdeploy in Linux Consumption (#106)

* Update deeplink to Linux troubleshoot page

Same change as projectkudu/kudu#3139

* Added NoOpBuilder for static site stack (#115)

* Added NoOpBuilder

* Use FRAMEWORK env variable to choose NoOpBuilder

* Check for NoOpBuilder before check for Oryx builder

* Parse external deployment ID from zip push headers

* Persist new ID through changeset so it carries over to later deployment steps

* Make usage consistent across all push deploy types

* Fix ruby language detection

* [Linux Consumption] Support persistent storage using Azure file share (#121)

Adds support for creating & mounting Azure file shares for Linux consumption scm sites. Function apps can opt-in using the app setting ENABLE_KUDU_PERSISTENT_STORAGE=1. Currently the persistent storage is used for deplpyment logs only. This change also moves artifacts location from /deployments path to its own path /artifacts.

* [ANT 88] Implement force remote build in Linux Consumption (#109)

* Implement force remote build endpoint call

* Rename ForceRemoteBuild to OverwriteWebsiteRunFromPackage

* Fix merge conflict

* Fix Log4Net config for KuduConsole telemetry (#123)

* DynamicInstall Post-Recieve Hook Fix (#126)

* Fixed Dynamic Install Environment for Kudu Post Recieve Hook for Local Git

* More fixes

* Add a message on memory limit when running remote build (#127)

* Log events with actual sitename in Linux LinuxConsumption (#125)

Since Linux consumption containers start in placeholdermode the initially cached sitename should be refreshed once the container is specialized

* fixed TryGetValues to TryGetValue and changed result data type

* Kudu to FE call to update deployment status

Comment resolution

Added build failure when exception is thrown

* OneDeploy API - /publish and /api/publish (#134)

* OneDeploy API - /publish and /api/publish

- Adds a new /publish and /api/publish APIs for Java deployment scenarios
- This new API primarily supports Java scenarios currently, but can be easily extended for additional scenarios
- Overview of new changes
  - OneDeploy reuses bulk of the code from PushDeploymentController and DeploymentManager
  - OneDeployBuilder is a new OneDeploy specific site builder, OneDeployFetch is a OneDeploy specific Fetch handler
  - WatchedFileEnabled/RestartAllowed/ArtifactType/TargetRootPath are additional knobs introduced in DeploymentInfoBase.cs for OneDeploy specific functionality
  - The implementation inspects the WEBSITE_STACK environment variable for certain scenarios. This variable is injected by the App Service runtime
  - OneDeploy uses the new restart API (in other words, it does not rely on touching any file for triggering a recycle)
- Summary of changes to existing code:
  - A bunch of variables were renamed for readability purposes
  - ZipDeploymentInfo is now ArtifactDeploymentInfo (generalized) and is now used by OneDeploy for non-zip artifacts as well
- Note: This is primarily a port of projectkudu/kudu#3203 with some additional enhancements to OneDeploy. These enhancements will be back ported to https://github.com/projectkudu/kudu

* Minor refactoring

* Remove merge conflict artifact

* Clean up formatting and avoid posting deployment status if not using fixed deployment ID

* Refactor helper function for retrieving ID from request

* Refactor to commit deployment ID to NullRepository and use strings for deployment status constants

* Fix whitespace changes

* Revert "Fix whitespace changes"

This reverts commit 5f2be3c.

* Revert changes to IRepo and HgRepo

* Add back IRepo and HgRepo with correct line endings

* Added retry logic to retry 3 times with 5sec intervals (#137)

* Adde retry logic to retry 3 times with 5sec intervals

* Fail silently logic for handling 404

* Removed extra call on build failed

No need of the extra query param

Comment resolution

Removed extra logging

* Self cert changes

* Fixed build errors

* Revert "Fixed build errors"

This reverts commit 8306c58.

* Build fix

* Throw exception if request was throttled

* Throw exception if request was throttled

* PR feedback

* Add home page for Linux Consumption app (#138)

* Add home page for Linux Consumption app

* Use partial page

* Address PR issues

* Update DeploymentId to ExternalDeploymentId

* Fix typo in pushdeploymentcontroller

* Add CDN Fallbacks (#140)

* Fail silently if call to /api/app/updatedeploystatus fails (#146)

* Fix LinuxConsumption HomePage for Controller Ping (#143)

* Add endpoint for checking SCM site

* Simplify if statement

* Add more resilience to '/api/deployments/` endpoints for continued polling (#141)

* Add retries to ensure deployment doesn't fail at these steps

* Added rettries at various places

* Adjust retry timeouts

* Lock Improvements test

* Handled CR comments

* Adding --compress-destination-dir for Python builds (#145)

* Changed python oryx build args to --compress-destination-dir

Removed extra -p

Removed zip extensions since they aren't needed anymore

* Removed unnecessary zip extensions

* fail update status API silently if 3 retries fail

* Fixed debug console (#150)

* adding filemanager to newui (#151)

* Moving first request to Kudu in update deployment status api

* Hiding KeyVault secrets on Environment page (#155)

* Hiding KeyVault secret environment variables with checkbox

* Adding key vault hiding secrets to NewUI

Co-authored-by: Kar Shin Lin <karslin@microsoft.com>

* Add GitHub Action Builds integration for the Pull Requests (#162)

* Create dotnet-core.yml

Add GH Action for build and tests

* Rename workflow file

* Rename workflow files

* Rename dev merge build (#163)

* Update README.md

Add Build Status Badge

* Add LGTM Confiugration file (#164)

* Changing net core version to 2.2.8 (#165)

* Update .lgtm.yml

* update1 (#169)

* Fixes for ZipDeploy, Status lock conflict (#173)

* Add more tracing + fix zipdeploy regression (#167)

* Add more tracing + fix zipdeploy regression

* Add a retry to get deployment lock

* Revert Purge codepath

* Revert

* Actual fix

* If KUDU_BUILD_VERSION is set to 0.0.1 do python ANT90 build (#168)

Creating constants for the app setting

Trim whitespace for the app setting

* Fix file handle leak for status.lock (#170)

* Reduce retry count

Co-authored-by: purva-vasudeo <61296267+purva-vasudeo@users.noreply.github.com>

* NETCore Deployment Fixes for DeploymentV2 (#174)

* DeploymentV2 fixes

* Minor fixes

* Inject external deployment id to response headers (#175)

* Add a silent try catch while iterating over docker logs (#176)

* OneDeploy improvements

- This is a port of projectkudu/kudu#3248
- Allow absolute paths. Earlier implementation only allows relative paths
- Allow WAR to be deployed to JBoss EAP (although it is not supported on Windows, this will help consistency with KuduLite)

* Block linux consumption health check probes without auth headers  (#172)

* update1

* Block linux consumption health check probes without auth headers

* Block linux consumption health check probes without auth headers

* Updating health route (#2)

* **BYPASS_SECRET_SCANNING**

* Fix cred scan (#179)

Co-authored-by: Hanzhang Zeng (Roger) <48038149+Hazhzeng@users.noreply.github.com>
Co-authored-by: Ankit Kumar <ankikuma@microsoft.com>
Co-authored-by: michimune <michimune@outlook.com>
Co-authored-by: Shrirang Shirodkar <shrishrirang@users.noreply.github.com>
Co-authored-by: purva-vasudeo <61296267+purva-vasudeo@users.noreply.github.com>
Co-authored-by: Jonathan Kleinfeld <jokleinf@microsoft.com>
Co-authored-by: JennyLawrance <jennylaw@microsoft.com>
Co-authored-by: Bala G <balag@outlook.com>
Co-authored-by: Purva Vasudeo <puvasude@microsoft.com>
Co-authored-by: anandanthony <anfranci@microsoft.com>
Co-authored-by: karshinlin <lin.karshin@gmail.com>
Co-authored-by: Kar Shin Lin <karslin@microsoft.com>
Co-authored-by: divyagandhii <44176589+divyagandhii@users.noreply.github.com>
Co-authored-by: Shrirang Shirodkar <shrirs@microsoft.com>
  • Loading branch information
15 people authored Jan 14, 2021
1 parent 51715da commit c739d83
Show file tree
Hide file tree
Showing 113 changed files with 24,366 additions and 785 deletions.
21 changes: 21 additions & 0 deletions .github/workflows/dev-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: Build

on:
push:
branches: [ dev ]

jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 2.2.x
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet build ./Kudu.Services.Web/Kudu.Services.Web.csproj --configuration Release --no-restore
21 changes: 21 additions & 0 deletions .github/workflows/pr-validation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: PR Validation

on:
pull_request:
branches: [ dev ]

jobs:
build:

runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 2.2.x
- name: Install dependencies
run: dotnet restore
- name: Build
run: dotnet publish ./Kudu.Services.Web/Kudu.Services.Web.csproj --configuration Release --no-restore
26 changes: 26 additions & 0 deletions .lgtm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
extraction:
csharp:
# The `prepare` step exists for customization on LGTM.com only.
# prepare:
# packages:
# - example_package
# Add an `after-prepare` step if you need to run commands after the `prepare` step.
# Each command should be listed on a separate line.
after_prepare:
- export PATH=$LGTM_WORKSPACE/tools:$PATH
# The `index` step builds the code and extracts information during the build
# process.
index:
# Override the autobuild process by specifying a list of custom build commands
# to use instead.
build_command:
- dotnet build Kudu.Services.Web/Kudu.Services.Web.csproj
# Specify .NET Core settings.
dotnet:
# Specify the version of .NET Core SDK to use.
# Default: The version installed on the build machine.
version: 2.2.207
# Specify additional options for the extractor,
# for example --fast to perform a faster extraction that produces a smaller
# database.
extractor: "--fast"
31 changes: 28 additions & 3 deletions Common/Constants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ public static class Constants
public const string WebRoot = "wwwroot";
public const string MappedSite = "/_app";
public const string RepositoryPath = "repository";
public const string ZipTempPath = "zipdeploy";
public const string ZipExtractPath = "extracted";
public const string ZipTempDirectoryName = "zipdeploy";
public const string ArtifactStagingDirectoryName = "extracted";

public const string LockPath = "locks";
public const string DeploymentLockFile = "deployments.lock";
Expand All @@ -34,6 +34,7 @@ public static class Constants
public const string NpmDebugLogFile = "npm-debug.log";

public const string DeploymentCachePath = "deployments";
public const string ArtifactsPath = "artifacts";
public const string SiteExtensionsCachePath = "siteextensions";
public const string DeploymentToolsPath = "tools";
public const string SiteFolder = @"site";
Expand Down Expand Up @@ -99,6 +100,15 @@ public static TimeSpan MaxAllowedExecutionTime
public const string LogicAppUrlKey = "LOGICAPP_URL";

public const string RestartApiPath = "/api/app/restart";
public const string UpdateDeployStatusPath = "/api/app/updatedeploystatus";

// Deployment status API constants
public const string BuildRequestReceived = "BuildRequestReceived";
public const string BuildPending = "BuildPending";
public const string BuildInProgress = "BuildInProgress";
public const string BuildSuccessful = "BuildSuccessful";
public const string PostBuildRestartRequired = "PostBuildRestartRequired";
public const string BuildFailed = "BuildFailed";

public const string SiteExtensionProvisioningStateCreated = "Created";
public const string SiteExtensionProvisioningStateAccepted = "Accepted";
Expand All @@ -114,9 +124,10 @@ public static TimeSpan MaxAllowedExecutionTime
public const string FreeSKU = "Free";
public const string BasicSKU = "Basic";

//Setting for VC++ for node builds
// Setting for VC++ for node builds
public const string VCVersion = "2015";

public const string WebsiteSiteName = "WEBSITE_SITE_NAME";
public const string SiteRestrictedToken = "x-ms-site-restricted-token";
public const string SiteAuthEncryptionKey = "WEBSITE_AUTH_ENCRYPTION_KEY";
public const string HttpHost = "HTTP_HOST";
Expand All @@ -136,11 +147,14 @@ public static TimeSpan MaxAllowedExecutionTime
public const string FunctionKeyNewFormat = "~0.7";
public const string FunctionRunTimeVersion = "FUNCTIONS_EXTENSION_VERSION";
public const string ScmRunFromPackage = "SCM_RUN_FROM_PACKAGE";
public const string ScmRunFromPackageContainerName = "scm-releases";
public const string ScmRunFromPackageBlobPrefix = "rfp-latest";
public const string WebSiteSku = "WEBSITE_SKU";
public const string WebSiteElasticScaleEnabled = "WEBSITE_ELASTIC_SCALING_ENABLED";
public const string DynamicSku = "Dynamic";
public const string ElasticScaleEnabled = "1";
public const string AzureWebJobsSecretStorageType = "AzureWebJobsSecretStorageType";
public const string AzureWebJobsStorage = "AzureWebJobsStorage";
public const string HubName = "HubName";
public const string DurableTaskStorageConnection = "connection";
public const string DurableTaskStorageConnectionName = "azureStorageConnectionStringName";
Expand All @@ -156,5 +170,16 @@ public static TimeSpan MaxAllowedExecutionTime
public const string LinuxLogEventStreamName = "MS_KUDU_LOGS";
public const string WebSiteHomeStampName = "WEBSITE_HOME_STAMPNAME";
public const string WebSiteStampDeploymentId = "WEBSITE_STAMP_DEPLOYMENT_ID";
public const string MeshInitURI = "MESH_INIT_URI";
public const string KuduFileShareMountPath = "/kudu-mnt";
public const string KuduFileSharePrefix = "kudu-mnt";
public const string EnablePersistentStorage = "ENABLE_KUDU_PERSISTENT_STORAGE";

public const string OneDeploy = "OneDeploy";

public const string ScmDeploymentIdHeader = "SCM-DEPLOYMENT-ID";

public const string KuduBuildVersionAppSetting = "KUDU_BUILD_VERSION";
public const string PythonKuduBuild90 = "0.0.1";
}
}
34 changes: 21 additions & 13 deletions Kudu.Console/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,19 +21,26 @@
using Kudu.Core.SourceControl.Git;
using Kudu.Core.Tracing;
using System.Reflection;
using Kudu.Core.LinuxConsumption;
using XmlSettings;
using log4net;
using log4net.Config;
using System.Xml;

namespace Kudu.Console
{
internal class Program
{

private static int Main(string[] args)
{
var logRepository = LogManager.GetRepository(Assembly.GetEntryAssembly());
XmlConfigurator.Configure(logRepository, new FileInfo("log4net.config"));
// Configure Logging if running on Azure
if (System.Environment.GetEnvironmentVariable("WEBSITE_INSTANCE_ID") != null)
{
XmlDocument log4netConfig = new XmlDocument();
log4netConfig.Load(File.OpenRead("/opt/Kudu/KuduConsole/log4net.config"));
var repo = log4net.LogManager.CreateRepository(Assembly.GetEntryAssembly(),
typeof(log4net.Repository.Hierarchy.Hierarchy));
log4net.Config.XmlConfigurator.Configure(repo, log4netConfig["log4net"]);
}

// Turn flag on in app.config to wait for debugger on launch
if (ConfigurationManager.AppSettings["WaitForDebuggerOnStart"] == "true")
Expand Down Expand Up @@ -79,7 +86,7 @@ private static int Main(string[] args)
string deploymentLockPath = Path.Combine(lockPath, Constants.DeploymentLockFile);

IOperationLock deploymentLock = DeploymentLockFile.GetInstance(deploymentLockPath, traceFactory);

if (deploymentLock.IsHeld)
{
return PerformDeploy(appRoot, wapTargets, deployer, lockPath, env, settingsManager, level, tracer, traceFactory, deploymentLock);
Expand Down Expand Up @@ -126,10 +133,10 @@ private static int PerformDeploy(
string statusLockPath = Path.Combine(lockPath, Constants.StatusLockFile);
string hooksLockPath = Path.Combine(lockPath, Constants.HooksLockFile);


IOperationLock statusLock = new LockFile(statusLockPath, traceFactory);
IOperationLock hooksLock = new LockFile(hooksLockPath, traceFactory);

IBuildPropertyProvider buildPropertyProvider = new BuildPropertyProvider();
ISiteBuilderFactory builderFactory = new SiteBuilderFactory(buildPropertyProvider, env);
var logger = new ConsoleLogger();
Expand All @@ -144,7 +151,7 @@ private static int PerformDeploy(
gitRepository = new GitExeRepository(env, settingsManager, traceFactory);
}

IServerConfiguration serverConfiguration = new ServerConfiguration();
IServerConfiguration serverConfiguration = new ServerConfiguration(SystemEnvironment.Instance);
IAnalytics analytics = new Analytics(settingsManager, serverConfiguration, traceFactory);

IWebHooksManager hooksManager = new WebHooksManager(tracer, env, hooksLock);
Expand Down Expand Up @@ -204,7 +211,7 @@ private static int PerformDeploy(
finally
{
System.Console.WriteLine("Deployment Logs : '"+
env.AppBaseUrlPrefix+ "/newui/jsonviewer?view_url=/api/deployments/" +
env.AppBaseUrlPrefix+ "/newui/jsonviewer?view_url=/api/deployments/" +
gitRepository.GetChangeSet(settingsManager.GetBranch()).Id+"/log'");
}
}
Expand Down Expand Up @@ -262,11 +269,11 @@ private static IEnvironment GetEnvironment(string siteRoot, string requestId)
{
string root = Path.GetFullPath(Path.Combine(siteRoot, ".."));

// CORE TODO : test by setting SCM_REPOSITORY_PATH
// CORE TODO : test by setting SCM_REPOSITORY_PATH
// REVIEW: this looks wrong because it ignores SCM_REPOSITORY_PATH
string repositoryPath = Path.Combine(siteRoot, Constants.RepositoryPath);

// SCM_BIN_PATH is introduced in Kudu apache config file
// SCM_BIN_PATH is introduced in Kudu apache config file
// Provide a way to override Kudu bin path, to resolve issue where we can not find the right Kudu bin path when running on mono
// CORE TODO I don't think this is needed anymore? This env var is not used anywhere but here.
string binPath = System.Environment.GetEnvironmentVariable("SCM_BIN_PATH");
Expand All @@ -283,7 +290,8 @@ private static IEnvironment GetEnvironment(string siteRoot, string requestId)
repositoryPath,
requestId,
Path.Combine(AppContext.BaseDirectory, "KuduConsole", "kudu.dll"),
null);
null,
new FileSystemPathProvider(new NullMeshPersistentFileSystem()));
}
}
}
32 changes: 16 additions & 16 deletions Kudu.Console/log4net.config
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8" ?>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file type="log4net.Util.PatternString" value="/var/log/kudulogs/%utcdate{yyyy-MM-dd}_%env{COMPUTERNAME}_scm_console_docker.log" />
<param name="RollingStyle" value="Size"/>
<param name="StaticLogFileName" value="true"/>
<appendToFile value="true" />
<maxSizeRollBackups value="10"/>
<maximumFileSize value="5MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy-MM-dd-HH:mm:ss.fff} %message%n" />
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
<lockingModel type="log4net.Appender.FileAppender+MinimalLock"/>
<file type="log4net.Util.PatternString" value="/var/log/kudulogs/%utcdate{yyyy-MM-dd}_%env{COMPUTERNAME}_scm_console_docker.log" />
<param name="RollingStyle" value="Size"/>
<param name="StaticLogFileName" value="true"/>
<appendToFile value="true" />
<maxSizeRollBackups value="10"/>
<maximumFileSize value="5MB"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{yyyy-MM-dd-HH:mm:ss.fff} %message%n" />
</layout>
</appender>
<root>
<level value="ALL"/>
<appender-ref ref="RollingLogFileAppender"/>
</root>
</log4net>
21 changes: 21 additions & 0 deletions Kudu.Contracts/Deployment/ArtifactType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kudu.Contracts.Deployment
{
public enum ArtifactType
{
Unknown,
War,
Jar,
Ear,
Lib,
Static,
Startup,
Script,
Zip,
}
}
19 changes: 19 additions & 0 deletions Kudu.Contracts/Deployment/DeployStatusApiResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Text;

namespace Kudu.Contracts.Deployment
{
public class DeployStatusApiResult
{
public DeployStatusApiResult(string DeploymentStatus, string DeploymentId)
{
this.DeploymentStatus = DeploymentStatus;
this.DeploymentId = DeploymentId;
}

public string DeploymentStatus { get; set; }

public string DeploymentId { get; set; }
}
}
Loading

0 comments on commit c739d83

Please sign in to comment.