private CreateVcsRootResponse CreateVcsRoot(CreateSpaBuildProject request,
            CreateProjectResponse createProjResponse,
            string gitHubToken)
        {
            var createVcs = TeamCityRequestBuilder.GetCreateVcsRootRequest(
                request.ProjectName,
                createProjResponse.Id,
                request.RepositoryUrl,
                request.PrivateRepository, request.Branch);
            // Use OAuth access_token as username as per https://github.com/blog/1270-easier-builds-and-deployments-using-git-over-https-and-oauth#using-oauth-with-git
            // Password of 'x-oauth-basic' also must be used based on how TeamCity creates the git clone command
            if (request.PrivateRepository)
            {
                createVcs.Properties.Properties.Add(new CreateVcsRootProperty
                {
                    Name = "username",
                    Value = gitHubToken
                });
                createVcs.Properties.Properties.Add(new CreateVcsRootProperty
                {
                    Name = "secure:password",
                    Value = "x-oauth-basic"
                });
            }

            var vcsResponse = TeamCityClient.CreateVcsRoot(createVcs);
            return vcsResponse;
        }
 private void CreateWebDeployPushStep(CreateSpaBuildProject request, CreateBuildConfigResponse buildConfigResponse)
 {
     TeamCityClient.CreateBuildStep(
         TeamCityRequestBuilder.GetWebDeployPush(buildConfigResponse.Id, request.WorkingDirectory));
 }
 private CreateProjectResponse CreateTeamCityProject(CreateSpaBuildProject request)
 {
     var createProject = new CreateProject
     {
         Name = request.Name,
         ParentProject = new ProjectLocator
         {
             Locator = "id:_Root"
         },
         Id = "SS_" + request.OwnerName + "_" + request.Name
     };
     var createProjResponse = TeamCityClient.CreateProject(createProject);
     return createProjResponse;
 }
 private void CreateNuGetRestoreStep(CreateSpaBuildProject request, CreateBuildConfigResponse buildConfigResponse)
 {
     TeamCityClient.CreateBuildStep(
         TeamCityRequestBuilder.GetNuGetRestoreBuildStep(buildConfigResponse.Id, request.SolutionPath));
 }
 private void CreateNpmInstallStep(CreateSpaBuildProject request, CreateBuildConfigResponse buildConfigResponse)
 {
     TeamCityClient.CreateBuildStep(
         TeamCityRequestBuilder.GetNpmInstallStepRequest(buildConfigResponse.Id, request.WorkingDirectory));
 }
 private void CreateCopyAppSettingsStep(CreateSpaBuildProject request, CreateBuildConfigResponse buildConfigResponse)
 {
     TeamCityClient.CreateBuildStep(
         TeamCityRequestBuilder.GetCopyAppSettingsStep(buildConfigResponse.Id,
             request.WorkingDirectory,
             AppSettings.GetString("ApplicationSettingsBaseFolder"),
             request.OwnerName,
             request.Name));
 }
        public CreateSpaBuildProjectResponse Post(CreateSpaBuildProject request)
        {
            Log.Info(request.ToJson());
            var session = SessionAs<AuthUserSession>();
            var gitHubToken = session.GetGitHubAccessToken();

            var createProjResponse = CreateTeamCityProject(request);

            var vcsResponse = CreateVcsRoot(request, createProjResponse, gitHubToken);

            try
            {
                if(!request.LocalOnlyApp)
                    IisHelper.AddSite(request.Name, request.HostName);
                else
                    IisHelper.AddLocalOnlySite(request.Name, request.Port);
            }
            catch (Exception e)
            {
                Log.Error(e.Message, e);
            }

            var createBuildConfig = new CreateBuildConfig
            {
                Locator = "id:" + createProjResponse.Id,
                Name = "Build and Deploy"
            };
            var buildConfigResponse = TeamCityClient.CreateBuildConfig(createBuildConfig);

            TeamCityClient.UpdateBuildConfigParameters(new UpdateBuildConfigParameters
            {
                Locator = "id:" + buildConfigResponse.Id,
                Properties = new List<CreateTeamCityBuildParameter>
                {
                    TeamCityRequestBuilder
                        .CreateTeamCityBuildParameter(buildConfigResponse.Id, "ss.msdeploy.serverAddress", "localhost",
                            "text validationMode='any' display='normal'"),
                    TeamCityRequestBuilder
                        .CreateTeamCityBuildParameter(buildConfigResponse.Id, "ss.msdeploy.iisApp", request.Name,
                            "text validationMode='any' display='normal'")
                }
            });

            TeamCityClient.UpdateBuildConfigSettings(new UpdateBuildConfigSetting
            {
                Locator = "id:" + buildConfigResponse.Id,
                SettingId = "artifactRules",
                Value = request.WorkingDirectory + "/wwwroot => " + request.WorkingDirectory + "/wwwroot"
            });

            AttachVcsToProject(buildConfigResponse, vcsResponse);
            CreateVcsTrigger(buildConfigResponse);

            CreateNpmInstallStep(request, buildConfigResponse);
            CreateBowerInstallStep(request, buildConfigResponse);
            CreateNuGetRestoreStep(request, buildConfigResponse);
            CreateGruntStep(request, buildConfigResponse);
            CreateCopyAppSettingsStep(request, buildConfigResponse);
            CreateWebDeployPackStep(request, buildConfigResponse);
            CreateWebDeployPushStep(request, buildConfigResponse);

            TeamCityClient.TriggerBuild(new TriggerBuild
            {
                TriggerBuildType = new TriggerBuildType
                {
                    Id = buildConfigResponse.Id
                }
            });

            return new CreateSpaBuildProjectResponse
            {
                ProjectId = createProjResponse.Id
            };
        }