2015-07-10 12 views
9

इसलिए मैंने अपने DACPAC schema via Octopus को तैनात करने में कामयाब रहा है। मैं एक deploy.ps1 स्क्रिप्ट का उपयोग कर रहा हूं .NET ऑब्जेक्ट्स के साथ इंटरैक्टिंग जैसे आलेख वर्णन करता है।DacSevices कैप्चर करने के लिए कैसे करें। आउटपुट?

मैं अपने ऑक्टोपस लॉग में sqlcmd से प्राप्त "मानक आउटपुट" सहित "तैनाती प्रक्रिया" को अधिक पारदर्शी बनाना चाहता हूं। मैं जेनरेट किए गए स्कीमा संशोधन संदेशों के साथ-साथ किसी भी कस्टम माइग्रेशन माइग्रेशन संदेशों की तलाश कर रहा हूं जो हमारे डेवलपर्स ने प्री/पोस्ट स्क्रिप्ट में डाल दिए हैं।

एकमात्र कामकाज मैं सोच सकता हूं कि पहले डीएसीपीएसी सेवाओं के साथ स्क्रिप्ट उत्पन्न करना है और फिर इसे sqlcmd.exe के साथ चलाएं। कोई विचार?

उत्तर

19

समाधान मिला, अगर कोई और इस पर चलता है तो पोस्टिंग। आपको बस अपने DacService के Message event पर सब्सक्राइब करने की आवश्यकता है।

सी # नमूना:

var services = new Microsoft.SqlServer.Dac.DacServices("data source=machinename;Database=ComicBookGuy;Trusted_connection=true"); 

var package = Microsoft.SqlServer.Dac.DacPackage.Load(@"C:\Database.dacpac"); 

var options = new Microsoft.SqlServer.Dac.DacDeployOptions(); 
options.DropObjectsNotInSource = true; 
options.SqlCommandVariableValues.Add("LoginName", "SomeFakeLogin"); 
options.SqlCommandVariableValues.Add("LoginPassword", "foobar!"); 

services.Message += (object sender, Microsoft.SqlServer.Dac.DacMessageEventArgs eventArgs) => Console.WriteLine(eventArgs.Message.Message); 

services.Deploy(package, "ComicBookGuy", true, options); 

Powershell नमूना (ऑक्टोपस मूंछ द्वारा निष्पादित):

# This script is run by Octopus on the tentacle 
$localDirectory = (Get-Location).Path 
$tagetServer = $OctopusParameters["SQL.TargetServer"] 
$databaseName = "ComicBookGuy" 

Add-Type -path "$localDirectory\lib\Microsoft.SqlServer.Dac.dll" 

$dacServices = New-Object Microsoft.SqlServer.Dac.DacServices ("data source=" + $tagetServer + ";Database=" + $databaseName + "; Trusted_connection=true") 
$dacpacFile = "$localDirectory\Content\Unity.Quotes.Database.dacpac" 

$dacPackage = [Microsoft.SqlServer.Dac.DacPackage]::Load($dacpacFile) 

$options = New-Object Microsoft.SqlServer.Dac.DacDeployOptions 
$options.SqlCommandVariableValues.Add("LoginName", $OctopusParameters["SQL.LoginName"]) 
$options.SqlCommandVariableValues.Add("LoginPassword", $OctopusParameters["SQL.LoginPassword"]) 
$options.DropObjectsNotInSource = $true 

Register-ObjectEvent -InputObject $dacServices -EventName "Message" -Action { Write-Host $EventArgs.Message.Message } | out-null 

$dacServices.Deploy($dacPackage, $databaseName, $true, $options) 

powershell संस्करण मैं काम "Add_EventName" नहीं मिल सका में शैली इवेंट अधिसूचना काम कर रहा है इसलिए मुझे क्लंकी सेमीडलेट का उपयोग करना पड़ा। भावहीन।

+0

मैं बस की कोशिश की और यह के रूप में सी # और DacPac विधानसभा का उपयोग कर की उम्मीद काम करता है। बहुत बढ़िया जवाब! – Raffaeu

+0

यह ध्यान देने योग्य है कि रजिस्टर-ऑब्जेक्टइवेंट असीमित रूप से काम करता है, इसलिए, मुख्य स्क्रिप्ट सभी संदेशों को संसाधित करने के लिए रजिस्टर-ऑब्जेक्टइवेंट लाइन की प्रतीक्षा नहीं करेगी और सभी घटनाओं को प्रदर्शित करने से पहले समाप्त हो सकती है। – Rod

0

dacpac को तैनात करने के लिए sqlcmd के बजाय sqlpackage का उपयोग करें।

नवीनतम संस्करण यहाँ प्राप्त करें: https://msdn.microsoft.com/en-us/mt186501

$sqlpackage = "C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\Extensions\Microsoft\SQLDB\DAC\120\sqlpackage.exe" 

यह होगा कंसोल पर स्वचालित रूप से आउटपुट त्रुटियों। हम टीएफएस बिल्ड परिभाषा और कॉल पावरहेल का उपयोग करते हैं और यह तैनाती के दौरान हुई त्रुटियों को प्रदर्शित करने में सक्षम है।

उपयोग:

& $sqlpackage /Action:Publish /tsn:$dbServer /tdn:$database /sf:$mydacpac/pr:$dbProfile /variables:myVariable=1 
+1

यह एक स्मार्ट विकल्प है जिसे मैं एपीई को कॉल करने के बजाय एपीआई/पावरहेल रूट के साथ गया क्योंकि इसे निर्भरता के थोड़ा छोटे सेट की आवश्यकता थी ... हालांकि पूर्व-निरीक्षण में लिपि में आवश्यक अतिरिक्त जटिलता EXE होने से अधिक होगी। इनपुट के लिए धन्यवाद! –

+0

डेविड, हाँ एपीआई भी अच्छी तरह से काम करता है। जब हम बैकएंड से एक स्क्रिप्ट निष्पादित करते हैं तो हम इसका उपयोग करते हैं, लेकिन हम मुख्य रूप से निम्न वातावरण में स्वयं-सेवा तैनाती का उपयोग करते हैं और टीएफएस बिल्ड परिभाषाएं त्रुटियों को सही तरीके से कैप्चर करने में सक्षम होती हैं। शक्तियों से सीधे EXE चलाना अच्छा काम नहीं करता है। – Vinnie

संबंधित मुद्दे