[PowerShell] แก้ไขไฟล์ App.config ใน Jenkins Pipeline

หลังจากทำมี Tools ที่ กำหนดค่าที่เดียว แต่สามารถใช้งานไปได้ทุก Application แล้ว (Universal Configuration) แต่ทำไมคนอื่นถึงไม่ค่อยใช้งานกัน เราก็ถึงบ้างอ้อทันที อ๋อขี้เกียจไปแก้ app.config หรือ web.config นั้นเอง ด้วยความที่ระบบมันมี Base 3 สำหรับลูกค้า 3 กลุ่ม แต่ใช้ Code ชุดเดียวกันนะครับ มันจึงต้องมีการเตรียมค่าตั้งต้นกันก่อนนั้นเองครับ อาทิ เช่น

  • Base AMC / INS ตัว Application อ่านค่าจาก HKEY_LOCALMACHINE
  • Base TSY ตัว Application อ่านค่าจาก HKEY_LOCALUSER

เนื่องจากทีม Implement ขี้เกียจแก้ แต่ก็ไม่ได้บอกนะ 5555 ผมเลยทำให้มันเสร็จไปจากเครื่องบิ้ว Jenkins เลยดีกว่าครับ แต่มันจะมี 2 ประเด็น

  • แก้ไขไฟล์ app.config หรือ web.config อย่างไร
  • เอาไปใช้งานใน Jenkins Pipeline ได้อย่างไร

กลับมาประเด็นแรกก่อน "แก้ไขไฟล์ app.config หรือ web.config อย่างไร" อันนี้ผมมีทางออกแล้วครับใช้พลังหอย หมีบๆ PowerShell ของ Microsoft ครับ เพราะ เขียน่าย อ่านสะดวก แถมใช้เรียกใช้ Library ของ .NET Framework ได้ด้วยครับ ลองมาดู Code ที่เขียนกันเลยครับ (ไฟล์ REPLACE_APPCONFIG.ps1)

Set-ExecutionPolicy Unrestricted
$FILEPATH = $args[0]
$REPLACEKEY = $args[1]
$REPLACEVALUE = $args[2]


Function ReplaceAppConfig($pFilePath, $pKey, $pValue)
{
    #Read XML
    $doc = [Xml](Get-Content $pFilePath)

    #$obj = $doc.configuration.appSettings.add | where {$_.Key -eq $pKey }
    #$obj.value = $pValue

    $doc.configuration.appSettings.add | foreach { if ($_.key -eq $pKey) { $_.value = $pValue } }

    $doc.Save($pFilePath)
}

ReplaceAppConfig $FILEPATH $REPLACEKEY $REPLACEVALUE

สำหรับการเรียกใช้งานก็ง่ายครับ เพราะ ไฟล์ REPLACE_APPCONFIG.ps1 มี 3 Parameter ได้แก่

  • Path ของ app.config หรือ web.config
  • Key ที่ต้องใช้หา เช่น WriteToLocalMachine
  • Value ค่าที่ต้องการเปลี่ยน เช่น true

ประเด็นถัดมา "เอาไปใช้งานใน Jenkins Pipeline ได้อย่างไร" ใช้งานได้ง่ายครับ เพราะ Plugin Powershell ของ Jenkins นั้น Support Pipeline แล้วครับ เพียงแค่ประกาศส่วนของ Powershell และเรียกใช้งานครับ ตามตัวอย่างเลย

...
stage('Build#1-32 Bits'){
	steps {
		...
	}
}		
stage('Build#2-64 Bits'){
	steps {
		...
	}
}
stage('Finallize For Each Base'){
	//ตรวจสอบถ่้า DIRECTIVE เป็น AMC หรือ INS ค่อยทำ Step ถัดไป
	when {
		expression { params.DIRECTIVE == 'AMC' || params.DIRECTIVE == 'INS' }
	}
	steps {
		echo '===> Update BUC for AMC/INS ....'
		//ส่งค่าตัวแปร จาก Pipeline ($params.BASEOUTPUT) ไปยัง PowerShell (APPCONFIGPATH)
		withEnv(["APPCONFIGPATH=$params.BASEOUTPUT"]) {
			//ประกาศตัวแปร และเรียกใช้งาน
			powershell(script: '''
				$APPBUCFILEPATH = "$env:APPCONFIGPATH\\Buc\\Wmsl.Incubator.Configuration.UI.exe.config"
				$REPLACEKEY = "WriteToLocalMachine"
				$REPLACEVALUE = "true"
				D:\\06Utility\\01BuildScript\\WMSL-APP\\REPLACE_APPCONFIG.ps1 $APPBUCFILEPATH $REPLACEKEY $REPLACEVALUE
				''')
			}
		echo '===> Update BUC for AMC/INS ....'
	}
}
	

Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts to your email.