public BuildScript Analyse(Autobuilder builder, bool auto)
        {
            builder.Log(Severity.Info, "Attempting to locate build script");

            var extensions = builder.Actions.IsWindows() ? winExtensions : linuxExtensions;
            var scripts    = buildScripts.SelectMany(s => extensions.Select(e => s + e));
            var scriptPath = builder.Paths.Where(p => scripts.Any(p.Item1.ToLower().EndsWith)).OrderBy(p => p.Item2).Select(p => p.Item1).FirstOrDefault();

            if (scriptPath == null)
            {
                return(BuildScript.Failure);
            }

            var chmod = new CommandBuilder(builder.Actions);

            chmod.RunCommand("/bin/chmod", $"u+x {scriptPath}");
            var chmodScript = builder.Actions.IsWindows() ? BuildScript.Success : BuildScript.Try(chmod.Script);

            var dir = Path.GetDirectoryName(scriptPath);

            // A specific .NET Core version may be required
            return(chmodScript & DotNetRule.WithDotNet(builder, dotNet =>
            {
                var command = new CommandBuilder(builder.Actions, dir, dotNet?.Environment);

                // A specific Visual Studio version may be required
                var vsTools = MsBuildRule.GetVcVarsBatFile(builder);
                if (vsTools != null)
                {
                    command.CallBatFile(vsTools.Path);
                }

                command.IndexCommand(builder.Odasa, scriptPath);
                return command.Script;
            }));
        }
Exemple #2
0
        BuildScript GetCSharpBuildScript()
        {
            /// <summary>
            /// A script that checks that the C# extractor has been executed.
            /// </summary>
            BuildScript CheckExtractorRun(bool warnOnFailure) =>
            BuildScript.Create(actions =>
            {
                if (actions.FileExists(Extractor.GetCSharpLogPath()))
                {
                    return(0);
                }

                if (warnOnFailure)
                {
                    Log(Severity.Error, "No C# code detected during build.");
                }

                return(1);
            });

            var attempt = BuildScript.Failure;

            switch (GetCSharpBuildStrategy())
            {
            case CSharpBuildStrategy.CustomBuildCommand:
                attempt = new BuildCommandRule().Analyse(this) & CheckExtractorRun(true);
                break;

            case CSharpBuildStrategy.Buildless:
                // No need to check that the extractor has been executed in buildless mode
                attempt = new StandaloneBuildRule().Analyse(this);
                break;

            case CSharpBuildStrategy.MSBuild:
                attempt = new MsBuildRule().Analyse(this) & CheckExtractorRun(true);
                break;

            case CSharpBuildStrategy.DotNet:
                attempt = new DotNetRule().Analyse(this) & CheckExtractorRun(true);
                break;

            case CSharpBuildStrategy.Auto:
                var cleanTrapFolder =
                    BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("TRAP_FOLDER"));
                var cleanSourceArchive =
                    BuildScript.DeleteDirectory(Actions.GetEnvironmentVariable("SOURCE_ARCHIVE"));
                var cleanExtractorLog =
                    BuildScript.DeleteFile(Extractor.GetCSharpLogPath());
                var attemptExtractorCleanup =
                    BuildScript.Try(cleanTrapFolder) &
                    BuildScript.Try(cleanSourceArchive) &
                    BuildScript.Try(cleanExtractorLog);

                /// <summary>
                /// Execute script `s` and check that the C# extractor has been executed.
                /// If either fails, attempt to cleanup any artifacts produced by the extractor,
                /// and exit with code 1, in order to proceed to the next attempt.
                /// </summary>
                BuildScript IntermediateAttempt(BuildScript s) =>
                (s & CheckExtractorRun(false)) |
                (attemptExtractorCleanup & BuildScript.Failure);

                attempt =
                    // First try .NET Core
                    IntermediateAttempt(new DotNetRule().Analyse(this)) |
                    // Then MSBuild
                    (() => IntermediateAttempt(new MsBuildRule().Analyse(this))) |
                    // And finally look for a script that might be a build script
                    (() => new BuildCommandAutoRule().Analyse(this) & CheckExtractorRun(true)) |
                    // All attempts failed: print message
                    AutobuildFailure();
                break;
            }

            return
                (attempt &
                 (() => new AspBuildRule().Analyse(this)) &
                 (() => new XmlBuildRule().Analyse(this)));
        }