diff --git a/build/build-constants.yaml b/build/build-constants.yaml index a6d77a47b8..24998571ea 100644 --- a/build/build-constants.yaml +++ b/build/build-constants.yaml @@ -83,7 +83,7 @@ file-name-prefix: __ - name: file-paths constants: - build-id-file-name: .oryx_build_id + build-manifest-file-name: oryx-manifest.toml outputs: - type: csharp directory: src/Common diff --git a/src/BuildScriptGenerator/BuildScriptGeneratorContext.cs b/src/BuildScriptGenerator/BuildScriptGeneratorContext.cs index 7f549c2bcd..4c2fc97d8f 100644 --- a/src/BuildScriptGenerator/BuildScriptGeneratorContext.cs +++ b/src/BuildScriptGenerator/BuildScriptGeneratorContext.cs @@ -12,6 +12,11 @@ namespace Microsoft.Oryx.BuildScriptGenerator /// public partial class BuildScriptGeneratorContext { + /// + /// Gets or sets the information which is used to correlate log messages. + /// + public string OperationId { get; set; } + public ISourceRepo SourceRepo { get; set; } /// diff --git a/src/BuildScriptGenerator/Constants.cs b/src/BuildScriptGenerator/Constants.cs index 6fcb134a5b..00fe3e84b7 100644 --- a/src/BuildScriptGenerator/Constants.cs +++ b/src/BuildScriptGenerator/Constants.cs @@ -9,7 +9,6 @@ public static class Constants { public const string OryxEnvironmentSettingNamePrefix = "ORYX_"; public const string BuildEnvironmentFileName = "build.env"; - public const string ManifestFileName = "oryx-manifest.toml"; public const string AppInsightsKey = "APPINSIGHTS_INSTRUMENTATIONKEY"; public const string ZipAllOutputBuildPropertyKey = "zip_all_output"; public const string ZipAllOutputBuildPropertyKeyDocumentation = diff --git a/src/BuildScriptGenerator/DefaultBuildScriptGenerator.cs b/src/BuildScriptGenerator/DefaultBuildScriptGenerator.cs index ae3b63546c..5fce46a640 100644 --- a/src/BuildScriptGenerator/DefaultBuildScriptGenerator.cs +++ b/src/BuildScriptGenerator/DefaultBuildScriptGenerator.cs @@ -334,7 +334,7 @@ private string BuildScriptFromSnippets( PostBuildCommand = postBuildCommand, DirectoriesToExcludeFromCopyToIntermediateDir = directoriesToExcludeFromCopyToIntermediateDir, DirectoriesToExcludeFromCopyToBuildOutputDir = directoriesToExcludeFromCopyToBuildOutputDir, - ManifestFileName = Constants.ManifestFileName, + ManifestFileName = FilePaths.BuildManifestFileName, BuildProperties = buildProperties }; diff --git a/src/BuildScriptGenerator/DotNetCore/DotnetCorePlatform.cs b/src/BuildScriptGenerator/DotNetCore/DotnetCorePlatform.cs index 7c0a73e70d..f053191068 100644 --- a/src/BuildScriptGenerator/DotNetCore/DotnetCorePlatform.cs +++ b/src/BuildScriptGenerator/DotNetCore/DotnetCorePlatform.cs @@ -8,6 +8,7 @@ using System.IO; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Microsoft.Oryx.Common; namespace Microsoft.Oryx.BuildScriptGenerator.DotNetCore { @@ -52,6 +53,8 @@ public LanguageDetectorResult Detect(ISourceRepo sourceRepo) public BuildScriptSnippet GenerateBashBuildScriptSnippet(BuildScriptGeneratorContext context) { var buildProperties = new Dictionary(); + buildProperties[ManifestFilePropertyKeys.OperationId] = context.OperationId; + (string projectFile, string publishDir) = GetProjectFileAndPublishDir(context.SourceRepo); if (string.IsNullOrEmpty(projectFile) || string.IsNullOrEmpty(publishDir)) { @@ -77,7 +80,7 @@ public BuildScriptSnippet GenerateBashBuildScriptSnippet(BuildScriptGeneratorCon context), PreBuildCommand = preBuildCommand, PostBuildCommand = postBuildCommand, - ManifestFileName = Constants.ManifestFileName, + ManifestFileName = FilePaths.BuildManifestFileName, ZipAllOutput = zipAllOutput, Configuration = GetBuildConfiguration() }; @@ -148,6 +151,14 @@ public IEnumerable GetDirectoriesToExcludeFromCopyToIntermediateDir( return dirs; } + private static bool ShouldZipAllOutput(BuildScriptGeneratorContext context) + { + return BuildPropertiesHelper.IsTrue( + Constants.ZipAllOutputBuildPropertyKey, + context, + valueIsRequired: false); + } + private string GetBuildConfiguration() { var configuration = _options.MSBuildConfiguration; @@ -159,14 +170,6 @@ private string GetBuildConfiguration() return configuration; } - private static bool ShouldZipAllOutput(BuildScriptGeneratorContext context) - { - return BuildPropertiesHelper.IsTrue( - Constants.ZipAllOutputBuildPropertyKey, - context, - valueIsRequired: false); - } - private (string projFile, string publishDir) GetProjectFileAndPublishDir(ISourceRepo repo) { var projectFile = _aspNetCoreWebAppProjectFileProvider.GetRelativePathToProjectFile(repo); @@ -178,18 +181,5 @@ private static bool ShouldZipAllOutput(BuildScriptGeneratorContext context) var publishDir = Path.Combine(repo.RootPath, DotnetCoreConstants.OryxOutputPublishDirectory); return (projectFile, publishDir); } - - private string GetCommandOrScript(string commandOrScript) - { - if (!string.IsNullOrEmpty(commandOrScript)) - { - if (File.Exists(commandOrScript)) - { - return $"\"{commandOrScript}\""; - } - } - - return commandOrScript; - } } } \ No newline at end of file diff --git a/src/BuildScriptGenerator/ManifestFilePropertyKeys.cs b/src/BuildScriptGenerator/ManifestFilePropertyKeys.cs index 5cb611e7fb..f14eb98b62 100644 --- a/src/BuildScriptGenerator/ManifestFilePropertyKeys.cs +++ b/src/BuildScriptGenerator/ManifestFilePropertyKeys.cs @@ -7,6 +7,8 @@ namespace Microsoft.Oryx.BuildScriptGenerator { public static class ManifestFilePropertyKeys { - public const string ZipAllOutput = "zipAllOutput"; + public const string ZipAllOutput = nameof(ZipAllOutput); + + public const string OperationId = nameof(OperationId); } } \ No newline at end of file diff --git a/src/BuildScriptGenerator/Node/NodePlatform.cs b/src/BuildScriptGenerator/Node/NodePlatform.cs index 70332ff981..fd6166a009 100644 --- a/src/BuildScriptGenerator/Node/NodePlatform.cs +++ b/src/BuildScriptGenerator/Node/NodePlatform.cs @@ -61,6 +61,8 @@ public LanguageDetectorResult Detect(ISourceRepo sourceRepo) public BuildScriptSnippet GenerateBashBuildScriptSnippet(BuildScriptGeneratorContext context) { var buildProperties = new Dictionary(); + buildProperties[ManifestFilePropertyKeys.OperationId] = context.OperationId; + var packageJson = GetPackageJsonObject(context.SourceRepo, _logger); string runBuildCommand = null; string runBuildAzureCommand = null; diff --git a/src/BuildScriptGenerator/Php/PhpPlatform.cs b/src/BuildScriptGenerator/Php/PhpPlatform.cs index ed66ff56d6..9e00d3a415 100644 --- a/src/BuildScriptGenerator/Php/PhpPlatform.cs +++ b/src/BuildScriptGenerator/Php/PhpPlatform.cs @@ -43,6 +43,9 @@ public LanguageDetectorResult Detect(ISourceRepo sourceRepo) public BuildScriptSnippet GenerateBashBuildScriptSnippet(BuildScriptGeneratorContext ctx) { + var buildProperties = new Dictionary(); + buildProperties[ManifestFilePropertyKeys.OperationId] = ctx.OperationId; + _logger.LogDebug("Selected PHP version: {phpVer}", ctx.PhpVersion); bool composerFileExists = false; @@ -70,7 +73,7 @@ public BuildScriptSnippet GenerateBashBuildScriptSnippet(BuildScriptGeneratorCon var props = new PhpBashBuildSnippetProperties { ComposerFileExists = composerFileExists }; string snippet = TemplateHelpers.Render(TemplateHelpers.TemplateResource.PhpBuildSnippet, props, _logger); - return new BuildScriptSnippet { BashBuildScriptSnippet = snippet }; + return new BuildScriptSnippet { BashBuildScriptSnippet = snippet, BuildProperties = buildProperties }; } public bool IsEnabled(BuildScriptGeneratorContext ctx) diff --git a/src/BuildScriptGenerator/Properties/AssemblyInfo.cs b/src/BuildScriptGenerator/Properties/AssemblyInfo.cs index 48f13d59df..bff4b37e19 100644 --- a/src/BuildScriptGenerator/Properties/AssemblyInfo.cs +++ b/src/BuildScriptGenerator/Properties/AssemblyInfo.cs @@ -6,4 +6,7 @@ using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.Oryx.BuildScriptGenerator.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c96528184668742ee5bc6a1f8b4447fdc42d482d7c339989f050d7858ea7277df2f86c7ad0b8afa733987baaf6adb2858b170995d03ba3ad612bbd0b5a389e1f6392cc5ad158f726d018d9aa75c362e0350da1c6f92b75ca449591be97fc08e68c576d95aff6cfc9e58a4653e4b6e87a1d83e3060f98a6214eacfd62a45cc8bf")] -[assembly: InternalsVisibleTo("BuildScriptGeneratorCli.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c96528184668742ee5bc6a1f8b4447fdc42d482d7c339989f050d7858ea7277df2f86c7ad0b8afa733987baaf6adb2858b170995d03ba3ad612bbd0b5a389e1f6392cc5ad158f726d018d9aa75c362e0350da1c6f92b75ca449591be97fc08e68c576d95aff6cfc9e58a4653e4b6e87a1d83e3060f98a6214eacfd62a45cc8bf")] \ No newline at end of file +[assembly: InternalsVisibleTo("BuildScriptGeneratorCli.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c96528184668742ee5bc6a1f8b4447fdc42d482d7c339989f050d7858ea7277df2f86c7ad0b8afa733987baaf6adb2858b170995d03ba3ad612bbd0b5a389e1f6392cc5ad158f726d018d9aa75c362e0350da1c6f92b75ca449591be97fc08e68c576d95aff6cfc9e58a4653e4b6e87a1d83e3060f98a6214eacfd62a45cc8bf")] +[assembly: InternalsVisibleTo("Oryx.Integration.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c96528184668742ee5bc6a1f8b4447fdc42d482d7c339989f050d7858ea7277df2f86c7ad0b8afa733987baaf6adb2858b170995d03ba3ad612bbd0b5a389e1f6392cc5ad158f726d018d9aa75c362e0350da1c6f92b75ca449591be97fc08e68c576d95aff6cfc9e58a4653e4b6e87a1d83e3060f98a6214eacfd62a45cc8bf")] +[assembly: InternalsVisibleTo("Oryx.BuildImage.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c96528184668742ee5bc6a1f8b4447fdc42d482d7c339989f050d7858ea7277df2f86c7ad0b8afa733987baaf6adb2858b170995d03ba3ad612bbd0b5a389e1f6392cc5ad158f726d018d9aa75c362e0350da1c6f92b75ca449591be97fc08e68c576d95aff6cfc9e58a4653e4b6e87a1d83e3060f98a6214eacfd62a45cc8bf")] +[assembly: InternalsVisibleTo("Oryx.RuntimeImage.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100c96528184668742ee5bc6a1f8b4447fdc42d482d7c339989f050d7858ea7277df2f86c7ad0b8afa733987baaf6adb2858b170995d03ba3ad612bbd0b5a389e1f6392cc5ad158f726d018d9aa75c362e0350da1c6f92b75ca449591be97fc08e68c576d95aff6cfc9e58a4653e4b6e87a1d83e3060f98a6214eacfd62a45cc8bf")] diff --git a/src/BuildScriptGenerator/Python/PythonPlatform.cs b/src/BuildScriptGenerator/Python/PythonPlatform.cs index cc67f8043a..8af42ef152 100644 --- a/src/BuildScriptGenerator/Python/PythonPlatform.cs +++ b/src/BuildScriptGenerator/Python/PythonPlatform.cs @@ -68,6 +68,8 @@ public LanguageDetectorResult Detect(ISourceRepo sourceRepo) public BuildScriptSnippet GenerateBashBuildScriptSnippet(BuildScriptGeneratorContext context) { var buildProperties = new Dictionary(); + buildProperties[ManifestFilePropertyKeys.OperationId] = context.OperationId; + var packageDir = GetPackageDirectory(context); var virtualEnvName = GetVirtualEnvironmentName(context); if (string.IsNullOrEmpty(packageDir)) @@ -105,13 +107,11 @@ public BuildScriptSnippet GenerateBashBuildScriptSnippet(BuildScriptGeneratorCon bool enableCollectStatic = IsCollectStaticEnabled(); - string compressVirtualEnvCommand = null; - string compressedVirtualEnvFileName = null; GetVirtualEnvPackOptions( context, virtualEnvName, - out compressVirtualEnvCommand, - out compressedVirtualEnvFileName); + out var compressVirtualEnvCommand, + out var compressedVirtualEnvFileName); if (!string.IsNullOrWhiteSpace(compressedVirtualEnvFileName)) { diff --git a/src/BuildScriptGeneratorCli/BuildScriptGenerator.cs b/src/BuildScriptGeneratorCli/BuildScriptGenerator.cs index 75b74291fb..5d0cd24b05 100644 --- a/src/BuildScriptGeneratorCli/BuildScriptGenerator.cs +++ b/src/BuildScriptGeneratorCli/BuildScriptGenerator.cs @@ -20,25 +20,30 @@ internal class BuildScriptGenerator private readonly IConsole _console; private readonly List _checkerMessageSink; private readonly ILogger _logger; + private readonly string _operationId; public BuildScriptGenerator( IServiceProvider serviceProvider, IConsole console, - List checkerMessageSink) + List checkerMessageSink, + string operationId) { _console = console; _serviceProvider = serviceProvider; _checkerMessageSink = checkerMessageSink; _logger = _serviceProvider.GetRequiredService>(); + _operationId = operationId; } public static BuildScriptGeneratorContext CreateContext( BuildScriptGeneratorOptions options, CliEnvironmentSettings envSettings, - ISourceRepo sourceRepo) + ISourceRepo sourceRepo, + string operationId) { return new BuildScriptGeneratorContext { + OperationId = operationId, SourceRepo = sourceRepo, Language = options.Language, LanguageVersion = options.LanguageVersion, @@ -63,7 +68,7 @@ public bool TryGenerateScript(out string generatedScript) var sourceRepoProvider = _serviceProvider.GetRequiredService(); var environment = _serviceProvider.GetRequiredService(); var sourceRepo = sourceRepoProvider.GetSourceRepo(); - var scriptGenCtx = CreateContext(options, environment, sourceRepo); + var scriptGenCtx = CreateContext(options, environment, sourceRepo, _operationId); scriptGen.GenerateBashScript(scriptGenCtx, out generatedScript, _checkerMessageSink); return true; diff --git a/src/BuildScriptGeneratorCli/Commands/BuildCommand.cs b/src/BuildScriptGeneratorCli/Commands/BuildCommand.cs index 731870d0b5..5ba8d663f8 100644 --- a/src/BuildScriptGeneratorCli/Commands/BuildCommand.cs +++ b/src/BuildScriptGeneratorCli/Commands/BuildCommand.cs @@ -7,7 +7,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.Linq; using System.Text; using JetBrains.Annotations; using McMaster.Extensions.CommandLineUtils; @@ -96,7 +95,7 @@ internal int Execute( DataReceivedEventHandler stdErrHandler) { var logger = serviceProvider.GetRequiredService>(); - var buildOpId = logger.StartOperation( + var buildOperationId = logger.StartOperation( BuildOperationName(serviceProvider.GetRequiredService())); var options = serviceProvider.GetRequiredService>().Value; @@ -107,7 +106,7 @@ internal int Execute( var buildInfo = new DefinitionListFormatter(); buildInfo.AddDefinition("Oryx Version", $"{Program.GetVersion()}, Commit: {Program.GetCommit()}"); - buildInfo.AddDefinition("Build Operation ID", buildOpId); + buildInfo.AddDefinition("Build Operation ID", buildOperationId); var sourceRepo = serviceProvider.GetRequiredService().GetSourceRepo(); var commitId = GetSourceRepoCommitId( @@ -121,21 +120,6 @@ internal int Execute( console.WriteLine(buildInfo.ToString()); - // Try writing the ID to a file in the source directory - try - { - using (logger.LogTimedEvent("WriteBuildIdFile")) - using (var idFileWriter = new StreamWriter( - Path.Combine(sourceRepo.RootPath, Common.FilePaths.BuildIdFileName))) - { - idFileWriter.Write(buildOpId); - } - } - catch (Exception exc) - { - logger.LogError(exc, "Exception caught while trying to write build ID file"); - } - var environmentSettingsProvider = serviceProvider.GetRequiredService(); if (!environmentSettingsProvider.TryGetAndLoadSettings(out var environmentSettings)) { @@ -147,7 +131,8 @@ internal int Execute( using (var stopwatch = logger.LogTimedEvent("GenerateBuildScript")) { var checkerMessages = new List(); - var scriptGenerator = new BuildScriptGenerator(serviceProvider, console, checkerMessages); + var scriptGenerator = new BuildScriptGenerator( + serviceProvider, console, checkerMessages, buildOperationId); var generated = scriptGenerator.TryGenerateScript(out scriptContent); stopwatch.AddProperty("generateSucceeded", generated.ToString()); diff --git a/src/BuildScriptGeneratorCli/Commands/BuildScriptCommand.cs b/src/BuildScriptGeneratorCli/Commands/BuildScriptCommand.cs index 2a6089f17d..37a43d3eea 100644 --- a/src/BuildScriptGeneratorCli/Commands/BuildScriptCommand.cs +++ b/src/BuildScriptGeneratorCli/Commands/BuildScriptCommand.cs @@ -4,7 +4,6 @@ // -------------------------------------------------------------------------------------------- using System; -using System.Collections.Generic; using System.IO; using McMaster.Extensions.CommandLineUtils; using Microsoft.Extensions.DependencyInjection; @@ -40,7 +39,11 @@ internal class BuildScriptCommand : CommandBase internal override int Execute(IServiceProvider serviceProvider, IConsole console) { - var scriptGenerator = new BuildScriptGenerator(serviceProvider, console, checkerMessageSink: null); + var scriptGenerator = new BuildScriptGenerator( + serviceProvider, + console, + checkerMessageSink: null, + operationId: null); if (!scriptGenerator.TryGenerateScript(out var generatedScript)) { diff --git a/src/BuildScriptGeneratorCli/Commands/BuildpackDetectCommand.cs b/src/BuildScriptGeneratorCli/Commands/BuildpackDetectCommand.cs index 5f641cf97b..c1e7e9fa83 100644 --- a/src/BuildScriptGeneratorCli/Commands/BuildpackDetectCommand.cs +++ b/src/BuildScriptGeneratorCli/Commands/BuildpackDetectCommand.cs @@ -91,7 +91,7 @@ internal override int Execute(IServiceProvider serviceProvider, IConsole console var env = serviceProvider.GetRequiredService(); var repo = serviceProvider.GetRequiredService().GetSourceRepo(); - var ctx = BuildScriptGenerator.CreateContext(options, env, repo); + var ctx = BuildScriptGenerator.CreateContext(options, env, repo, operationId: null); var compatPlats = generator.GetCompatiblePlatforms(ctx); if (compatPlats != null && compatPlats.Any()) diff --git a/src/Common/FilePaths.cs b/src/Common/FilePaths.cs index ea92eefa09..449528e0ee 100644 --- a/src/Common/FilePaths.cs +++ b/src/Common/FilePaths.cs @@ -4,6 +4,6 @@ namespace Microsoft.Oryx.Common { public static class FilePaths { - public const string BuildIdFileName = ".oryx_build_id"; + public const string BuildManifestFileName = "oryx-manifest.toml"; } } \ No newline at end of file diff --git a/src/startupscriptgenerator/common/buildManifestHelper.go b/src/startupscriptgenerator/common/buildManifestHelper.go index fe36733705..b1ad7f6bb2 100644 --- a/src/startupscriptgenerator/common/buildManifestHelper.go +++ b/src/startupscriptgenerator/common/buildManifestHelper.go @@ -6,17 +6,20 @@ package common import ( + "startupscriptgenerator/common/consts" "github.com/BurntSushi/toml" "log" "path/filepath" ) type BuildManifest struct { - StartupFileName string - ZipAllOutput string + StartupFileName string + ZipAllOutput string + OperationId string } -const ManifestFileName = "oryx-manifest.toml" +var _buildManifest = BuildManifest{} +var _readManifest = false func DeserializeBuildManifest(manifestFile string) BuildManifest { var manifest BuildManifest @@ -27,11 +30,15 @@ func DeserializeBuildManifest(manifestFile string) BuildManifest { } func GetBuildManifest(appPath string) BuildManifest { - buildManifest := BuildManifest{} + if _readManifest { + return _buildManifest + } - tomlFile := filepath.Join(appPath, ManifestFileName) + tomlFile := filepath.Join(appPath, consts.BuildManifestFileName) if FileExists(tomlFile) { - buildManifest = DeserializeBuildManifest(tomlFile) + _buildManifest = DeserializeBuildManifest(tomlFile) + _readManifest = true } - return buildManifest + + return _buildManifest } \ No newline at end of file diff --git a/src/startupscriptgenerator/common/consts/file_paths.go b/src/startupscriptgenerator/common/consts/file_paths.go index 68c21a009a..30b07c296a 100644 --- a/src/startupscriptgenerator/common/consts/file_paths.go +++ b/src/startupscriptgenerator/common/consts/file_paths.go @@ -2,4 +2,4 @@ package consts -const BuildIdFileName string = ".oryx_build_id" +const BuildManifestFileName string = "oryx-manifest.toml" diff --git a/src/startupscriptgenerator/common/logging.go b/src/startupscriptgenerator/common/logging.go index f15b3571fc..005daccad0 100644 --- a/src/startupscriptgenerator/common/logging.go +++ b/src/startupscriptgenerator/common/logging.go @@ -7,9 +7,7 @@ package common import ( "fmt" - "io/ioutil" "os" - "path" "startupscriptgenerator/common/consts" "strings" "time" @@ -32,12 +30,12 @@ type Logger struct { var buildOpId string func SetGlobalOperationId(appRootPath string) { - if buildOpId == "" { - rawId, err := ioutil.ReadFile(path.Join(appRootPath, consts.BuildIdFileName)) - if err == nil { // Silently ignore errors - buildOpId = strings.TrimSpace(string(rawId)) - } + buildManifest := GetBuildManifest(appRootPath) + + if buildManifest.OperationId != "" { + buildOpId = strings.TrimSpace(buildManifest.OperationId) } + fmt.Println("Build Operation ID: " + buildOpId) } func GetLogger(name string) *Logger { diff --git a/src/startupscriptgenerator/node/scriptgenerator.go b/src/startupscriptgenerator/node/scriptgenerator.go index 92ceb88233..ddc3c038da 100644 --- a/src/startupscriptgenerator/node/scriptgenerator.go +++ b/src/startupscriptgenerator/node/scriptgenerator.go @@ -48,14 +48,13 @@ func (gen *NodeStartupScriptGenerator) GenerateEntrypointScript() string { logger.LogInformation("Generating script for source at '%s'", gen.SourcePath) - const oryxManifestFile string = "oryx-manifest.toml" scriptBuilder := strings.Builder{} scriptBuilder.WriteString("#!/bin/sh\n") scriptBuilder.WriteString("\n# Enter the source directory to make sure the script runs where the user expects\n") scriptBuilder.WriteString("cd " + gen.SourcePath + "\n\n") - scriptBuilder.WriteString("if [ -f ./" + oryxManifestFile + " ]; then\n") - scriptBuilder.WriteString(" echo \"Found '" + oryxManifestFile + "'\"\n") - scriptBuilder.WriteString(" . ./" + oryxManifestFile + "\n") + scriptBuilder.WriteString("if [ -f ./" + consts.BuildManifestFileName + " ]; then\n") + scriptBuilder.WriteString(" echo \"Found '" + consts.BuildManifestFileName + "'\"\n") + scriptBuilder.WriteString(" . ./" + consts.BuildManifestFileName + "\n") scriptBuilder.WriteString("fi\n\n") diff --git a/src/startupscriptgenerator/python/scriptgenerator.go b/src/startupscriptgenerator/python/scriptgenerator.go index e8cf158efd..21e585d7af 100644 --- a/src/startupscriptgenerator/python/scriptgenerator.go +++ b/src/startupscriptgenerator/python/scriptgenerator.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "path/filepath" "startupscriptgenerator/common" + "startupscriptgenerator/common/consts" "strings" ) @@ -92,13 +93,12 @@ func logReadDirError(logger *common.Logger, path string, err error) { // Builds the commands to setup the Python packages, using virtual env or a package folder. func (gen *PythonStartupScriptGenerator) getPackageSetupCommand() string { scriptBuilder := strings.Builder{} - const buildManifestFile string = "oryx-manifest.toml" - manifesFilePath := filepath.Join(gen.SourcePath, buildManifestFile) + manifesFilePath := filepath.Join(gen.SourcePath, consts.BuildManifestFileName) // If a manifest file is present, it takes precedence. if common.FileExists(manifesFilePath) { virtualEnvVarPath := filepath.Join(gen.SourcePath, "$virtualEnvName") - scriptBuilder.WriteString("echo \"Using '" + buildManifestFile + "'.\"\n") - scriptBuilder.WriteString(". ./" + buildManifestFile + "\n") + scriptBuilder.WriteString("echo \"Using '" + consts.BuildManifestFileName + "'.\"\n") + scriptBuilder.WriteString(". ./" + consts.BuildManifestFileName + "\n") if !gen.SkipVirtualEnvExtraction { scriptBuilder.WriteString("echo \"Checking if virtual environment was compressed...\"\n") diff --git a/tests/Oryx.BuildImage.Tests/DotNetCoreSampleAppsTest.cs b/tests/Oryx.BuildImage.Tests/DotNetCoreSampleAppsTest.cs index 1fefcfabe8..a6786d798b 100644 --- a/tests/Oryx.BuildImage.Tests/DotNetCoreSampleAppsTest.cs +++ b/tests/Oryx.BuildImage.Tests/DotNetCoreSampleAppsTest.cs @@ -40,7 +40,7 @@ public void Builds_NetCore10App_UsingNetCore11_DotnetSdkVersion() var script = new ShellScriptBuilder() .AddBuildCommand($"{appDir} -o {appOutputDir}") .AddFileExistsCheck($"{appOutputDir}/app.dll") - .AddFileExistsCheck($"{appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") + .AddFileExistsCheck($"{appOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act @@ -76,7 +76,7 @@ public void Builds_NetCore11App_UsingNetCore11_DotnetSdkVersion() var script = new ShellScriptBuilder() .AddBuildCommand($"{appDir} -o {appOutputDir}") .AddFileExistsCheck($"{appOutputDir}/{appName}.dll") - .AddFileExistsCheck($"{appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") + .AddFileExistsCheck($"{appOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act @@ -147,7 +147,7 @@ public void Builds_NetCore20App_UsingNetCore21_DotnetSdkVersion() var script = new ShellScriptBuilder() .AddBuildCommand($"{appDir} -o {appOutputDir}") .AddFileExistsCheck($"{appOutputDir}/app.dll") - .AddFileExistsCheck($"{appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") + .AddFileExistsCheck($"{appOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act diff --git a/tests/Oryx.BuildImage.Tests/NodeJSSampleAppsTest.cs b/tests/Oryx.BuildImage.Tests/NodeJSSampleAppsTest.cs index 2572e302d5..ca9ab0f21b 100644 --- a/tests/Oryx.BuildImage.Tests/NodeJSSampleAppsTest.cs +++ b/tests/Oryx.BuildImage.Tests/NodeJSSampleAppsTest.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.IO; using System.Runtime.InteropServices; +using Microsoft.Oryx.BuildScriptGenerator.Node; using Microsoft.Oryx.Common; using Microsoft.Oryx.Tests.Common; using Xunit; @@ -141,12 +142,13 @@ public void BuildNodeApp_ConfigureAppInsights__WithDefaultNodeVersion_AIEnvironm var appDir = volume.ContainerDir; var nestedOutputDir = "/tmp/output"; var script = new ShellScriptBuilder() - .AddCommand("printenv") - .AddCommand($"oryx build {appDir} -o {nestedOutputDir} --log-file {appDir}/1.log") + .AddCommand($"oryx build {appDir} -o {nestedOutputDir}") .AddDirectoryExistsCheck($"{nestedOutputDir}/node_modules") .AddFileExistsCheck($"{nestedOutputDir}/oryx-appinsightsloader.js") - .AddFileExistsCheck($"{nestedOutputDir}/oryx-manifest.toml") - .AddStringExistsInFileCheck("injectedAppInsights=\"True\"", $"{nestedOutputDir}/oryx-manifest.toml") + .AddFileExistsCheck($"{nestedOutputDir}/{FilePaths.BuildManifestFileName}") + .AddStringExistsInFileCheck( + $"{NodeConstants.InjectedAppInsights}=\"True\"", + $"{nestedOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act @@ -233,7 +235,7 @@ private ShellScriptBuilder SetupEnvironment_ErrorDetectingNodeTest( .CreateFile($"{appDir}/1.log", "hello1") .CreateFile($"{appDir}/app2/2.log", "hello2") .CreateFile($"{appDir}/app2/app3/3.log", "hello3") - .CreateFile($"{appDir}/idea.js", nodeCode) + .CreateFile($"{appDir}/idea.js", $"\"{nodeCode}\"") .AddBuildCommand($"{appDir} -o {appOutputDir} --log-file {logFile}"); return script; @@ -639,7 +641,7 @@ public void BuildsNodeApp_AndZipsNodeModules_IfCompressNodeModulesIsZip() .AddDirectoryDoesNotExistCheck($"{appOutputDir}/node_modules") .AddStringExistsInFileCheck( "compressedNodeModulesFile=\"node_modules.zip\"", - $"{appOutputDir}/oryx-manifest.toml") + $"{appOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act @@ -713,8 +715,10 @@ public void BuildNodeApp_ConfigureAppInsights_WithCorrectNodeVersion_AIEnvironme $"oryx build {appDir} -o {nestedOutputDir} {spcifyNodeVersionCommand} --log-file {appDir}/1.log") .AddDirectoryExistsCheck($"{nestedOutputDir}/node_modules") .AddFileExistsCheck($"{nestedOutputDir}/oryx-appinsightsloader.js") - .AddFileExistsCheck($"{nestedOutputDir}/oryx-manifest.toml") - .AddStringExistsInFileCheck("injectedAppInsights=\"True\"", $"{nestedOutputDir}/oryx-manifest.toml") + .AddFileExistsCheck($"{nestedOutputDir}/{FilePaths.BuildManifestFileName}") + .AddStringExistsInFileCheck( + $"{NodeConstants.InjectedAppInsights}=\"True\"", + $"{nestedOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act @@ -762,7 +766,9 @@ public void BuildNodeApp_DoesNotConfigureAppInsights_WithWrongNodeVersion_AIEnvi $"oryx build {appDir} -o {nestedOutputDir} {spcifyNodeVersionCommand} --log-file {appDir}/1.log") .AddDirectoryExistsCheck($"{nestedOutputDir}/node_modules") .AddFileDoesNotExistCheck($"{nestedOutputDir}/oryx-appinsightsloader.js") - .AddFileDoesNotExistCheck($"{nestedOutputDir}/oryx-manifest.toml") + .AddStringDoesNotExistInFileCheck( + NodeConstants.InjectedAppInsights, + $"{nestedOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act @@ -810,7 +816,8 @@ public void BuildNodeApp_DoesNotConfigureAppInsights_WithCorrectNodeVersion_AIEn $"oryx build {appDir} -o {nestedOutputDir} {spcifyNodeVersionCommand} --log-file {appDir}/1.log") .AddDirectoryExistsCheck($"{nestedOutputDir}/node_modules") .AddFileDoesNotExistCheck($"{nestedOutputDir}/oryx-appinsightsloader.js") - .AddFileDoesNotExistCheck($"{nestedOutputDir}/oryx-manifest.toml") + .AddStringDoesNotExistInFileCheck( + NodeConstants.InjectedAppInsights, $"{nestedOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); // Act diff --git a/tests/Oryx.BuildImage.Tests/Oryx.BuildImage.Tests.csproj b/tests/Oryx.BuildImage.Tests/Oryx.BuildImage.Tests.csproj index 638dcba818..b4d7588cd8 100644 --- a/tests/Oryx.BuildImage.Tests/Oryx.BuildImage.Tests.csproj +++ b/tests/Oryx.BuildImage.Tests/Oryx.BuildImage.Tests.csproj @@ -5,6 +5,9 @@ netcoreapp2.1 false false + ..\..\build\TestAssembliesKey.snk + false + true @@ -20,6 +23,7 @@ + diff --git a/tests/Oryx.Integration.Tests/DotNetCoreEndToEndTests.cs b/tests/Oryx.Integration.Tests/DotNetCoreEndToEndTests.cs index b564e2e07c..46c13565b2 100644 --- a/tests/Oryx.Integration.Tests/DotNetCoreEndToEndTests.cs +++ b/tests/Oryx.Integration.Tests/DotNetCoreEndToEndTests.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Microsoft.Oryx.BuildScriptGenerator; using Microsoft.Oryx.BuildScriptGenerator.DotNetCore; +using Microsoft.Oryx.Common; using Microsoft.Oryx.Tests.Common; using Xunit; using Xunit.Abstractions; @@ -303,10 +304,10 @@ public async Task CanRunApp_WithoutBuildManifestFile() var appOutputDir = $"{appDir}/myoutputdir"; var buildImageScript = new ShellScriptBuilder() .AddCommand($"oryx build {appDir} -o {appOutputDir} -l dotnet --language-version {dotnetcoreVersion}") - .AddFileExistsCheck($"{appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") + .AddFileExistsCheck($"{appOutputDir}/{FilePaths.BuildManifestFileName}") // NOTE: Delete the manifest file explicitly - .AddCommand($"rm -f {appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") - .AddFileDoesNotExistCheck($"{appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") + .AddCommand($"rm -f {appOutputDir}/{FilePaths.BuildManifestFileName}") + .AddFileDoesNotExistCheck($"{appOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); var runtimeImageScript = new ShellScriptBuilder() .AddCommand( @@ -350,10 +351,10 @@ public async Task CanRunApp_NetCore21WebApp_NetCoreApp21WithExplicitAssemblyName var appOutputDir = $"{appDir}/myoutputdir"; var buildImageScript = new ShellScriptBuilder() .AddCommand($"oryx build {appDir} -o {appOutputDir} -l dotnet --language-version {dotnetcoreVersion}") - .AddFileExistsCheck($"{appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") + .AddFileExistsCheck($"{appOutputDir}/{FilePaths.BuildManifestFileName}") // NOTE: Delete the manifest file explicitly - .AddCommand($"rm -f {appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") - .AddFileDoesNotExistCheck($"{appOutputDir}/{ScriptGenerator.Constants.ManifestFileName}") + .AddCommand($"rm -f {appOutputDir}/{FilePaths.BuildManifestFileName}") + .AddFileDoesNotExistCheck($"{appOutputDir}/{FilePaths.BuildManifestFileName}") .ToString(); var runtimeImageScript = new ShellScriptBuilder() .AddCommand( diff --git a/tests/Oryx.Integration.Tests/NodeEndToEndTests.cs b/tests/Oryx.Integration.Tests/NodeEndToEndTests.cs index 4a556cc366..b41f9677ea 100644 --- a/tests/Oryx.Integration.Tests/NodeEndToEndTests.cs +++ b/tests/Oryx.Integration.Tests/NodeEndToEndTests.cs @@ -7,6 +7,8 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.Oryx.BuildScriptGenerator.Node; +using Microsoft.Oryx.Common; using Microsoft.Oryx.Tests.Common; using Xunit; using Xunit.Abstractions; @@ -258,7 +260,7 @@ public async Task CanBuildAndRun_NodeApp_WithBuildpack() var appName = "webfrontend"; var appVolume = CreateAppVolume(appName); // Allows `pack` to use the host's Docker engine - var dockerPort = DockerVolume.Create("/var/run/docker.sock", "/var/run/docker.sock"); + var dockerPort = DockerVolume.DockerDaemonSocket; var appImageName = "testnodeapp"; // Act @@ -836,8 +838,9 @@ public async Task CanBuildAndRun_NodeApp_WithAppInsights_Configured(string nodeV .AddCommand($"oryx build {appDir} -o {appDir} {spcifyNodeVersionCommand} --log-file {appDir}/1.log") .AddDirectoryExistsCheck($"{appDir}/node_modules") .AddFileExistsCheck($"{appDir}/oryx-appinsightsloader.js") - .AddFileExistsCheck($"{appDir}/oryx-manifest.toml") - .AddStringExistsInFileCheck("injectedAppInsights=\"True\"", $"{appDir}/oryx-manifest.toml") + .AddFileExistsCheck($"{appDir}/{FilePaths.BuildManifestFileName}") + .AddStringExistsInFileCheck( + $"{NodeConstants.InjectedAppInsights}=\"True\"", $"{appDir}/{FilePaths.BuildManifestFileName}") .ToString(); var runScript = new ShellScriptBuilder() @@ -846,8 +849,10 @@ public async Task CanBuildAndRun_NodeApp_WithAppInsights_Configured(string nodeV .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}") .AddCommand(DefaultStartupFilePath) .AddFileExistsCheck($"{appDir}/oryx-appinsightsloader.js") - .AddFileExistsCheck($"{appDir}/oryx-manifest.toml") - .AddStringExistsInFileCheck("injectedAppInsights=\"True\"", $"{appDir}/oryx-manifest.toml") + .AddFileExistsCheck($"{appDir}/{FilePaths.BuildManifestFileName}") + .AddStringExistsInFileCheck( + $"{NodeConstants.InjectedAppInsights}=\"True\"", + $"{appDir}/{FilePaths.BuildManifestFileName}") .ToString(); await EndToEndTestHelper.BuildRunAndAssertAppAsync( diff --git a/tests/Oryx.Integration.Tests/Oryx.Integration.Tests.csproj b/tests/Oryx.Integration.Tests/Oryx.Integration.Tests.csproj index aca6bf8262..0656ef7aa1 100644 --- a/tests/Oryx.Integration.Tests/Oryx.Integration.Tests.csproj +++ b/tests/Oryx.Integration.Tests/Oryx.Integration.Tests.csproj @@ -5,6 +5,9 @@ 7.3 false false + ..\..\build\TestAssembliesKey.snk + false + true @@ -17,6 +20,7 @@ + diff --git a/tests/Oryx.RuntimeImage.Tests/NodeImagesTest.cs b/tests/Oryx.RuntimeImage.Tests/NodeImagesTest.cs index 0d1d7113e6..67eb4bbabf 100644 --- a/tests/Oryx.RuntimeImage.Tests/NodeImagesTest.cs +++ b/tests/Oryx.RuntimeImage.Tests/NodeImagesTest.cs @@ -8,6 +8,8 @@ using System.IO; using System.Net.Http; using System.Threading.Tasks; +using Microsoft.Oryx.BuildScriptGenerator.Node; +using Microsoft.Oryx.Common; using Microsoft.Oryx.Tests.Common; using Xunit; using Xunit.Abstractions; @@ -147,13 +149,13 @@ public void GeneratedScript_CanRunStartupScripts_WithAppInsightsConfigured() console.error(e); } }"; - var manifestFileContent = "injectedAppInsight=\"True\""; + var manifestFileContent = $"'{NodeConstants.InjectedAppInsights}=\"True\"'"; var script = new ShellScriptBuilder() .CreateDirectory(appPath) - .CreateFile(appPath + "/entry.sh", $"exit {exitCodeSentinel}") - .CreateFile(appPath + "/oryx-manifest.toml", manifestFileContent) - .CreateFile(appPath + "/oryx-appinsightsloader.js", aiNodesdkLoaderContent) + .CreateFile($"{appPath}/entry.sh", $"exit {exitCodeSentinel}") + .CreateFile($"{appPath}/{FilePaths.BuildManifestFileName}", manifestFileContent) + .CreateFile($"{appPath}/oryx-appinsightsloader.js", $"\"{aiNodesdkLoaderContent}\"") .AddCommand("oryx -userStartupCommand entry.sh -appPath " + appPath) .AddCommand(". ./run.sh") // Source the default output path .AddStringExistsInFileCheck("export NODE_OPTIONS='--require ./oryx-appinsightsloader.js'", "./run.sh") @@ -234,11 +236,12 @@ public async Task GeneratesScript_CanRun_AppInsightsModule_NotFound(string nodeV // and additionally print the exception message // Arrange - var imageName = string.Concat("oryxdevms/node-", nodeVersion); - var hostSamplesDir = Path.Combine(Directory.GetCurrentDirectory(), "SampleApps"); - var volume = DockerVolume.CreateMirror(Path.Combine(hostSamplesDir, "nodejs", "linxnodeexpress")); + var appName = "linxnodeexpress"; + var hostDir = Path.Combine(_hostSamplesDir, "nodejs", appName); + var volume = DockerVolume.CreateMirror(hostDir); var appDir = volume.ContainerDir; - var manifestFileContent = "injectedAppInsight=\"True\""; + var imageName = string.Concat("oryxdevms/node-", nodeVersion); + var manifestFileContent = $"'{NodeConstants.InjectedAppInsights}=\"True\"'"; var aiNodesdkLoaderContent = @"try { var appInsights = require('applicationinsights'); if (process.env.APPINSIGHTS_INSTRUMENTATIONKEY) @@ -252,8 +255,8 @@ public async Task GeneratesScript_CanRun_AppInsightsModule_NotFound(string nodeV int containerDebugPort = 8080; var script = new ShellScriptBuilder() - .CreateFile(appDir + "/oryx-manifest.toml", manifestFileContent) - .CreateFile(appDir + "/oryx-appinsightsloader.js", aiNodesdkLoaderContent) + .CreateFile($"{appDir}/{FilePaths.BuildManifestFileName}", manifestFileContent) + .CreateFile($"{appDir}/oryx-appinsightsloader.js", $"\"{aiNodesdkLoaderContent}\"") .AddCommand($"cd {appDir}") .AddCommand("npm install") .AddCommand($"oryx -appPath {appDir}") diff --git a/tests/Oryx.RuntimeImage.Tests/Oryx.RuntimeImage.Tests.csproj b/tests/Oryx.RuntimeImage.Tests/Oryx.RuntimeImage.Tests.csproj index b019c404a6..fc65c15818 100644 --- a/tests/Oryx.RuntimeImage.Tests/Oryx.RuntimeImage.Tests.csproj +++ b/tests/Oryx.RuntimeImage.Tests/Oryx.RuntimeImage.Tests.csproj @@ -5,6 +5,9 @@ 7.3 false false + ..\..\build\TestAssembliesKey.snk + false + true @@ -20,6 +23,7 @@ + diff --git a/tests/Oryx.Tests.Common/DockerVolume.cs b/tests/Oryx.Tests.Common/DockerVolume.cs index 5d83575ee6..cd805d30f8 100644 --- a/tests/Oryx.Tests.Common/DockerVolume.cs +++ b/tests/Oryx.Tests.Common/DockerVolume.cs @@ -7,13 +7,18 @@ using System.IO; using System.Reflection; using System.Runtime.InteropServices; -using JetBrains.Annotations; using Microsoft.Oryx.Common; namespace Microsoft.Oryx.Tests.Common { public class DockerVolume { + private const string DockerSocket = "/var/run/docker.sock"; + public static readonly DockerVolume DockerDaemonSocket = new DockerVolume( + originalHostDir: null, + mountedHostDir: DockerSocket, + containerDir: DockerSocket); + // VSTS variable used to identify if the tests are running in VSTS or not (for example, on dev machines) public const string VstsAgentNameEnivronmentVariable = "AGENT_NAME"; @@ -42,30 +47,25 @@ private DockerVolume(string originalHostDir, string mountedHostDir, string conta /// public string ContainerDir { get; } - public static DockerVolume Create([NotNull] string hostPath, [NotNull] string containerPath) - { - if (string.IsNullOrEmpty(hostPath) && !Directory.Exists(hostPath) && !File.Exists(hostPath)) - { - throw new ArgumentException($"'{nameof(hostPath)}' must point to an existing directory or file."); - } - - return new DockerVolume(null, hostPath, containerPath); - } - /// /// Creates a copy of a local directory, and returns a DockerVolume instance for mounting that copy in a /// container. /// - /// local directory to be used in a container + /// local directory to be used in a container /// DockerVolume instance that can be used to mount the new copy of `originalDir`. - public static DockerVolume CreateMirror(string originalDir) + public static DockerVolume CreateMirror(string hostDir) { - if (string.IsNullOrEmpty(originalDir)) + if (string.IsNullOrEmpty(hostDir)) + { + throw new ArgumentException($"'{nameof(hostDir)}' cannot be null or empty."); + } + + if (!Directory.Exists(hostDir)) { - throw new ArgumentException($"'{nameof(originalDir)}' cannot be null or empty."); + throw new ArgumentException($"'{nameof(hostDir)}' must point to an existing directory."); } - var dirInfo = new DirectoryInfo(originalDir); + var dirInfo = new DirectoryInfo(hostDir); // Copy the host directory to a different location and mount that one as it's always possible that a // single sample app could be tested by different tests and we do not want to modify its original state @@ -94,7 +94,7 @@ public static DockerVolume CreateMirror(string originalDir) tempDirRoot, Guid.NewGuid().ToString("N"), dirInfo.Name); - CopyDirectories(originalDir, writableHostDir, copySubDirs: true); + CopyDirectories(hostDir, writableHostDir, copySubDirs: true); // Grant permissions to the folder we just copied on the host machine. The permisions here allow the // user(a non-root user) in the container to read/write/execute files. @@ -113,7 +113,7 @@ public static DockerVolume CreateMirror(string originalDir) // Note: Path.Combine is the ideal solution here but this would fail when we run the // tests on a windows machine (which most of us use). var containerDir = $"{ContainerDirRoot}/{containerDirName}"; - return new DockerVolume(originalDir, writableHostDir, containerDir); + return new DockerVolume(hostDir, writableHostDir, containerDir); } private static void CopyDirectories(string sourceDirName, string destDirName, bool copySubDirs) diff --git a/tests/Oryx.Tests.Common/Oryx.Tests.Common.csproj b/tests/Oryx.Tests.Common/Oryx.Tests.Common.csproj index 44bb27d8d1..d7c626ad15 100644 --- a/tests/Oryx.Tests.Common/Oryx.Tests.Common.csproj +++ b/tests/Oryx.Tests.Common/Oryx.Tests.Common.csproj @@ -5,6 +5,9 @@ 7.3 Microsoft.Oryx.Tests.Common Microsoft.Oryx.Tests.Common + ..\..\build\TestAssembliesKey.snk + false + true diff --git a/tests/Oryx.Tests.Common/ShellScriptBuilder.cs b/tests/Oryx.Tests.Common/ShellScriptBuilder.cs index 0dab44cdfe..ef2847b0c5 100644 --- a/tests/Oryx.Tests.Common/ShellScriptBuilder.cs +++ b/tests/Oryx.Tests.Common/ShellScriptBuilder.cs @@ -61,7 +61,7 @@ public ShellScriptBuilder CreateDirectory(string directory) public ShellScriptBuilder CreateFile(string file, string content) { - return Append($"echo \"{content}\" > \"{file}\""); + return Append($"echo {content} > \"{file}\""); } public ShellScriptBuilder SetExecutePermissionOnFile(string file) @@ -104,16 +104,16 @@ public ShellScriptBuilder AddFileExistsCheck(string file) public ShellScriptBuilder AddStringExistsInFileCheck(string searchString, string file) { return Append( - $"grep '{searchString}' '{file}' && if [ $? -eq 1 ]; then " + - $"echo '{searchString}' not found 1>&2 && " + + $"if ! grep -q '{searchString}' '{file}'; then " + + $"echo '{searchString}' not found 1>&2; " + "exit 1; fi"); } public ShellScriptBuilder AddStringDoesNotExistInFileCheck(string searchString, string file) { return Append( - $"grep '{searchString}' '{file}' && if [ $? -eq 0 ]; then " + - $"echo '{searchString}' found 1>&2 && " + + $"if grep -q '{searchString}' '{file}'; then " + + $"echo '{searchString}' still found 1>&2; " + "exit 1; fi"); }