public void GetBuildpack(StagingStartMessageRequest message, string gitPath, string buildpacksDir)
        {
            try
            {
                this.CreatePrison();
                if (message.Properties.Buildpack != null)
                {
                    Logger.Info("Staging task {0}: Downloading buildpack from {1}", this.Properties.TaskId, message.Properties.Buildpack);
                    Directory.CreateDirectory(Path.Combine(this.Workspace.TempDir, "buildpacks"));
                    string buildpackPath = Path.Combine(this.Workspace.TempDir, "buildpacks", Path.GetFileName(new Uri(message.Properties.Buildpack).LocalPath));
                    string command       = string.Format("\"{0}\" clone --quiet --recursive {1} {2}", gitPath, message.Properties.Buildpack, buildpackPath);
                    Logger.Debug(command);
                    int success = Command.ExecuteCommand(command, this.Workspace.TempDir);
                    if (success != 0)
                    {
                        throw new Exception(string.Format("Failed to git clone buildpack. Exit code: {0}", success));
                    }
                    this.Buildpack = new Buildpack(buildpackPath, Path.Combine(this.Workspace.StagedDir, "app"), this.Workspace.Cache, this.Workspace.StagingLogPath);

                    bool detected = this.Buildpack.Detect(this.Prison);
                    if (!detected)
                    {
                        throw new Exception("Buildpack does not support this application.");
                    }
                }
                else
                {
                    Logger.Info("Staging task {0}: Detecting buildpack", this.Properties.TaskId);
                    foreach (string dir in Directory.EnumerateDirectories(buildpacksDir))
                    {
                        DEAUtilities.DirectoryCopy(dir, Path.Combine(this.Workspace.TempDir, "buildpack"), true);
                        Buildpack bp      = new Buildpack(Path.Combine(this.Workspace.TempDir, "buildpack"), Path.Combine(this.Workspace.StagedDir, "app"), this.Workspace.Cache, this.Workspace.StagingLogPath);
                        bool      success = bp.Detect(this.Prison);
                        if (success)
                        {
                            this.Buildpack = bp;
                            break;
                        }
                        else
                        {
                            Directory.Delete(Path.Combine(this.Workspace.TempDir, "buildpack"), true);
                        }
                    }

                    if (this.Buildpack == null)
                    {
                        throw new Exception("Unable to detect a supported application type");
                    }
                    Logger.Info("Staging task {0}: Detected buildpack {1}", this.Properties.TaskId, this.Buildpack.Name);
                }
                this.Properties.DetectedBuildpack = this.Buildpack.Name;
            }
            finally
            {
                if (this.Prison.Created)
                {
                    this.Prison.Destroy();
                }
            }
        }
Esempio n. 2
0
        private void Stage()
        {
            string appDir  = Path.Combine(this.workspace.StagedDir, "app");
            string logsDir = Path.Combine(this.workspace.StagedDir, "logs");
            string tmpDir  = Path.Combine(this.workspace.StagedDir, "tmp");

            Directory.CreateDirectory(appDir);
            Directory.CreateDirectory(logsDir);
            Directory.CreateDirectory(tmpDir);
            DEAUtilities.DirectoryCopy(this.workspace.UnstagedDir, appDir, true);
            Buildpack buildpack = null;

            if (this.Message.Properties.Buildpack != null)
            {
                Logger.Info("Staging task {0}: Downloading buildpack from {1}", this.TaskId, this.Message.Properties.Buildpack);
                Directory.CreateDirectory(Path.Combine(this.workspace.TempDir, "buildpacks"));
                string buildpackPath = Path.Combine(this.workspace.TempDir, "buildpacks", Path.GetFileName(new Uri(this.Message.Properties.Buildpack).LocalPath));
                string command       = string.Format("\"{0}\" clone --recursive {1} {2}", this.gitExe, this.Message.Properties.Buildpack, buildpackPath);
                int    success       = Command.ExecuteCommand(command);
                if (success != 0)
                {
                    throw new Exception("Failed to git clone buildpack");
                }
                buildpack = new Buildpack(buildpackPath, appDir, this.workspace.Cache, this.workspace.StagingLogPath);
                bool detected = buildpack.Detect(this.prison);
                if (!detected)
                {
                    throw new Exception("Buildpack does not support this application");
                }
            }
            else
            {
                Logger.Info("Staging task {0}: Detecting buildpack", this.TaskId);
                foreach (string dir in Directory.EnumerateDirectories(this.buildpacksDir))
                {
                    Buildpack bp      = new Buildpack(dir, appDir, this.workspace.Cache, this.workspace.StagingLogPath);
                    bool      success = bp.Detect(this.prison);
                    if (success)
                    {
                        buildpack = bp;
                        break;
                    }
                }

                if (buildpack == null)
                {
                    throw new Exception("Unable to detect a supported application type");
                }
                Logger.Info("Staging task {0}: Detected buildpack {1}", this.TaskId, buildpack.Name);
            }

            Logger.Info("Staging task {0}: Running compilation script", this.TaskId);
            buildpack.Compile(this.prison, this.stagingTimeout);

            Logger.Info("Staging task {0}: Saving buildpackInfo", this.TaskId);
            StagingInfo.SaveBuildpackInfo(Path.Combine(this.workspace.StagedDir, StagingWorkspace.StagingInfo), buildpack.Name, GetStartCommand(buildpack));
        }
        public void PrepareStagingDirs()
        {
            string appDir  = Path.Combine(this.Workspace.StagedDir, "app");
            string logsDir = Path.Combine(this.Workspace.StagedDir, "logs");
            string tmpDir  = Path.Combine(this.Workspace.StagedDir, "tmp");

            Directory.CreateDirectory(appDir);
            Directory.CreateDirectory(logsDir);
            Directory.CreateDirectory(tmpDir);
            DEAUtilities.DirectoryCopy(this.Workspace.UnstagedDir, appDir, true);
        }