public async Task BuildsAndRunsNodeApp_WhenPruneDevDependenciesIsTrue_AndNodeModulesAreCompressed()
        {
            // Arrange
            // Use a separate volume for output due to rsync errors
            var appOutputDirPath = Directory.CreateDirectory(Path.Combine(_tempRootDir, Guid.NewGuid().ToString("N")))
                                   .FullName;
            var nodeVersion        = "10";
            var appOutputDirVolume = DockerVolume.CreateMirror(appOutputDirPath);
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var appName            = "webfrontend";
            var volume             = CreateAppVolume(appName);
            var appDir             = volume.ContainerDir;
            var runAppScript       = new ShellScriptBuilder()
                                     .AddCommand($"oryx create-script -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();
            var buildScript = new ShellScriptBuilder()
                              .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o {appOutputDir} --platform {NodeConstants.PlatformName} " +
                $"--platform-version {nodeVersion} -p {NodePlatform.CompressNodeModulesPropertyKey}=zip" +
                $" -p {NodePlatform.PruneDevDependenciesPropertyKey}=true")
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                appOutputDirVolume, volume
            }, Settings.LtsVersionsBuildImageName,
                "/bin/bash",
                new[] { "-c", buildScript },
                _imageHelper.GetRuntimeImage("node", nodeVersion),
                ContainerPort,
                "/bin/sh",
                new[] { "-c", runAppScript },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Say It Again", data);
            });
        }
Ejemplo n.º 2
0
        public async Task CanBuildAndRun_NetCore31WebApp()
        {
            // Arrange
            var dotnetcoreVersion = "3.1";
            var hostDir           = Path.Combine(_hostSamplesDir, "DotNetCore", NetCoreApp31MvcApp);
            var volume            = DockerVolume.CreateMirror(hostDir);
            var appDir            = volume.ContainerDir;
            var appOutputDir      = $"{appDir}/myoutputdir";
            var buildImageScript  = new ShellScriptBuilder()
                                    .AddCommand($"oryx build {appDir} --platform dotnet --language-version {dotnetcoreVersion} -o {appOutputDir}")
                                    .ToString();
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand(
                $"oryx -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                NetCoreApp30WebApp,
                _output,
                volume,
                "/bin/sh",
                new[]
            {
                "-c",
                buildImageScript
            },
                _imageHelper.GetTestRuntimeImage("dotnetcore", dotnetcoreVersion),
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Welcome to ASP.NET Core MVC!", data);
            });
        }
        public async Task CanBuildAndRun_NetCoreApp10WebApp()
        {
            // Arrange
            var dotNetCoreVersion = "1.0";
            var hostDir           = Path.Combine(_hostSamplesDir, "DotNetCore", "aspnetcore10");
            var volume            = DockerVolume.CreateMirror(hostDir);
            var appDir            = volume.ContainerDir;
            var appOutputDir      = $"{appDir}/myoutputdir";
            var buildImageScript  = new ShellScriptBuilder()
                                    .AddCommand($"oryx build {appDir} --platform dotnet --language-version {dotNetCoreVersion} -o {appOutputDir}")
                                    .ToString();
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand(
                $"oryx -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                NetCoreApp11WebApp,
                _output,
                volume,
                "/bin/sh",
                new[]
            {
                "-c",
                buildImageScript
            },
                $"oryxdevmcr.azurecr.io/public/oryx/dotnetcore-{dotNetCoreVersion}",
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
Ejemplo n.º 4
0
        public void CanBuildVuePressSampleAppWithPruneDevDependencies()
        {
            // Arrange
            var appName = "vuepress";
            var volume  = DockerVolume.CreateMirror(Path.Combine(_hostSamplesDir, "nodejs", appName));
            // Make sure 'vuepress' package is in 'dependencies' node because that is what triggered the original issue
            var     packageJsonContent = File.ReadAllText(Path.Combine(volume.OriginalHostDir, "package.json"));
            dynamic packageJson        = JsonConvert.DeserializeObject(packageJsonContent);

            Assert.NotNull(packageJson);
            Assert.NotNull(packageJson.dependencies);
            Assert.NotNull(packageJson.dependencies.vuepress);
            Assert.Null(packageJson.devDependencies);

            var appDir       = volume.ContainerDir;
            var appOutputDir = "/tmp/vuepress-output";
            var script       = new ShellScriptBuilder()
                               .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o {appOutputDir} -p {NodePlatform.PruneDevDependenciesPropertyKey}")
                               .AddDirectoryExistsCheck($"{appOutputDir}/node_modules/vuepress")
                               .ToString();

            // Act
            var result = _dockerCli.Run(new DockerRunArguments
            {
                ImageId = Settings.LtsVersionsBuildImageName,
                Volumes = new List <DockerVolume> {
                    volume
                },
                CommandToExecuteOnRun = "/bin/bash",
                CommandArguments      = new[] { "-c", script }
            });

            // Assert
            RunAsserts(
                () =>
            {
                Assert.True(result.IsSuccess);
            },
                result.GetDebugInfo());
        }
Ejemplo n.º 5
0
        public async Task CanBuildAndRun_NetCore21WebApp_HavingMultipleProjects()
        {
            // Arrange
            var appName           = "NetCoreApp22MultiProjectApp";
            var dotnetcoreVersion = "2.2";
            var hostDir           = Path.Combine(_hostSamplesDir, "DotNetCore", appName);
            var volume            = DockerVolume.CreateMirror(hostDir);
            var repoDir           = volume.ContainerDir;
            var appOutputDir      = $"{repoDir}/myoutputdir";
            var buildImageScript  = new ShellScriptBuilder()
                                    .AddCommand($"oryx build {repoDir} -o {appOutputDir}")
                                    .ToString();
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand($"oryx create-script -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "/bin/sh",
                new[]
            {
                "-c",
                buildImageScript
            },
                _imageHelper.GetRuntimeImage("dotnetcore", dotnetcoreVersion),
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
Ejemplo n.º 6
0
        public async Task NodeApp_MicrosoftSqlServerDB()
        {
            // Arrange
            var appName = "node-mssql";
            var hostDir = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume  = DockerVolume.CreateMirror(hostDir);
            var appDir  = volume.ContainerDir;
            var script  = new ShellScriptBuilder()
                          .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                          .AddCommand(DefaultStartupFilePath)
                          .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                volume
            },
                Settings.BuildImageName,
                "oryx",
                new[] { "build", appDir, "-l", "nodejs", "--language-version", "10.14" },
                "oryxdevms/node-10.14",
                GetEnvironmentVariables(),
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Equal(
                    DbContainerFixtureBase.GetSampleDataAsJson(),
                    data.Trim(),
                    ignoreLineEndingDifferences: true,
                    ignoreWhiteSpaceDifferences: true);
            });
        }
Ejemplo n.º 7
0
        public async Task Python37App_MicrosoftSqlServerDB(string imageTag)
        {
            // Arrange
            var appName = "mssqlserver-sample";
            var hostDir = Path.Combine(_hostSamplesDir, "python", appName);
            var volume  = DockerVolume.CreateMirror(hostDir);
            var appDir  = volume.ContainerDir;
            var script  = new ShellScriptBuilder()
                          .AddCommand($"oryx create-script -appPath {appDir} -bindPort {ContainerPort}")
                          .AddCommand(DefaultStartupFilePath)
                          .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                volume
            },
                _imageHelper.GetBuildImage(imageTag),
                "oryx",
                new[] { "build", appDir, "--platform", "python", "--platform-version", "3.7" },
                _imageHelper.GetRuntimeImage("python", "3.7"),
                SqlServerDbTestHelper.GetEnvironmentVariables(),
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Equal(
                    DbContainerFixtureBase.GetSampleDataAsJson(),
                    data.Trim(),
                    ignoreLineEndingDifferences: true,
                    ignoreWhiteSpaceDifferences: true);
            });
        }
Ejemplo n.º 8
0
        public async Task CanBuildAndRun_NodeExpressApp_UsingSingleImage_AndCustomStartupCommandOnly()
        {
            // Arrange
            var       appName     = "linxnodeexpress";
            var       nodeVersion = "10";
            var       hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var       volume      = DockerVolume.Create(hostDir);
            var       appDir      = volume.ContainerDir;
            const int localPort   = 8080;
            var       portMapping = $"{HostPort}:{localPort}";

            // Create a custom startup command
            const string customStartupScriptCommand = "'npm start'";

            var runScript = new ShellScriptBuilder()
                            .AddCommand($"cd {appDir}")
                            .AddCommand($"oryx run-script --appPath {appDir} --platform nodejs --platform-version {nodeVersion} --userStartupCommand {customStartupScriptCommand} --debug")
                            .AddCommand(DefaultStartupFilePath)
                            .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName : appName,
                output : _output,
                volume : volume,
                buildCmd : "oryx",
                buildArgs : new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                runtimeImageName : $"oryxdevms/build",
                portMapping : portMapping,
                runCmd : "/bin/sh",
                runArgs : new[]
            {
                "-c",
                runScript
            },
                assertAction : async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Equal("Hello World from express!", data);
            });
        }
        public async Task CanRunApp_UsingPreRunCommand_FromBuildEnvFile()
        {
            // Arrange
            var phpVersion = "7.3";
            var appName    = "twig-example";
            var hostDir    = Path.Combine(_hostSamplesDir, "php", appName);
            var volume     = DockerVolume.CreateMirror(hostDir);
            var appDir     = volume.ContainerDir;
            var expectedFileInOutputDir = Guid.NewGuid().ToString("N");
            var buildScript             = new ShellScriptBuilder()
                                          .AddCommand($"oryx build {appDir} --platform {PhpConstants.PlatformName} --platform-version {phpVersion}")
                                          // Create a 'build.env' file
                                          .AddCommand(
                $"echo '{FilePaths.PreRunCommandEnvVarName}=\"echo > {expectedFileInOutputDir}\"' > " +
                $"{appDir}/{BuildScriptGeneratorCli.Constants.BuildEnvironmentFileName}")
                                          .ToString();
            var runScript = new ShellScriptBuilder()
                            .AddCommand($"oryx create-script -appPath {appDir} -output {RunScriptPath}")
                            .AddCommand(RunScriptPath)
                            .ToString();

            // Act & Assert
            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "/bin/sh", new[] { "-c", buildScript },
                _imageHelper.GetRuntimeImage("php", phpVersion),
                ContainerPort,
                "/bin/sh", new[] { "-c", runScript },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("<h1>Hello World!</h1>", data);

                // Verify that the file created using the pre-run command is
                // in fact present in the output directory.
                Assert.True(File.Exists(Path.Combine(volume.MountedHostDir, expectedFileInOutputDir)));
            });
        }
Ejemplo n.º 10
0
        public async Task WordPress51(string phpVersion)
        {
            // Arrange
            string hostDir = Path.Combine(_hostTempDir, "wordpress");

            if (!Directory.Exists(hostDir))
            {
                using (var webClient = new WebClient())
                {
                    var wpZipPath = Path.Combine(_hostTempDir, "wp.zip");
                    webClient.DownloadFile("https://wordpress.org/wordpress-5.1.zip", wpZipPath);
                    // The ZIP already contains a `wordpress` folder
                    ZipFile.ExtractToDirectory(wpZipPath, _hostTempDir);
                }
            }

            var appName     = "wordpress";
            var volume      = DockerVolume.CreateMirror(hostDir);
            var appDir      = volume.ContainerDir;
            var buildScript = new ShellScriptBuilder()
                              .AddCommand($"oryx build {appDir} -l php --language-version {phpVersion}")
                              .ToString();
            var runScript = new ShellScriptBuilder()
                            .AddCommand($"oryx -appPath {appDir} -output {RunScriptPath}")
                            .AddCommand(RunScriptPath)
                            .ToString();

            // Act & Assert
            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName, _output, volume,
                "/bin/sh", new[] { "-c", buildScript },
                $"oryxdevms/php-{phpVersion}",
                ContainerPort,
                "/bin/sh", new[] { "-c", runScript },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("<title>WordPress &rsaquo; Setup Configuration File</title>", data);
            });
        }
Ejemplo n.º 11
0
        public async Task CanBuildAndRun_FSharpNetCoreApp21WebApp_WithoutSpecifyingLanguageExplicitly()
        {
            // Arrange
            var hostDir          = Path.Combine(_hostSamplesDir, "DotNetCore", "FSharpNetCoreApp21.WebApp");
            var volume           = DockerVolume.CreateMirror(hostDir);
            var appDir           = volume.ContainerDir;
            var appOutputDir     = $"{appDir}/myoutputdir";
            var buildImageScript = new ShellScriptBuilder()
                                   .AddCommand($"oryx build {appDir} -o {appOutputDir}")
                                   .ToString();
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand(
                $"oryx -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                NetCoreApp22WebApp,
                _output,
                volume,
                "/bin/sh",
                new[]
            {
                "-c",
                buildImageScript
            },
                _imageHelper.GetTestRuntimeImage("dotnetcore", "2.1"),
                ContainerPort,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
Ejemplo n.º 12
0
        // pdo_sqlsrv only supports PHP >= 7.1
        public async Task PhpApp_UsingPdo(string phpVersion)
        {
            // Arrange
            var appName = "sqlsrv-example";
            var hostDir = Path.Combine(_hostSamplesDir, "php", appName);
            var volume  = DockerVolume.CreateMirror(hostDir);
            var appDir  = volume.ContainerDir;
            var script  = new ShellScriptBuilder()
                          .AddCommand($"oryx create-script -appPath {appDir} -bindPort {ContainerPort}")
                          .AddCommand(DefaultStartupFilePath)
                          .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                volume
            },
                Settings.BuildImageName,
                "oryx",
                new[] { "build", appDir, "-l", "php", "--language-version", phpVersion },
                _imageHelper.GetRuntimeImage("php", phpVersion),
                GetEnvironmentVariables(),
                ContainerPort,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Equal(
                    DbContainerFixtureBase.GetSampleDataAsJson(),
                    data.Trim(),
                    ignoreLineEndingDifferences: true,
                    ignoreWhiteSpaceDifferences: true);
            });
        }
        public async Task Node_CreateReactAppSample_zippedNodeModules(string nodeVersion)
        {
            // Arrange
            // Use a separate volume for output due to rsync errors
            var appOutputDirPath = Directory.CreateDirectory(Path.Combine(_tempRootDir, Guid.NewGuid().ToString("N")))
                                   .FullName;
            var appOutputDirVolume = DockerVolume.CreateMirror(appOutputDirPath);
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var appName            = "create-react-app-sample";
            var volume             = CreateAppVolume(appName);
            var appDir             = volume.ContainerDir;
            var runAppScript       = new ShellScriptBuilder()
                                     .AddCommand($"oryx -appPath {appOutputDir} -bindPort {ContainerPort}")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();
            var buildScript = new ShellScriptBuilder()
                              .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o /tmp/out --platform nodejs " +
                $"--platform-version {nodeVersion} -p compress_node_modules=zip")
                              .AddCommand($"cp -rf /tmp/out/* {appOutputDir}")
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new List <DockerVolume> {
                appOutputDirVolume, volume
            },
                "/bin/bash",
                new[] { "-c", buildScript },
                $"oryxdevmcr.azurecr.io/public/oryx/node-{nodeVersion}",
                ContainerPort,
                "/bin/sh",
                new[] { "-c", runAppScript },
                async (hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("<title>React App</title>", data);
            });
        }
Ejemplo n.º 14
0
        protected async Task RunTestAsync(string language, string languageVersion, string samplePath,
                                          int containerPort = 8000, bool specifyBindPortFlag = true)
        {
            var volume           = DockerVolume.Create(samplePath);
            var appDir           = volume.ContainerDir;
            var portMapping      = $"{_appPort}:{containerPort}";
            var entrypointScript = "./run.sh";
            var bindPortFlag     = specifyBindPortFlag ? $"-bindPort {containerPort}" : string.Empty;
            var script           = new ShellScriptBuilder()
                                   .AddCommand($"cd {appDir}")
                                   .AddCommand($"oryx -appPath {appDir} {bindPortFlag}")
                                   .AddCommand(entrypointScript)
                                   .ToString();

            var runtimeImageName = $"oryxdevms/{language}-{languageVersion}";

            if (string.Equals(language, "nodejs", StringComparison.OrdinalIgnoreCase))
            {
                runtimeImageName = $"oryxdevms/node-{languageVersion}";
            }

            string link = $"{_dbFixture.DbServerContainerName}:{Constants.InternalDbLinkName}";

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                _output,
                new List <DockerVolume> {
                volume
            },
                "oryx", new[] { "build", appDir, "-l", language, "--language-version", languageVersion },
                runtimeImageName,
                _dbFixture.GetCredentialsAsEnvVars(),
                portMapping, link,
                "/bin/sh", new[] { "-c", script },
                async() =>
            {
                var data = await HttpClient.GetStringAsync($"http://localhost:{_appPort}/");
                Assert.Equal(_dbFixture.GetSampleDataAsJson(), data.Trim(), ignoreLineEndingDifferences: true, ignoreWhiteSpaceDifferences: true);
            });
        }
Ejemplo n.º 15
0
        public void BuildsAppAfterInstallingAllRequiredPlatforms()
        {
            // Arrange
            var appName      = "dotNetCoreReactApp";
            var hostDir      = Path.Combine(_hostSamplesDir, "multilanguage", appName);
            var volume       = DockerVolume.CreateMirror(hostDir);
            var appDir       = volume.ContainerDir;
            var appOutputDir = $"{appDir}/myoutputdir";
            var buildScript  = new ShellScriptBuilder()
                               .AddBuildCommand(
                $"{appDir} -o {appOutputDir} --platform {DotNetCoreConstants.PlatformName} --platform-version 3.1")
                               .AddFileExistsCheck($"{appOutputDir}/dotNetCoreReactApp.dll")
                               .AddDirectoryExistsCheck($"{appOutputDir}/ClientApp/build")
                               .ToString();

            // Act
            var result = _dockerCli.Run(new DockerRunArguments
            {
                ImageId = _imageHelper.GetGitHubActionsBuildImage(),
                EnvironmentVariables = new List <EnvironmentVariable> {
                    CreateAppNameEnvVar(appName)
                },
                Volumes = new List <DockerVolume> {
                    volume
                },
                CommandToExecuteOnRun = "/bin/bash",
                CommandArguments      = new[] { "-c", buildScript }
            });

            // Assert
            RunAsserts(
                () =>
            {
                Assert.True(result.IsSuccess);
                Assert.Contains("Using .NET Core SDK Version: ", result.StdOut);
                Assert.Contains("react-scripts build", result.StdOut);
            },
                result.GetDebugInfo());
        }
Ejemplo n.º 16
0
        public async Task Python27App_virtualEnv()
        {
            // Arrange
            var          appName        = "python2-flask-app";
            var          hostDir        = Path.Combine(_hostSamplesDir, "python", appName);
            var          volume         = DockerVolume.Create(hostDir);
            var          appDir         = volume.ContainerDir;
            const string virtualEnvName = "antenv2.7";
            var          startupFile    = "/tmp/startup.sh";
            var          portMapping    = $"{HostPort}:5000";
            var          script         = new ShellScriptBuilder()
                                          // Mimic the commands ran by app service in their derived image.
                                          .AddCommand("pip install gunicorn")
                                          .AddCommand("pip install flask")
                                          .AddCommand($"cd {appDir}")
                                          .AddCommand($"oryx -appPath {appDir} -output {startupFile} -hostBind=\":5000\" -virtualEnvName={virtualEnvName}")
                                          .AddCommand(startupFile)
                                          .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "python", "--language-version", "2.7", "-p", $"virtualenv_name={virtualEnvName}" },
                "oryxdevms/python-2.7",
                portMapping,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
Ejemplo n.º 17
0
        public async Task Node_SoundCloudNgrxApp()
        {
            // Arrange
            var appName     = "soundcloud-ngrx";
            var nodeVersion = "8.11";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:3000";
            var startupFile = "./run.sh";
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx -appPath {appDir}")
                              .AddCommand($"npm rebuild node-sass") //remove this once workitem 762584 is done
                              .AddCommand(startupFile)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                $"oryxdevms/node-{nodeVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var response = await _httpClient.GetAsync($"http://localhost:{HostPort}/");
                Assert.True(response.IsSuccessStatusCode);
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("<title>SoundCloud • Angular2 NgRx</title>", data);
            });
        }
Ejemplo n.º 18
0
        public async Task CanBuildAndRunApp(string phpVersion)
        {
            // Arrange
            var exifImageTypePng = "3";
            var appName = "exif-example";
            var hostDir = Path.Combine(_hostSamplesDir, "php", appName);
            var volume = DockerVolume.CreateMirror(hostDir);
            var appDir = volume.ContainerDir;
            var appOutputDirVolume = CreateAppOutputDirVolume();
            var appOutputDir = appOutputDirVolume.ContainerDir;
            var buildScript = new ShellScriptBuilder()
                .AddDefaultTestEnvironmentVariables()
                .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o {appOutputDir} " +
                $"--platform {PhpConstants.PlatformName} --platform-version {phpVersion}")
                .ToString();
            var runScript = new ShellScriptBuilder()
                .AddCommand($"oryx create-script -appPath {appOutputDir} -output {RunScriptPath}")
                .AddCommand(RunScriptPath)
                .ToString();

            // Act & Assert
            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                new[] { volume, appOutputDirVolume },
                _imageHelper.GetGitHubActionsBuildImage(),
                "/bin/sh", new[] { "-c", buildScript },
                _imageHelper.GetRuntimeImage("php", phpVersion),
                ContainerPort,
                "/bin/sh", new[] { "-c", runScript },
                async (hostPort) =>
                {
                    string exifOutput = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                    // The test app: `echo exif_imagetype('64x64.png')`
                    Assert.Equal(exifImageTypePng, exifOutput);
                });
        }
Ejemplo n.º 19
0
        public async Task CanBuildAndRun_NetCore11WebApp_HavingExplicitAssemblyName()
        {
            // Arrange
            var appName            = "NetCoreApp11WithExplicitAssemblyName";
            var dotnetcoreVersion  = "1.1";
            var hostDir            = Path.Combine(_hostSamplesDir, "DotNetCore", appName);
            var volume             = DockerVolume.Create(hostDir);
            var appDir             = volume.ContainerDir;
            var containerPort      = "9095";
            var portMapping        = $"{HostPort}:{containerPort}";
            var startupFilePath    = "/tmp/run.sh";
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand($"oryx -sourcePath {appDir} -output {startupFilePath}")
                                     .AddCommand($"export ASPNETCORE_URLS=http://*:{containerPort}")
                                     .AddCommand(startupFilePath)
                                     .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "dotnet", "--language-version", dotnetcoreVersion },
                $"oryxdevms/dotnetcore-{dotnetcoreVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                runtimeImageScript
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello World!", data);
            });
        }
Ejemplo n.º 20
0
        public async Task CanRunApp_WithoutBuildManifestFile()
        {
            // Arrange
            var golangVersion      = "1.17";
            var hostDir            = Path.Combine(_hostSamplesDir, "golang", GolangHelloWorldWebApp);
            var volume             = DockerVolume.CreateMirror(hostDir);
            var appDir             = volume.ContainerDir;
            var appOutputDirVolume = CreateAppOutputDirVolume();
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var runtimeImageScript = new ShellScriptBuilder()
                                     .AddCommand(
                $"oryx build {appDir} -i /tmp/int -o {appOutputDir} " +
                $"--platform {GolangConstants.PlatformName} --platform-version {golangVersion}")
                                     .AddCommand(
                $"oryx run-script {appOutputDir} --output {DefaultStartupFilePath} --debug")
                                     .AddCommand(DefaultStartupFilePath)
                                     .ToString();

            // Assert
            await EndToEndTestHelper.RunAndAssertAppAsync(
                imageName : "oryxdevmcr.azurecr.io/public/oryx/build:full",
                output : _output,
                volumes : new List <DockerVolume> {
                appOutputDirVolume, volume
            },
                environmentVariables : null,
                port : ContainerPort,
                link : null,
                runCmd : "/bin/sh",
                runArgs : new[] { "-c", runtimeImageScript },
                assertAction : async(hostPort) =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World!!!", data);
            },
                dockerCli : new DockerCli());
        }
Ejemplo n.º 21
0
        public void CanBuildAppHavingAppDynamicsNpmPackage()
        {
            // Arrange
            // Create an app folder with a package.json having the 'appdynamics' package
            var packageJsonContent = "{\"dependencies\": { \"appdynamics\": \"20.10.1\" }}";
            var sampleAppPath      = Path.Combine(_tempRootDir, Guid.NewGuid().ToString("N"));

            Directory.CreateDirectory(sampleAppPath);
            File.WriteAllText(Path.Combine(sampleAppPath, NodeConstants.PackageJsonFileName), packageJsonContent);
            var volume       = DockerVolume.CreateMirror(sampleAppPath);
            var appDir       = volume.ContainerDir;
            var appOutputDir = "/tmp/output";
            var script       = new ShellScriptBuilder()
                               .AddBuildCommand($"{appDir} -i /tmp/int -o {appOutputDir}")
                               .AddDirectoryExistsCheck($"{appOutputDir}/node_modules")
                               .AddDirectoryExistsCheck($"{appOutputDir}/node_modules/appdynamics")
                               .ToString();

            // Act
            var result = _dockerCli.Run(new DockerRunArguments
            {
                ImageId = Settings.LtsVersionsBuildImageName,
                Volumes = new List <DockerVolume> {
                    volume
                },
                CommandToExecuteOnRun = "/bin/bash",
                CommandArguments      = new[] { "-c", script }
            });

            // Assert
            RunAsserts(
                () =>
            {
                Assert.True(result.IsSuccess);
            },
                result.GetDebugInfo());
        }
Ejemplo n.º 22
0
        public async Task Node_CreateReactAppSample_singleImage()
        {
            // Arrange
            var appName     = "create-react-app-sample";
            var nodeVersion = "10";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:3000";
            var startupFile = "/tmp/startup.sh";
            var runScript   = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx run-script --appPath {appDir} --output {startupFile} --platform nodejs --platform-version {nodeVersion}")
                              .AddCommand($"chmod +x {startupFile}")
                              .AddCommand(startupFile)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName : appName,
                output : _output,
                volume : volume,
                buildCmd : "oryx",
                buildArgs : new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                runtimeImageName : $"oryxdevms/build",
                portMapping : portMapping,
                runCmd : "/bin/sh",
                runArgs : new[]
            {
                "-c",
                runScript
            },
                assertAction : async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("<title>React App</title>", data);
            });
        }
Ejemplo n.º 23
0
        public async Task PhpFpmGreetingsAppTest(string phpVersion)
        {
            // Arrange
            var appName            = "greetings";
            var hostDir            = Path.Combine(_hostSamplesDir, "php", appName);
            var volume             = DockerVolume.CreateMirror(hostDir);
            var appDir             = volume.ContainerDir;
            var appOutputDirVolume = CreateAppOutputDirVolume();
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var buildScript        = new ShellScriptBuilder()
                                     .AddCommand($"oryx build {appDir} -i /tmp/int -o {appOutputDir} " +
                                                 $"--platform php --platform-version {phpVersion}")
                                     .ToString();
            var runScript = new ShellScriptBuilder()
                            .AddCommand($"oryx create-script -appPath {appOutputDir} -output {RunScriptPath} -bindPort {ContainerPort}")
                            .AddCommand("mkdir -p /home/site/wwwroot")
                            .AddCommand($"cp -rf {appOutputDir}/* /home/site/wwwroot")
                            .AddCommand(RunScriptPath)
                            .ToString();

            var phpimageVersion = string.Concat(phpVersion, "-", "fpm");

            // Act & Assert
            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName, _output, new[] { volume, appOutputDirVolume },
                "/bin/sh", new[] { "-c", buildScript },
                _imageHelper.GetRuntimeImage("php", phpimageVersion),
                ContainerPort,
                "/bin/sh", new[] { "-c", runScript },
                async (hostPort) =>
            {
                var output = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                Assert.Contains("Hello World", output);
                Assert.Contains("oryx oryx oryx", output);
            });
        }
Ejemplo n.º 24
0
        public void MultiPlatformBuild_IsDisabled()
        {
            // Arrange
            var appName      = "dotnetreact";
            var hostDir      = Path.Combine(_hostSamplesDir, "multilanguage", appName);
            var volume       = DockerVolume.Create(hostDir);
            var appDir       = volume.ContainerDir;
            var appOutputDir = $"{appDir}/myoutputdir";
            var buildScript  = new ShellScriptBuilder()
                               .AddCommand("export ENABLE_MULTIPLATFORM_BUILD=true")
                               .AddBuildCommand($"{appDir} -o {appOutputDir} -l dotnet --language-version 2.2")
                               .ToString();

            // Act
            var result = _dockerCli.Run(new DockerRunArguments
            {
                ImageId = Settings.BuildImageName,
                EnvironmentVariables = new List <EnvironmentVariable> {
                    CreateAppNameEnvVar(appName)
                },
                Volumes = new List <DockerVolume> {
                    volume
                },
                CommandToExecuteOnRun = "/bin/bash",
                CommandArguments      = new[] { "-c", buildScript }
            });

            // Assert
            RunAsserts(
                () =>
            {
                Assert.True(result.IsSuccess);
                Assert.DoesNotContain(@"npm install", result.StdOut);
            },
                result.GetDebugInfo());
        }
Ejemplo n.º 25
0
        public async Task CanBuildAndRun_ShapelyFlaskApp_PackageDir(string pythonVersion)
        {
            // Arrange
            const string packageDir  = "orx_packages";
            var          appName     = "shapely-flask-app";
            var          hostDir     = Path.Combine(_hostSamplesDir, "python", appName);
            var          volume      = DockerVolume.Create(hostDir);
            var          appDir      = volume.ContainerDir;
            var          portMapping = $"{HostPort}:{ContainerPort}";
            var          script      = new ShellScriptBuilder()
                                       .AddCommand($"cd {appDir}")
                                       .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort} -packagedir {packageDir}")
                                       .AddCommand(DefaultStartupFilePath)
                                       .ToString();
            var imageVersion = "oryxdevms/python-" + pythonVersion;

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "python", "--language-version", pythonVersion, "-p", $"packagedir={packageDir}" },
                imageVersion,
                portMapping,
                "/bin/bash",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Hello Shapely, Area is: 314", data);
            });
        }
Ejemplo n.º 26
0
        public void CanUseDotNetCoreAsPartOfMultiPlatformBuild()
        {
            // Arrange
            var appName      = "dotnetreact";
            var hostDir      = Path.Combine(_hostSamplesDir, "multilanguage", appName);
            var volume       = DockerVolume.CreateMirror(hostDir);
            var appDir       = volume.ContainerDir;
            var appOutputDir = $"{appDir}/myoutputdir";
            var buildScript  = new ShellScriptBuilder()
                               .AddCommand($"export {BuildScriptGeneratorCli.SettingsKeys.EnableMultiPlatformBuild}=true")
                               .AddBuildCommand($"{appDir} -o {appOutputDir} --platform {DotNetCoreConstants.PlatformName} --platform-version 2.2")
                               .ToString();

            // Act
            var result = _dockerCli.Run(new DockerRunArguments
            {
                ImageId = Settings.BuildImageName,
                EnvironmentVariables = new List <EnvironmentVariable> {
                    CreateAppNameEnvVar(appName)
                },
                Volumes = new List <DockerVolume> {
                    volume
                },
                CommandToExecuteOnRun = "/bin/bash",
                CommandArguments      = new[] { "-c", buildScript }
            });

            // Assert
            RunAsserts(
                () =>
            {
                Assert.True(result.IsSuccess);
                Assert.Contains(@"npm install", result.StdOut);
            },
                result.GetDebugInfo());
        }
Ejemplo n.º 27
0
        public async Task PhpFpmGdExample(string phpVersion)
        {
            // Arrange
            var appName            = "gd-example";
            var hostDir            = Path.Combine(_hostSamplesDir, "php", appName);
            var volume             = DockerVolume.CreateMirror(hostDir);
            var appDir             = volume.ContainerDir;
            var appOutputDirVolume = CreateAppOutputDirVolume();
            var appOutputDir       = appOutputDirVolume.ContainerDir;
            var buildScript        = new ShellScriptBuilder()
                                     .AddCommand($"oryx build {appDir} -i /tmp/int -o {appOutputDir} " +
                                                 $"--platform {PhpConstants.PlatformName} --platform-version {phpVersion}")
                                     .ToString();
            var runScript = new ShellScriptBuilder()
                            .AddCommand($"oryx create-script -appPath {appOutputDir} -output {RunScriptPath}")
                            .AddCommand("mkdir -p /home/site/wwwroot")
                            .AddCommand($"cp -rf {appOutputDir}/* /home/site/wwwroot")
                            .AddCommand(RunScriptPath)
                            .ToString();

            var phpimageVersion = string.Concat(phpVersion, "-", "fpm");

            // Act & Assert
            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName, _output, new[] { volume, appOutputDirVolume },
                "/bin/sh", new[] { "-c", buildScript },
                _imageHelper.GetRuntimeImage("php", phpimageVersion),
                ContainerPort,
                "/bin/sh", new[] { "-c", runScript },
                async (hostPort) =>
            {
                string gdInfoOutput = await _httpClient.GetStringAsync($"http://localhost:{hostPort}/");
                // The test app: `echo $info['JPEG Support'] . ',' . $info['PNG Support']`
                Assert.Equal("1,1", gdInfoOutput);
            });
        }
Ejemplo n.º 28
0
        public async Task NodeStartupScript_UsesSuppliedBindingPort_EvenIfPortEnvironmentVariableValue_IsPresent()
        {
            // Arrange
            var nodeVersion = "10.14";
            var appName     = "webfrontend";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:{ContainerPort}";
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"export PORT=9095")
                              .AddCommand($"oryx -appPath {appDir} -bindPort {ContainerPort}")
                              .AddCommand(DefaultStartupFilePath)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                $"oryxdevms/node-{nodeVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Say It Again", data);
            });
        }
Ejemplo n.º 29
0
        public void GeneratesScript_AndBuilds_UsingSuppliedPackageDir_WhenPackageDirAndSourceDirAreSame()
        {
            // Arrange
            var volume = DockerVolume.CreateMirror(
                Path.Combine(_hostSamplesDir, "nodejs", "monorepo-lerna-yarn"));
            var appDir = volume.ContainerDir;
            var script = new ShellScriptBuilder()
                         .SetEnvironmentVariable(
                SdkStorageConstants.SdkStorageBaseUrlKeyName,
                SdkStorageConstants.DevSdkStorageBaseUrl)
                         .SetEnvironmentVariable(
                SettingsKeys.EnableNodeMonorepoBuild,
                true.ToString())
                         .AddBuildCommand($"{appDir} --package -p {NodePlatform.PackageDirectoryPropertyKey}=''")
                         .AddFileExistsCheck($"{appDir}/lerna-monorepo-post-1.0.0.tgz")
                         .ToString();

            // Act
            var result = _dockerCli.Run(new DockerRunArguments
            {
                ImageId = Settings.BuildImageName,
                Volumes = new List <DockerVolume> {
                    volume
                },
                CommandToExecuteOnRun = "/bin/bash",
                CommandArguments      = new[] { "-c", script }
            });

            // Assert
            RunAsserts(
                () =>
            {
                Assert.True(result.IsSuccess);
            },
                result.GetDebugInfo());
        }
Ejemplo n.º 30
0
        public async Task NodeApp_WithYarnLock()
        {
            // Arrange
            var appName     = "webfrontend-yarnlock";
            var nodeVersion = "10.14";
            var hostDir     = Path.Combine(_hostSamplesDir, "nodejs", appName);
            var volume      = DockerVolume.Create(hostDir);
            var appDir      = volume.ContainerDir;
            var portMapping = $"{HostPort}:80";
            var startupFile = "/tmp/startup.sh";
            var script      = new ShellScriptBuilder()
                              .AddCommand($"cd {appDir}")
                              .AddCommand($"oryx -appPath {appDir} -output {startupFile}")
                              .AddCommand(startupFile)
                              .ToString();

            await EndToEndTestHelper.BuildRunAndAssertAppAsync(
                appName,
                _output,
                volume,
                "oryx",
                new[] { "build", appDir, "-l", "nodejs", "--language-version", nodeVersion },
                $"oryxdevms/node-{nodeVersion}",
                portMapping,
                "/bin/sh",
                new[]
            {
                "-c",
                script
            },
                async() =>
            {
                var data = await _httpClient.GetStringAsync($"http://localhost:{HostPort}/");
                Assert.Contains("Say It Again", data);
            });
        }