使用WithCredentials和Powershell的声明式Jenkins

yxyvkwin  于 2023-05-06  发布在  Jenkins
关注(0)|答案(2)|浏览(196)
stage('Deployment') {
steps {
    withCredentials([string(credentialsId: 'Test', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
        powershell '$pass = ConvertTo-SecureString -AsPlainText "${PASSWORD}" -Force'
        powershell '$SecureString = "${pass}"'
        powershell '$MySecureCreds = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList "${USERNAME}","${SecureString}"'
        powershell 'New-PSSession -ComputerName 192.123.123.123 -Credential "${MySecureCreds}"'
     }
     powershell 'Copy-Item "${ARTIFACT_PATH}" -Destination "${DESTINATION_PATH}" -ToSession -Recurse -Force'
     powershell 'Start-Process "iisreset.exe" -NoNewWindow -Wait'
     powershell 'Remove-Website -Name WebCareRecord'
     powershell 'Remove-WebAppPool WebCareRecord'
     powershell 'Get-WebBinding -Port 85 -Name WebCareRecord | Remove-WebBinding'
     powershell 'Start-Process "iisreset.exe" -NoNewWindow -Wait'
     powershell 'New-WebAppPool -Name WebCareRecord'
     powershell 'Set-ItemProperty "${POOL_PATH}" managedPipelineMode 0'
     powershell 'Set-ItemProperty "${POOL_PATH}" managedRuntimeVersion ""'
     powershell 'New-WebSite -Name WebCareRecord -Port 85 -PhysicalPath "${PHYSICAL_PATH}" -ApplicationPool WebCareRecord'
     powershell 'Start-Process "iisreset.exe" -NoNewWindow -Wait'
 }
}

我正在尝试获取Jenkins凭据ID,对其进行保护,并使用相同的凭据登录到远程服务器。登录到远程服务器后,将工件从Jenkins服务器复制到远程服务器。为此我得到错误
org.jenkinsci.plugins.credentialsbinding.impl.CredentialNotFoundException:凭据“Test”的类型为“Username with password”,其中应为“org.jenkinsci.plugins. plaincredit.StringCredentials”。

dsf9zpds

dsf9zpds1#

可能会有很多问题,我现在正在经历类似的过程,并感受到在groovy中正确使用powershell的痛苦,所以这是我到目前为止注意到的:
你在一个powershell步骤中创建了一个$pass变量,然后试图在另一个powershell步骤中访问它,我不认为它会以这种方式工作,因为另一个步骤可能会在不同的powershell会话中启动,并且powershell变量不再存在。
我会尝试这样的东西:

stage('Deployment') {
  steps {
    withCredentials([string(credentialsId: 'Test', usernameVariable: 'USERNAME', passwordVariable: 'PASSWORD')]) {
        powershell """
          \$pass = ConvertTo-SecureString -AsPlainText $PASSWORD -Force
          \$SecureString = \$pass
        """
    }
  }
}

首先,使用多行语法""",这样不同的powershell语句在同一个会话中,并且这些变量可以跨powershell命令使用。
第二,对powershell变量\$pass\$SecureString进行转义,这样groovy就不会尝试展开它们,并且不会对实际引用groovy变量(如$PASSWORD)的变量进行转义。请注意,$PASSWORD不一定要用引号括起来,因为powershell参数可以接受不带引号的字符串,但如果在方法中使用了这一点,则应该将其放在引号SomePowershellMethod("$GROOVYVAR")中。
一般来说,我建议在故障排除时回显每个变量,以查看是否得到了预期的结果。

j5fpnvbx

j5fpnvbx2#

我喜欢简短而准确的回答。
使用以下内容:

stage('Deployment') {
        steps {
            withCredentials([usernamePassword(credentialsId: 'UatServer', passwordVariable: 'passVar', usernameVariable: 'userVar')]) {
                powershell '''
                    $passVar = ConvertTo-SecureString "$($ENV:passVar)" -AsPlainText -Force
                    $credential = New-Object System.Management.Automation.PSCredential ("$ENV:userVar", $passVar)
                    $session = New-PSSession -ComputerName x.x.x.x -Credential $credential
                    Invoke-Command -Session $session -ScriptBlock {hostname}
                '''
            }
            
        }
    }

相关问题