【问题标题】:How to have SSIS exception in my console log如何在我的控制台日志中出现 SSIS 异常
【发布时间】:2021-05-19 13:58:32
【问题描述】:

我有 windows server 的 Jenkins 奴隶。我正在运行SSIS部署命令思想Powershell

 $ISDeploymentWizard = Start-Process -FilePath ISDeploymentWizard.exe -ArgumentList '/Silent','/ModelType:Project','/SourcePath:"Integration Services\\bin\\Development\\Integration Services.ispac"',"/DestinationServer:${Env}",'/DestinationPath:"/SSISDB/TEST/DEVOPS"' -wait -PassThru -Credential $cred
    $ISDeploymentWizard.WaitForExit()
    $ISDeploymentWizard

问题是当我遇到错误时,我在Jenkins 控制台中看不到任何内容,因为silent 模式不适用于ISDeploymentWizard。语法中的任何错误都会导致遥控器中的弹出窗口出现错误。有什么想法可以让它也出现在我的控制台中吗?在目前的情况下,作业只是卡在这个阶段,我不得不手动中止它。 我也尝试使用powershell timeout,但效果不佳。有什么想法吗?

我找到的最相关的主题是 this 一个来自 2015 年,建议的另一种方式 here 也来自 2015 年

【问题讨论】:

    标签: powershell ssis jenkins-pipeline


    【解决方案1】:

    ISDeploymentWizard 做它该做的事。它是一个预构建的可执行文件,看起来您无法对错误处理做太多事情。

    我建议采用不同的方法并使用 Managed Object Model 或 TSQL 部署路线。这样,您就可以控制您的错误条件会发生什么。

    托管对象模型

    我的 PS 部署代码如下所示。它不包括参数等,但它是一个开始,您可以尝试/捕捉DeployProject 部分

    [Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Management.IntegrationServices") | Out-Null
    
     
    #this allows the debug messages to be shown
    $DebugPreference = "Continue"
    
    # Retrieves a 2012 Integration Services CatalogFolder object
    # Creates one if not found
    Function Get-CatalogFolder
    {
        param
        (
            [string] $folderName
        ,   [string] $folderDescription
        ,   [string] $serverName = "localhost\dev2012"
        )
    
        $connectionString = [String]::Format("Data Source={0};Initial Catalog=msdb;Integrated Security=SSPI;", $serverName)
    
        $connection = New-Object System.Data.SqlClient.SqlConnection($connectionString)
    
        $integrationServices = New-Object Microsoft.SqlServer.Management.IntegrationServices.IntegrationServices($connection)
        # The one, the only SSISDB catalog
        $catalog = $integrationServices.Catalogs["SSISDB"]
    
        $catalogFolder = $catalog.Folders[$folderName]
    
        if (-not $catalogFolder)
        {
            Write-Debug([System.string]::Format("Creating folder {0}", $folderName))
            $catalogFolder = New-Object Microsoft.SqlServer.Management.IntegrationServices.CatalogFolder($catalog, $folderName, $folderDescription)
            $catalogFolder.Create()
        }
        else
        {
            $catalogFolder.Description = "Modified for SO2"
            $catalogFolder.Alter()
            Write-Debug([System.string]::Format("Existing folder {0}", $folderName))
        }
    
        return $catalogFolder
    }
    
    # Deploy an ispac file into the SSISDB catalog
    Function Deploy-Project
    {
        param
        (
            [string] $projectPath
        ,   [string] $projectName
        ,   $catalogFolder
        )
    
        # test to ensure file exists
        if (-not $projectPath -or  -not (Test-Path $projectPath))
        {
            Write-Debug("File not found $projectPath")
            return
        }
    
        Write-Debug($catalogFolder.Name)
        Write-Debug("Deploying $projectPath")
    
        # read the data into a byte array
        [byte[]] $projectStream = [System.IO.File]::ReadAllBytes($projectPath)
    
        # $ProjectName MUST match the value in the .ispac file
        # else you will see 
        # Failed to deploy the project. Fix the problems and try again later.:The specified project name, test, does not match the project name in the deployment file.
        $projectName = "HR Import Raw"
        $projectName = "SSIS2012"
    
        $project = $catalogFolder.DeployProject($projectName, $projectStream)
    }
    
    
    $isPac = "C:\Dropbox\Sandbox\SSIS2012\SSIS2012\bin\DEV2012\SSIS2012.ispac"
    $folderName = "SSIS2012"
    $folderDescription = "Prod deployment check"
    
    $serverName = "localhost\dev2012"
    
    $catalogFolder = Get-CatalogFolder $folderName $folderDescription $serverName
    
    Deploy-Project $isPac $projectName $catalogFolder
    

    https://techcommunity.microsoft.com/t5/sql-server-integration-services/a-glimpse-of-the-ssis-catalog-managed-object-model/ba-p/387892

    TSQL 部署

    DECLARE
        @folder_name nvarchar(128) = 'TSQLDeploy'
    ,   @folder_id bigint = NULL
    ,   @project_name nvarchar(128) = 'TSQLDeploy'
    ,   @project_stream varbinary(max)
    ,   @operation_id bigint = NULL;
    
    -- Read the zip (ispac) data in from the source file
    SELECT
        @project_stream = T.stream
    FROM
    (
        SELECT 
            *
        FROM 
            OPENROWSET(BULK N'C:\sandbox\SSDTDeploy\TSQLDeploy\bin\Development\TSQLDeploy.ispac', SINGLE_BLOB ) AS B
    ) AS T (stream);
    
    -- Test for catalog existences
    IF NOT EXISTS
    (
        SELECT
            CF.name
        FROM
            catalog.folders AS CF
        WHERE
            CF.name = @folder_name
    )
    BEGIN
        -- Create the folder for our project
        EXECUTE [catalog].[create_folder] 
            @folder_name
        ,   @folder_id OUTPUT;
    END
    
    -- Actually deploy the project
    EXECUTE [catalog].[deploy_project] 
        @folder_name
    ,   @project_name
    ,   @project_stream
    ,   @operation_id OUTPUT;
    
    -- Check to see if something went awry
    SELECT
        OM.* 
    FROM
        catalog.operation_messages AS OM
    WHERE
        OM.operation_id = @operation_id;
    

    我假设 jenkins 允许使用 PS 或 sql 命令,因此这些命令应该可以工作,并在检测部署问题然后解决它们方面为您提供更大的灵活性。

    【讨论】:

      猜你喜欢
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      相关资源
      最近更新 更多