Почему я получаю сообщение об ошибке при запуске моего конвейера? - PullRequest
0 голосов
/ 20 февраля 2020

У меня довольно большой проект, который я использую Azure Pipelines для автоматизации моих развертываний. Я использую локальный агент сборки из-за некоторого лицензирования в одной из наших библиотек.

Однако внезапно проект завершается неудачей, когда он достигает шага publi sh. Я пытался восстановить несколько раз. Я вырыл журналы, и они не имеют смысла.

2020-02-20T14:18:19.3341737Z ##[error]Path\To\File\Edit.cshtml(201,0): Error CS1525: Invalid expression term '.'

Проблема в том, что когда я публикую sh локально, ошибок нет. Часть файла, на которую она ссылается, имеет значение datetime. Он выбрасывает несколько этих ошибок, ссылающихся на обнуляемые объекты даты и времени. Единственное, что я могу подумать, что недавно изменилось, это то, что я установил VS2019. Однако мой конвейер все еще настроен на нас VS2017. Журналы также показывают, что он использует msbuild 15.0.

Я немного растерялся. Кто-нибудь знает, что я мог пропустить? Или, может быть, некоторые шаги по устранению неполадок я не вижу? У меня также есть полный журнал неудачных сборок, если требуется какая-либо дополнительная информация.

Содержимое файла Edit.cs html

@model Project.Portal.Domain.Models.CompanyContact.EditViewModel

@{
    ViewBag.Title = "Edit Company Contact";
    Layout = "~/Views/Shared/_Popup.cshtml";
}

@using (Html.BeginForm("Edit", "CompanyContact"))
{
    <div>
        @Html.ValidationSummary()
    </div>

    <div id="companyContactDetail">
        @Html.HiddenFor(x => x.Id)
        @Html.HiddenFor(x => x.CompanyId)
        @Html.HiddenFor(x => x.ContactId)
        @Html.HiddenFor(x => x.CreatedBy)
        @Html.HiddenFor(x => x.CreatedOn)
        @Html.HiddenFor(x => x.ModifiedBy)
        @Html.HiddenFor(x => x.ModifiedOn)
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-6">
                @Html.LabelFor(x => x.IsPrimary)
                <br />
                @Html.Kendo().CheckBoxFor(x => x.IsPrimary).Label(string.Empty)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.IsSecondary)
                <br />
                @Html.Kendo().CheckBoxFor(x => x.IsSecondary).Label(string.Empty)
            </div>
        </div>
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-6">
                @Html.LabelFor(x => x.IsOwner)
                <br />
                @Html.Kendo().CheckBoxFor(x => x.IsOwner).Label(string.Empty)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.OwnershipPercentage)
                <br />
                @Html.Kendo().NumericTextBoxFor(x => x.OwnershipPercentage).Enable(Model.IsOwner)
            </div>
        </div>
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-6">
                @Html.LabelFor(x => x.IsGuarantor)
                <br />
                @Html.Kendo().CheckBoxFor(x => x.IsGuarantor).Label(string.Empty)
            </div>
        </div>
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-12 text-center">
                <a href="#" onclick="window.parent.$('#CompanyContact-Window').data('kendoWindow').close();" class="btn btn-warning">Cancel</a>
                <a href="#" onclick="showContactDetail();" class="btn btn-primary">Next</a>
            </div>
        </div>
    </div>

    <div id="contactDetail" style="display: none;">
        @Html.HiddenFor(x => x.Contact.Id)
        @Html.HiddenFor(x => x.Contact.SocialSecurityNumber)
        @Html.HiddenFor(x => x.Contact.EditSocialSecurityNumber)
        @Html.HiddenFor(x => x.Contact.CreatedBy)
        @Html.HiddenFor(x => x.Contact.CreatedOn)
        @Html.HiddenFor(x => x.Contact.ModifiedBy)
        @Html.HiddenFor(x => x.Contact.ModifiedOn)
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.FirstName)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.FirstName)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.LastName)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.LastName)
            </div>
        </div>
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.Title)
                <br/>
                @Html.Kendo().TextBoxFor(x => x.Contact.Title)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.FicoScore)
                <br/>
                @Html.Kendo().NumericTextBoxFor(x => x.Contact.FicoScore).Decimals(0).Format("n0")
                @Html.ValidationMessageFor(x => x.Contact.FicoScore)
            </div>
        </div>
        @if (Project.Portal.Common.Security.CurrentUser.CanEditSocialSecurityNumber())
        {
            <div class="row" style="padding-top: 10px;">
                <div class="col-xs-12">
                    @Html.LabelFor(x => x.Contact.SocialSecurityNumber)
                    <br />
                    <a href="#" id="editSSN" onclick="editSSN();" style="display: @(Model.Contact.EditSocialSecurityNumber ? "none" : "block");">Edit Social Security Number</a>
                    <a href="#" id="cancelSSN" onclick="cancelSSNEdit();" style="display: @(Model.Contact.EditSocialSecurityNumber ? "block" : "none");">Cancel Social Security Number Edit</a>
                </div>
                <div id="ssnEdit" style="display: @(Model.Contact.EditSocialSecurityNumber ? "block" : "none");">
                    <div class="col-xs-6">
                        @Html.Kendo().MaskedTextBoxFor(x => x.Contact.NewSocialSecurityNumber).Mask("999-99-9999")
                    </div>
                    <div class="col-xs-6">
                        @Html.Kendo().MaskedTextBoxFor(x => x.Contact.ConfirmNewSocialSecurityNumber).Mask("999-99-9999")
                    </div>
                </div>
            </div>
        }
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.Address1)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.Address1)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.Address2)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.Address2)
            </div>
        </div>
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.City)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.City)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.State)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.State)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.ZipCode)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.ZipCode)
            </div>
            <div class="col-xs-6">
                @Html.LabelFor(x => x.Contact.Country)
                <br />
                @Html.Kendo().TextBoxFor(x => x.Contact.Country)
            </div>
        </div>
        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-12 text-center">
                <a href="#" onclick="showCompanyContactDetail();
" class="btn btn-primary">Previous</a>
                <a href="#" onclick="window.parent.$('#CompanyContact-Window').data('kendoWindow').close();" class="btn btn-warning">Cancel</a>
                <a href="#" onclick="showContactEmailAndPhoneDetail();" class="btn btn-primary">Next</a>
            </div>
        </div>
    </div>

    <div id="contactEmaiAndPhoneDetail" style="display: none;">

        <div class="row" style="padding-top: 10px;">
            <label>Email(s)</label>
            <a class="pull-right" href="#" onclick="addNewEmail();">Add New</a>
            <hr />
            <div id="contactEmails">
                @if (Model.Contact.ContactEmails != null)
                {
                    foreach (var model in Model.Contact.ContactEmails)
                    {
                        @Html.Partial("~/Views/ContactEmail/CompanyContactEdit.cshtml", model)
                    }
                }
            </div>
        </div>

        <div class="row" style="padding-top: 10px;">
            <label>Phone(s)</label>
            <a class="pull-right" href="#" onclick="addNewPhoneNumber();">Add New</a>
            <hr />
            <div id="contactPhoneNumbers">
                @if (Model.Contact.ContactPhoneNumbers != null)
                {
                    foreach (var model in Model.Contact.ContactPhoneNumbers)
                    {
                        @Html.Partial("~/Views/ContactPhoneNumber/CompanyContactEdit.cshtml", model)
                    }
                }
            </div>
        </div>

        <div class="row" style="padding-top: 10px;">
            <div class="col-xs-12 text-center">
                <a href="#" onclick="showContactDetail();" class="btn btn-primary">Previous</a>
                <a href="#" onclick="window.parent.$('#CompanyContact-Window').data('kendoWindow').close();" class="btn btn-warning">Cancel</a>
                <button type="submit" class="btn btn-success" onclick="kendo.ui.progress($('body'), true);">Save</button>
            </div>
        </div>
    </div>
}

<script type="text/javascript">
    var contactId = @Model.Contact.Id;
    var nextEmailIndex = @(Model.Contact.ContactEmails?.Count ?? 0);
    var nextPhoneNumberIndex = @(Model.Contact.ContactPhoneNumbers?.Count ?? 0);

    $(document).ready(function () {
        $("#@Html.IdFor(x => x.IsPrimary)").click(function () {
            if ($(this).prop("checked")) {
                $("#@Html.IdFor(x => x.IsSecondary)").prop("checked", false);
            }
        });

        $("#@Html.IdFor(x => x.IsSecondary)").click(function () {
            if ($(this).prop("checked")) {
                $("#@Html.IdFor(x => x.IsPrimary)").prop("checked", false);
            }
        });

        $("#@Html.IdFor(x => x.IsOwner)").click(function () {
            var ownershipPercentage = $("#@Html.IdFor(x => x.OwnershipPercentage)").data("kendoNumericTextBox");

            if ($(this).prop("checked")) {
                ownershipPercentage.enable(true);
            } else {
                ownershipPercentage.enable(false);
            }
        });
    });

    function showContactDetail() {
        $("#companyContactDetail").hide();
        $("#contactEmaiAndPhoneDetail").hide();

        $("#contactDetail").show();

        return false;
    }

    function showCompanyContactDetail() {
        $("#contactDetail").hide();
        $("#contactEmaiAndPhoneDetail").hide();

        $("#companyContactDetail").show();

        return false;
    }

    function showContactEmailAndPhoneDetail() {
        $("#companyContactDetail").hide();
        $("#contactDetail").hide();

        $("#contactEmaiAndPhoneDetail").show();

        return false;
    }

    function addNewEmail() {
        var div = $("#contactEmails");

        kendo.ui.progress($("#contactEmails"), true);

        $.ajax({
            url: "@Url.Action("CompanyContactAdd", "ContactEmail")?contactId=" + contactId,
            type: "POST",
        success: function(e) {
            div.append(e);

            kendo.ui.progress($("#contactEmails"), false);
        }
    });

    return false;
    }

    function addNewPhoneNumber() {
        var div = $("#contactPhoneNumbers");

        kendo.ui.progress($("#contactPhoneNumbers"), true);

        $.ajax({
            url: "@Url.Action("CompanyContactAdd", "ContactPhoneNumber")?contactId=" + contactId,
            type: "POST",
            success: function(e) {
                div.append(e);

                kendo.ui.progress($("#contactPhoneNumbers"), false);
            }
        });

        return false;
    }

    function editSSN() {
        $("#editSSN").hide();
        $("#cancelSSN").show();
        $("#ssnEdit").show();

        $("#@Html.IdFor(x => x.Contact.EditSocialSecurityNumber)").val("True");
    }

    function cancelSSNEdit() {
        $("#ssnEdit").hide();
        $("#cancelSSN").hide();
        $("#editSSN").show();

        $("#@Html.IdFor(x => x.Contact.EditSocialSecurityNumber)").val("False");
    }
</script>

Редактировать 2: Сведения о конвейере

pool:
  name: Default
  demands:
  - msbuild
  - visualstudio

variables:
  BuildPlatform: 'any cpu'
  BuildConfiguration: 'debug'

steps:
- task: NuGetToolInstaller@0
  displayName: 'Use NuGet 4.4.1'
  inputs:
    versionSpec: 4.4.1

- task: NuGetInstaller@0
  displayName: 'NuGet restore Project.sln'
  inputs:
    solution: '$(Parameters.solution)'

- task: VSBuild@1
  displayName: 'Build solution Project.sln'
  inputs:
    solution: '$(Parameters.solution)'
    vsVersion: 15.0
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'

- task: PublishSymbols@1
  displayName: 'Publish symbols path'
  inputs:
    SearchPattern: '**\bin\**\*.pdb'
  continueOnError: true

- task: VSBuild@1
  displayName: 'Publish Solution Project.sln'
  inputs:
    solution: Project.sln
    vsVersion: 15.0
    msbuildArgs: '/P:PublishProfile=Development /P:DeployOnBuild=true'
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    clean: true

- task: CopyFiles@1
  displayName: 'Copy Portal Files'
  inputs:
    SourceFolder: '$(build.sourcesdirectory)'
    Contents: 'Project.Portal.Presentation.Mvc\Publish\**'
    TargetFolder: '$(build.artifactstagingdirectory)\Website'

- task: CopyFiles@1
  displayName: 'Copy API Files'
  inputs:
    SourceFolder: '$(build.sourcesdirectory)'
    Contents: 'Project.Portal.Presentation.Api\Publish\**'
    TargetFolder: '$(build.artifactstagingdirectory)\Api'

- task: CopyFiles@1
  displayName: 'Copy Customer Files'
  inputs:
    SourceFolder: '$(build.sourcesdirectory)'
    Contents: 'Project.Portal.Presentation.Customer\Publish\**'
    TargetFolder: '$(build.artifactstagingdirectory)\Customer'

- task: CopyFiles@1
  displayName: 'Copy DB Files'
  inputs:
    SourceFolder: '$(build.sourcesdirectory)'
    Contents: 'Project.Portal.Data.Database\bin\Debug\Project.Portal.Data.Database.dacpac'
    TargetFolder: '$(build.artifactstagingdirectory)\Database'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'
  inputs:
    ArtifactName: '$(Parameters.ArtifactName)'

Редактировать 3: Поэтому я вернул свою базу кода к последнему известному рабочему выпуску и попытался снова. Затем я получил те же ошибки.

1 Ответ

2 голосов
/ 21 февраля 2020

Поскольку вы можете использовать локальный vs2019 для публикации sh в обычном режиме, вы можете попробовать установить vsVersion: 16.0 в задаче VSBuild (vsVersion: 16.0 представляет vs2019) и убедиться, что в VS IDE установлены соответствующие рабочие нагрузки и установлены компоненты.

Кроме того, вы можете попытаться добавить p:PrecompileBeforePublish=true;EnableUpdateable=false в msbuildArgs.

enter image description here

Если ничего из вышеперечисленного не работает, вы можете поделиться PUB XML файл для дальнейшего расследования.

...