<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Automation Tools &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<atom:link href="https://myifew.com/tag/automation-tools/feed/" rel="self" type="application/rss+xml" />
	<link>https://myifew.com</link>
	<description></description>
	<lastBuildDate>Fri, 11 Dec 2020 13:12:09 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://myifew.com/wp-content/uploads/2018/07/cropped-logo6-ts-32x32.png</url>
	<title>Automation Tools &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<link>https://myifew.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>สร้างเว็บไซต์บน Kubernetes ง่ายๆ โดยไม่ต้องวางระบบเองด้วย DigitalOcean App Platform</title>
		<link>https://myifew.com/5748/how-to-use-kubernetes-on-digitalocean-app-platform/</link>
					<comments>https://myifew.com/5748/how-to-use-kubernetes-on-digitalocean-app-platform/#comments</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Fri, 11 Dec 2020 13:05:17 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Automation Tools]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[DigitalOcean]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Git Deployment]]></category>
		<category><![CDATA[PaaS]]></category>
		<category><![CDATA[Platform as a Service]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5748</guid>

					<description><![CDATA[วันนี้เพิ่งได้เข้าไปดูบัญชี DigitalOcean ตัวเอง กะว่าจะปรับเปลี่ยนแพ็คเกจอะไรนิดหน่อย พบว่าเขามีออกบริการตัวใหม่มาตัวหนึ่ง (จริงๆ ออกมาตั้งแต่เดือนตุลาคมแล้ว กระผมรู้ช้าเอง T-T) ชื่อว่า DigitalOcean App Platform ลองอ่านคอนเซ็ปตอนแรกตื่นเต้นมากครับ นึกว่า DigitalOcean ทำ Serverless&#8230;]]></description>
										<content:encoded><![CDATA[
<p>วันนี้เพิ่งได้เข้าไปดูบัญชี <a rel="noreferrer noopener" href="https://m.do.co/c/96fec482c76f" data-type="URL" data-id="https://m.do.co/c/96fec482c76f" target="_blank"><strong>DigitalOcean</strong></a> ตัวเอง กะว่าจะปรับเปลี่ยนแพ็คเกจอะไรนิดหน่อย พบว่าเขามีออกบริการตัวใหม่มาตัวหนึ่ง (จริงๆ ออกมาตั้งแต่เดือนตุลาคมแล้ว กระผมรู้ช้าเอง T-T) ชื่อว่า <strong><a rel="noreferrer noopener" href="https://m.do.co/c/96fec482c76f" data-type="URL" data-id="https://m.do.co/c/96fec482c76f" target="_blank">DigitalOcean App Platform</a></strong> </p>



<p>ลองอ่านคอนเซ็ปตอนแรกตื่นเต้นมากครับ นึกว่า DigitalOcean ทำ Serverless ออกมาแล้ว แต่จริงๆเป็น PaaS (Platform as a Service) ตัวหนึ่ง ที่ช่วยสร้าง Infrastructure ต่างๆ ให้โดยที่เราไม่ต้องจัดการอะไรเองเลย แต่ก็ยังตื่นเต้นอยู่นะ เพราะมันทำด้วย Kubernetes ที่ Scaling ได้ และรองรับภาษาหลายตัว รวมถึง PHP ด้วยจ้า</p>



<span id="more-5748"></span>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1200" height="551" src="https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-1200x551.jpeg" alt="" class="wp-image-5284" srcset="https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-1200x551.jpeg 1200w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-1024x470.jpeg 1024w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-768x352.jpeg 768w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-700x321.jpeg 700w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ-600x275.jpeg 600w, https://myifew.com/wp-content/uploads/2019/02/1_dAnZk19kGszKTvAgag31sQ.jpeg 1600w" sizes="(max-width: 1200px) 100vw, 1200px" /><figcaption>ภาพอธิบาย PaaS จาก:<br><a href="https://medium.com/@sdorzak/why-serverless-is-the-new-black-e4ff9e9947e0">https://medium.com/@sdorzak/why-serverless-is-the-new-black-e4ff9e9947e0</a></figcaption></figure>



<h2 class="wp-block-heading">มีอะไรน่าสนใจใน <strong>DigitalOcean App Platform</strong></h2>



<p>ก่อนจะพาดูผมทดสอบ ขอขายของให้สุดก่อน ว่าทำไมผมถึงชอบมัน และตื่นเต้นอยากลองใช้</p>



<ol class="wp-block-list"><li><strong>ราคาถูก</strong> &#8211; คนใช้ DigitalOcean อย่างผมจะรู้ว่าที่นี่ราคาถูกดี รวมถึงเจ้าระบบ App Platform ด้วย ที่เริ่มต้นเพียง 5$ ต่อเดือน (แต่ใช้ ฟรี ได้นะ ถ้าเป็น static files)</li><li><strong>รองรับหลายภาษาเขียนโปรแกรมและเฟรมเวิร์ก</strong> &#8211;  เช่น Node.js, Python, Django, Go, PHP, Laravel, React, Ruby, Ruby on Rails, Gatsby, Hugo แต่ถ้าอยากใช้นอกเหนือกว่านี้ เช่น .NET Core ก็ทำเป็น Docker Container ไปใช้ได้ รวมถึงทำไต์ง่ายๆ เป็น static sites หรือ CDN ก็ได้</li><li><strong>Scale ได้ง่าย</strong> &#8211; เพราะทำงานอยู่บน Kubernetes clusters จึงทำให้ รองรับการ Scale-out หรือ Scale-up ได้ เพียงแค่กดเปลี่ยนแพ็คเกจของ App หรือกดเพิ่มลดจำนวน App ในหน้า Dashboard ได้เลย</li><li><strong>Zero Downtime</strong> &#8211; ในขณะที่เรา Scale-out หรือ Scale-up ตัว Server เราอยู่ จะไม่กระทบกับเว็บไซต์เรา ผู้เข้าเว็บไซต์ยังทำงานได้ปกติ</li><li><strong>Automated Deployment </strong>&#8211; มันจะเชื่อมต่อกับ Github ของเรา (อนาคตจะต่อกับ Bitbucket,GitLab ได้) และเมื่อมีการ Push Code ขึ้นไป ก็จะทำการ Deploy ทันทีที่ App Platform ทำให้เราเห็นการเปลี่ยนแปลงได้ทันทีบนหน้าเว็บไซต์เรา</li></ol>



<p>ตั้งแต่ข้อ 3-5 ถ้าเราจะวางระบบ Infrastructure ให้ได้แบบนี้ คงไม่ใช่เรื่องง่ายๆเลย  (อย่างน้อยก็สำหรับผมคนหนึ่งแล้วหละ) </p>



<p>ปล. จะเรียกว่าข้อเสียไหมไม่รู้นะครับ แต่ตอนนี้ยังไม่มีบริการทางฝั่ง Asia ให้เลือก ดังนั้นอาจมีผลกับความเร็วเล็กน้อย, รวมถึงยังไม่มีฟีเจอร์ให้ใช้งานอะไรมาก จนถึงขั้นกำหนด Pipeline หรือลงรายละเอียด จนถึงขั้นเป็น CI/CD แบบใน Jenkins ได้</p>



<figure class="wp-block-image size-large"><img decoding="async" width="668" height="592" src="https://myifew.com/wp-content/uploads/2020/12/do-app-region.png" alt="" class="wp-image-5760"/></figure>



<h2 class="wp-block-heading">แนะนำให้ศึกษาเรื่องเหล่านี้ก่อน</h2>



<p>บริการนี้เรียกได้ว่าเป็น Automated Deployment ดังนั้น หากจะนำไปใช้งานจริง ควรจะเข้าใจที่มาที่ไปไว้บ้าง ว่า Best Practice ที่ควรทำเป็นอย่างไร เพราะหากอ่านแล้วและนำไปใช้จริง อาจจะเกิดความเสียหายได้ ดังนั้น ผมแนะนำให้ไปอ่านเรื่องราวนี้ก่อนครับ</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" href="https://myifew.com/5080/the-twelve-factors/" data-type="URL" data-id="https://myifew.com/5080/the-twelve-factors/" target="_blank">สรุปแนวคิด The Twelve Factors ในภาพเดียวจบ</a></li><li><a rel="noreferrer noopener" href="https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/" data-type="URL" data-id="https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/" target="_blank">เริ่มต้นทำ CI/CD – Automation Deployment ด้วย Git และ Jenkins (3 – จบ</a><a href="https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/" data-type="URL" data-id="https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/">)</a></li><li><a rel="noreferrer noopener" href="https://myifew.com/4455/design-and-develop-code-for-testable/#more-4455" data-type="URL" data-id="https://myifew.com/4455/design-and-develop-code-for-testable/#more-4455" target="_blank">ต้องคิดอย่างไร รู้อะไร และทำอย่างไร เพื่อให้เกิด Automated Test</a></li><li><a rel="noreferrer noopener" href="https://myifew.com/4414/design-project-code-structure-for-testable/" data-type="URL" data-id="https://myifew.com/4414/design-project-code-structure-for-testable/" target="_blank">จะทำระบบให้รองรับ Automated Test ได้อย่างไร (Testable)</a> </li><li><a rel="noreferrer noopener" href="https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/" data-type="URL" data-id="https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/" target="_blank">มาทำความรู้จักกับ Serverless และ AWS Lambda ฉบับคนคิดจะใช้</a> (ไม่เกี่ยวแต่อยากนำเสนอ แหะๆ)</li></ul>



<h2 class="wp-block-heading">ทดสอบ <strong>DigitalOcean App Platform</strong> กันหน่อย</h2>



<p>ไปสร้าง Repository บน GitHub ไว้ และนำไฟล์โค้ดของเว็บไซต์เรา push ขึ้นไปรอไว้ก่อน ในที่นี้ผมใส่ index.html ไว้</p>



<figure class="wp-block-image size-large"><img decoding="async" width="2840" height="1298" src="https://myifew.com/wp-content/uploads/2020/12/do-app-first-deploy-git.png" alt="" class="wp-image-5756"/></figure>



<p>เข้า DigitalOcean และไปที่เมนู App จากนั้นกด Launch Your App (ใครยังไม่ได้สมัคร ก็ไปสมัครสมาชิก <a rel="noreferrer noopener" href="https://m.do.co/c/96fec482c76f" target="_blank"><strong>DigitalOcean</strong></a> กันก่อนนะ)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2880" height="1742" src="https://myifew.com/wp-content/uploads/2020/12/DigitalOcean-App-Platform.png" alt="" class="wp-image-5751"/></figure>



<p>สำหรับครั้งแรก จะเจอให้ Link Account กับ GitHub ก่อนนะครับ</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2880" height="1432" src="https://myifew.com/wp-content/uploads/2020/12/Launch-App-DigitalOcean-App-Platform.png" alt="" class="wp-image-5770"/></figure>



<p>เมื่อ Link Account GitHub เสร็จ ก็เลือก Repository ที่เราต้องการใช้สร้าง</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2880" height="1432" src="https://myifew.com/wp-content/uploads/2020/12/Launch-App-DigitalOcean-App-Platform-Git.png" alt="" class="wp-image-5769"/></figure>



<p>จากนั้นเลือก Region ซึ่งปัจจุบันตอนผมทดสอบ ยังมีเพียงฝั่งทวีป America และ Europe เท่านั้น, จากนั้นเราเลือก Git Branch ที่ต้องการเชื่อมโยงการ Deploy และเลือกว่าจะให้ Deploy อัตโนมัติทันทีเมื่อมีการ Push Code เข้าสู่ Branch นั้น</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2880" height="2372" src="https://myifew.com/wp-content/uploads/2020/12/Launch-App-DigitalOcean-App-Platform-create.png" alt="" class="wp-image-5768"/></figure>



<p>มาถึงส่วนสำคัญ คือการ Config App ของเรา ว่าจะตั้งค่าอย่างไรบ้าง ดังนี้</p>



<ul class="wp-block-list"><li><strong>Type</strong> &#8211; คือประเภทของ APP ซึ่งในที่นี้ระบบมองว่าโค้ดผมเป็น HTML มันเลยเลือกให้เป็น Static Site ให้</li><li><strong>HTTP Routes</strong> &#8211; กำหนด Path ในการเข้าถึง เช่น / จะวิ่งเข้ามาที่ App นี้ หรือจะตั้งว่า /aabbcc ก็ได้ ดังนั้นใครเข้า www.web.com/aabbcc ก็จะเข้ามาที่ App นี้</li><li><strong>Environment Variables</strong> &#8211; ตัวแปรที่เก็บไว้ใช้ในระบบ เช่น เก็บ User/Password Database  ไว้ที่นี่เป็นต้น</li><li><strong>Build Command</strong> &#8211; เป็น Shell Script จะใส่อะไรก็ได้ หรือเว้นไว้ก้ได้</li><li><strong>Output Directory</strong> &#8211; ที่เก็บผลลัพธ์หลังจาก build แล้ว </li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2880" height="3022" src="https://myifew.com/wp-content/uploads/2020/12/Launch-App-DigitalOcean-App-Platform-config.png" alt="" class="wp-image-5767"/></figure>



<p>ส่วนปุ่มด้านล่าง Add a Database คือการให้ App นี้อนญาตให้เชื่อมต่อกับ Database อะไรได้บ้าง หรือจะสร้างใหม่เลยก็ได้นะ</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2840" height="1308" src="https://myifew.com/wp-content/uploads/2020/12/do-app-add-database.png" alt="" class="wp-image-5752"/></figure>



<p>ขั้นตอนสุดท้ายคือการเลือกแพ็คเกจใช้งาน ซึ่งในที่นี้เป็น Static Site เลยทำให้ใช้งานได้ฟรีครับ แต่ถ้าเราใช้กับพวก Dynamic Script อย่าง Node.js, PHP, Docker ก็จะต้องใช้เป็น Basic หรือ Pro เท่านั้น แต่ก็ถือว่าเป็นการเริ่มต้นใช้งานที่ถูกมากๆ แค่ 5$ เท่านั้น (แต่แพ็คเกจ Basic ทาง DigitalOcean แนะนำให้ใช้เป็นระบบสำหรับทดสอบ หรือ Prototype จะดีกว่านะ)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2880" height="3202" src="https://myifew.com/wp-content/uploads/2020/12/Launch-App-DigitalOcean-App-Platform-choose-package.png" alt="" class="wp-image-5766"/></figure>



<p>หลังจากกด Launch Starter App แล้ว รอสักครู่ มันจะสร้าง Instant และเมื่อเสร็จแล้ว ก็จะเห็น URL สำหรับการใช้งาน </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2518" height="512" src="https://myifew.com/wp-content/uploads/2020/12/do-app-create-success-have-url.png" alt="" class="wp-image-5754"/></figure>



<p>เมื่อทดลองเข้าไปดูตาม URL ก็จะเห็นหน้าที่ผมไว้สร้างไว้บน GitHub แล้ววว</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2870" height="1560" src="https://myifew.com/wp-content/uploads/2020/12/do-app-first-deploy-result.png" alt="" class="wp-image-5757"/></figure>



<p>แต่หน้าตามันดูห่วยๆ เนอะ คราวนี้ผมจะสร้าง css file เพิ่ม</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2044" height="1492" src="https://myifew.com/wp-content/uploads/2020/12/do-app-second-deploy-added-css.png" alt="" class="wp-image-5761"/></figure>



<p>และทำการ push code ขึ้นสู่ GitHub</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="914" height="424" src="https://myifew.com/wp-content/uploads/2020/12/do-app-second-deploy-added-css-push.png" alt="" class="wp-image-5764"/></figure>



<p>มีไฟล์ css เพิ่มมาใน GibHub แล้ว</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2832" height="1416" src="https://myifew.com/wp-content/uploads/2020/12/do-app-second-deploy-added-css-github.png" alt="" class="wp-image-5762"/></figure>



<p>พอผมกลับไปดูหน้าเว็บไซต์ ว้าวว มันเป็นระเบียบสวยงามขึ้นแล้ววว </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2870" height="1566" src="https://myifew.com/wp-content/uploads/2020/12/do-app-second-deploy-result.png" alt="" class="wp-image-5765"/></figure>



<p>ไปดูรายการ Deployments มีการเก็บบันทึกไว้ว่ามีการ Deploy อะไรไปบ้าง</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2488" height="588" src="https://myifew.com/wp-content/uploads/2020/12/do-app-second-deploy-added-css-log.png" alt="" class="wp-image-5763"/></figure>



<h2 class="wp-block-heading">สรุป</h2>



<p>อย่างที่ผมเกริ่นไปตอนแรก การจะวางระบบ Infrastructure ให้ได้แบบนี้ หรือเริ่มใช้ Kubernetes คงไม่ใช่เรื่องง่ายๆเลยสำหรับผู้ใช้งานทั่วไป หรือโปรแกรมเมอร์หลายๆคน รวมถึงผมด้วย ต่อให้สร้างขึ้นมาได้ แต่การดูแลรักษาเป็นเรื่องที่ปวดหัวมาก เช่น ถ้ามีผู้ใช้เข้ามาสูงมากๆ หรือถ้าโดน DDoS โจมตี เป็นต้น</p>



<p>ดังนั้นการมีบริการ PaaS ลักษณะนี้ขึ้นมา ก็ช่วยทำให้เราสะดวกมากขึ้น และทำให้โปรแกรมเมอร์อย่างเรา สามารถเป็น DevOps ได้เองอย่างไม่ยากเย็นนัก</p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5748/how-to-use-kubernetes-on-digitalocean-app-platform/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>มาลอง Code Coverage บน  .Net Core 2+ ด้วย coverlet</title>
		<link>https://myifew.com/5145/code-coverage-on-net-core-2-via-coverlet/</link>
					<comments>https://myifew.com/5145/code-coverage-on-net-core-2-via-coverlet/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 20 Dec 2018 09:09:35 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[Automation Testing]]></category>
		<category><![CDATA[Automation Tools]]></category>
		<category><![CDATA[Code Coverage]]></category>
		<category><![CDATA[Code Quality]]></category>
		<category><![CDATA[Testing Tools]]></category>
		<category><![CDATA[Unit Test]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5145</guid>

					<description><![CDATA[ใครที่เขียนโค้ดด้วย .Net Core 2+ และทำ CI/CD บน Linux ค่อนข้างยุ่งยากหน่อย เพราะหาเครื่องมือสำหรับตรวจสอบ Code Coverage ฟรีๆ ดีๆ ได้น้อยเหลือเกิน ที่ผมเคยใช้ดีๆ ก็มี minicover&#8230;]]></description>
										<content:encoded><![CDATA[
<p>ใครที่เขียนโค้ดด้วย .Net Core 2+ และทำ CI/CD บน Linux ค่อนข้างยุ่งยากหน่อย เพราะหาเครื่องมือสำหรับตรวจสอบ Code Coverage ฟรีๆ ดีๆ ได้น้อยเหลือเกิน ที่ผมเคยใช้ดีๆ ก็มี <a rel="noreferrer noopener" aria-label="minicover (opens in a new tab)" href="https://github.com/lucaslorentz/minicover" target="_blank">minicover</a> จนเพิ่งมาลองเล่นอีกตัว ชื่อ <a rel="noreferrer noopener" aria-label="coverlet (opens in a new tab)" href="https://github.com/tonerdo/coverlet" target="_blank">coverlet</a> ใช้งานได้ง่ายกว่าเยอะมาก เพราะมันทำงานร่วมกับ MSTest ได้เลย</p>



<span id="more-5145"></span>



<h2 class="wp-block-heading">วิธีติดตั้ง</h2>



<p>การใช้งานมี 2 แบบครับ คือใช้คำสั่ง coverlet ทำงานเลย ให้ติดตั้งด้วยคำสั่ง</p>



<pre class="wp-block-preformatted">dotnet tool install --global coverlet.console</pre>



<p>หรือทำงานผ่านคำสั่ง dotnet test ให้เพิ่ม nuget package ด้วยคำสั่ง</p>



<pre class="wp-block-preformatted">dotnet add package coverlet.msbuild</pre>



<h2 class="wp-block-heading">วิธีใช้งาน</h2>



<p>ในตัวอย่างนี้ โครงสร้างโปรเจ็คผมจะหน้าตาตามรูปภาพด้านล่าง และผมเข้าจะยกตัวอย่างคำสั่งทั้งหมดกรณีที่อยู่ในโฟลเดอร์ /tests/web.UnitTest/<br></p>



<figure class="wp-block-image is-resized"><img loading="lazy" decoding="async" src="https://myifew.com/wp-content/uploads/2018/12/netcore2-project-structure-453x1024.png" alt="" class="wp-image-5146" width="227" height="512"/></figure>



<p>ดังนั้น เมื่อต้องการดู Code Coverage ผ่านคำสั่ง coverlet</p>



<pre class="wp-block-verse">coverlet <strong>bin/Debug/netcoreapp2.1/api.dll</strong> --target "dotnet" --targetargs "<strong>test web.UnitTest.csproj --no-build</strong>" --output "<strong>../web.UnitTest.Results/Coverage.xml</strong>"&nbsp;--format <strong>opencover</strong></pre>



<p>ซึ่งตัวหนาคือข้อมูลของโปรเจ็คเราเอง โดยผู้อ่านสามารถแก้ไขตามที่จะนำไปใช้งานได้เลย</p>



<ul class="wp-block-list"><li><strong>bin/Debug/netcoreapp2.1/api.dll</strong> : คือ ที่อยู่ของไฟล์ Unit Test Binary ที่เรา Build มาแล้ว</li><li><strong>test web.UnitTest.csproj &#8211;no-build</strong> : คือ arguments เพื่อบอกว่าเราต้องการทดสอบด้วย MSTest ไปที่ File Project ไหน, และผมเพิ่มไปว่า ไม่ต้อง ทำการ build project ใหม่ เพราะผมสั่ง build ไปแล้ว (ถ้าใครไม่สั่ง build ก่อน ให้เอา &#8211;no-build ออกด้วยนะ)</li><li><strong>../web.UnitTest.Results/Coverage.xml</strong> : คือ ที่อยู่ของไฟล์ report ซึ่งผมให้ใช้เป็น Formet ของ OpenCover จึงจ้องมีนามสกุล .xml (ค่ามาตรฐาน ถ้าไม่ระบุ มันจะเป็น JSON)</li><li></li><li><strong>opencover</strong> : คือ Format ของไฟล์ report ที่เราจะนำไปใช้งานต่อ</li></ul>



<p>ลองมาดูการใช้งานผ่านคำสั่ง dotnet test แบบปกติบ้าง</p>



<pre class="wp-block-preformatted">dotnet test --no-restore --no-build --logger:"trx;LogFileName=Results.trx" --results-directory:"../web.UnitTest.Results" <strong>/p:CollectCoverage=true</strong> /p:CoverletOutput="<strong>../web.UnitTest.Results/Coverage.xml</strong>" /p:CoverletOutputFormat=<strong>opencover</strong></pre>



<p>ถ้าให้เดาค่าต่างๆ คงพอเดากันได้นะครับ ระบุเหมือนด้านบนเลย แต่คำสั่งหนึ่งที่ต้องมีเสมอคือ</p>



<pre class="wp-block-preformatted">/p:CollectCoverage=true </pre>



<p>เพื่อบ่งบอกว่า เราต้องการ Generate Code Coverage ออกมาด้วย</p>



<h2 class="wp-block-heading">การแสดงผล</h2>



<p>เมื่อรันคำสั่งตามด้านบนเรียบร้อยแล้ว จะได้หน้าตาประมาณนี้ครับ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="540" src="https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-1200x540.png" alt="" class="wp-image-5147" srcset="https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-1200x540.png 1200w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-1024x461.png 1024w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-768x346.png 768w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06-600x270.png 600w, https://myifew.com/wp-content/uploads/2018/12/Screen-Shot-2561-12-20-at-13.50.06.png 1990w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>



<p>ความหมายที่ได้จากการแสดงผล คือ</p>



<ul class="wp-block-list"><li><strong>Module</strong> : ชื่อ System ที่มันทำการทดสอบ</li><li><strong>Method coverage</strong> : จำนวนของ Function/Method ที่ถูกเรียกใช้งาน</li><li><strong>Branch coverage</strong> : จำนวนของ Branch หรือเงื่อนไขใน if statement ถูกเรียกใช้งานทั้ง true และ false</li><li><strong>Line coverage</strong> : จำนวนของบรรทัดที่ถูกเรียกใช้งาน</li></ul>



<pre class="wp-block-preformatted"><em>อ้างอิงคำอธิบายจาก <a href="http://www.somkiat.cc/introduction-to-code-coverage/">http://www.somkiat.cc/introduction-to-code-coverage/</a></em></pre>



<h2 class="wp-block-heading">กำหนดคุณภาพ ด้วยการตั้ง Threshold</h2>



<p>คราวนี้ ถ้าเราอยากตั้งค่าว่า ถ้า Code Coverage เรามี Test ครอบคลุมต่ำกว่า xx% เราจะไม่ให้ผ่านการทดสอบ โดยเพิ่ม Argument ชื่อ threshold ลงไป ดังนี้ </p>



<p>ตัวอย่างด้วยคำสั่ง coverlet</p>



<pre class="wp-block-preformatted">coverlet bin/Debug/netcoreapp2.1/api.dll --target "dotnet" --targetargs "test web.UnitTest.csproj --no-build" --output "../web.UnitTest.Results/Coverage.json" <strong>--threshold 80</strong></pre>



<p>ตัวอย่างด้วยคำสั่ง dotnet test</p>



<pre class="wp-block-preformatted">dotnet test --no-restore --no-build --logger:"trx;LogFileName=Results.trx" --results-directory:"../web.UnitTest.Results" /p:CollectCoverage=true /p:CoverletOutput="../web.UnitTest.Results/Coverage.xml" /p:CoverletOutputFormat=opencover <strong>/p:Threshold=80 /</strong></pre>



<p>ซึ่งในตัวอย่างผมกำหนดว่า Coverage ทุกประเภทจะต้องเกิน 80% ถึงจะเรียกว่าผ่าน ถ้าต่ำกว่านั้นจะ Fail ทันที ดังรูปด้านล่าง</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="594" src="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-1200x594.png" alt="" class="wp-image-5149" srcset="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-1200x594.png 1200w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-1024x507.png 1024w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-768x380.png 768w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1-600x297.png 600w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-1.png 2134w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>



<p>และเราสามารถกำหนดเฉพาะ Coverage ได้ด้วย เช่นผมต้องการเช็คเฉพาะ Line Coverage ก็สามารถเพิ่ม Argument เข้าไป ดังนี้</p>



<p>ตัวอย่างด้วยคำสั่ง coverlet</p>



<pre class="wp-block-preformatted"><strong>--threshold-type line</strong></pre>



<p>ตัวอย่างด้วยคำสั่ง dotnet test</p>



<pre class="wp-block-preformatted"> <strong>/p:ThresholdType=line</strong></pre>



<p>ผลที่ได้คือ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="509" src="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-1200x509.png" alt="" class="wp-image-5150" srcset="https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-1200x509.png 1200w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-1024x434.png 1024w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-768x326.png 768w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type-600x254.png 600w, https://myifew.com/wp-content/uploads/2018/12/coverlet-under-threshold-standard-by-type.png 2142w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /></figure>



<h2 class="wp-block-heading">สรุป</h2>



<p>ถ้าเทียบกับ minicover แล้ว ตัวนี้ค่อนข้างใช้งานง่าย ไม่ซับซ้อนมากนัก รองรับ .Net Core 2.2.1 ตัวล่าสุดด้วย และสามารถแจกแจงรายละเอียด ตาม Coverage Type ต่างๆ พร้อมออก Report ได้ เช่น json, lcov, opencover (xml file), cobertura (xml file) และ teamcity ถ้าสนในรายละเอียดมากกว่านี้ ไปดูได้ที่ Github ของผู้พัฒนาได้เลยครับ ที่ https://github.com/tonerdo/coverlet</p>



<p><em>Featured image from: https://www.aapnainfotech.com/test-coverage-much-testing-enough</em>/</p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5145/code-coverage-on-net-core-2-via-coverlet/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>เริ่มต้นทำ CI/CD – Automation Deployment ด้วย Git และ Jenkins (3 &#8211; จบ)</title>
		<link>https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/</link>
					<comments>https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Sun, 18 Jun 2017 06:43:31 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Automation Testing]]></category>
		<category><![CDATA[Automation Tools]]></category>
		<category><![CDATA[Bitbucket]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Jenkins]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=4072</guid>

					<description><![CDATA[เมื่อเขียนโค้ดเสร็จและทำการทดสอบเสร็จ จะดีกว่าไหม ถ้าโค้ดเราจะขึ้น Production Server ได้อัตโนมัติทันที]]></description>
										<content:encoded><![CDATA[<p>ความเดิมสองตอนก่อนคือ <a href="https://myifew.com/4027/how-to-setup-jenkins-automation-tools/">วิธีติดตั้ง Jenkin</a> และ <a href="https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/">วิธีใช้ PHPUnit เพื่อทำ Automation Test</a> ซึ่งเราก็ได้เห็นภาพของ CI (Continuous Integration) กันมาแล้ว มาบล็อกครั้งนี้เป็นตอนสุดท้ายของซีรี่ &#8220;เริ่มต้นทำ CI/CD&#8221; ก็คือ หลังจากเขียนโค้ดและทดสอบผ่านทั้งหมด เราจะให้ Jenkins นำโค้ดที่ทำเข้าสู่ Production Server ให้อัตโนมัติ (Automation Deployment)<span id="more-4072"></span></p>
<h2>จัดการสิทธิเพื่อใช้ Deployment</h2>
<p>ขั้นตอนนี้จะให้นำ SSH Key ของ Jenkins ไปทำความรู้จักกับ Bitbucket<br />
ก่อนอื่น ทำการตรวจสอบก่อนเลยว่า user jenkins ใน server เรา เชื่อมต่อ bitbucke.org ได้ไหม ด้วยคำสั่ง</p>
<p>[wc_code]$ sudo -u jenkins ssh -vT git@bitbucket.com[/wc_code]</p>
<p>ให้ดูบรรทัดท้ายๆ ถ้ามันมี username ที่เราใช้บน Bitbucket แปลว่ามันรู้จักกันแล้ว</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4073" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-13_01_26-root@myifew_-_var_www_test_ci_cd.png" alt="" width="589" height="154" /></p>
<p>แต่ถ้าขึ้นว่า Permission Denied  ให้ทำการ copy public key ไปไว้บน bitbucket ครับ โดยวิธีการดู Jenkins public key คือ</p>
<p>[wc_code]$ sudo vi /var/lib/jenkins/.ssh/id_rsa.pub[/wc_code]</p>
<p>เป็นอันเสร็จเรียบร้อย</p>
<h2>สร้างโฟลเดอร์เว็บไซต์ และไฟล์คำสั่ง Deployment</h2>
<p>ไฟล์เว็บไซต์ผมจะเก็บไว้ที่ /var/www/test_ci_cd และเมื่อมีโฟลเดอร์แล้ว ให้ clone project ลงมาทั้งหมด</p>
<p>[wc_code]$ sudo mkdir /var/www/test_ci_cd[/wc_code]</p>
<p>[wc_code]$ sudo git clone git@bitbucket.org:few/test-project.git .[/wc_code]</p>
<p>ทำการสร้างไฟล์เพื่อใช้ Deployment ซึ่งในที่นี้ผมใช้ชื่อ deploy.php</p>
<p>[wc_code]$ sudo vi /var/www/test_ci_cd/deploy.php[/wc_code]</p>
<p>ในไฟล์มีโค้ดประมาณนี้</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4111" src="https://myifew.com/wp-content/uploads/2017/06/2017-06-24-22_49_57-root@myifew_-_var_www_test_ci_cd.png" alt="" width="394" height="119" /></p>
<p>ซึ่งเป็นโค้ดที่ Jenkins จะเอาไว้ใช้งาน โดยมีขั้นตอนคือ</p>
<ol>
<li>เข้าโฟลเดอร์ที่เก็บเว็บไซต์ (หรือเก็บไฟล์ deploy.php)</li>
<li>ทำการล้างไฟล์เก่าออกทั้งหมด (optional)</li>
<li>ดึงไฟล์ล่าสุดที่มีการเปลียนแปลงและผ่านการทำสอบแล้ว ลงมาบน server</li>
</ol>
<p>จากนั้นทำการบันทึก ก็เสร็จแล้ว</p>
<h2>เพิ่ม Config Deployment บน Jenkins</h2>
<p>เข้าไปที่ Project ที่เราใช้ทำงาน จากนั้นเพิ่มในส่วนของ Build จุดเดียวกับที่ตั้งให้ทำ PHPUnit ดังนี้</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4075" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-13_19_20-Test_CI_CD_Bickbucket-Config-Jenkins.png" alt="" width="862" height="358" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-13_19_20-Test_CI_CD_Bickbucket-Config-Jenkins.png 862w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-13_19_20-Test_CI_CD_Bickbucket-Config-Jenkins-600x249.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-13_19_20-Test_CI_CD_Bickbucket-Config-Jenkins-768x319.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-13_19_20-Test_CI_CD_Bickbucket-Config-Jenkins-700x291.png 700w" sizes="auto, (max-width: 862px) 100vw, 862px" /></p>
<p>ซึ่ง folder path และชื่อไฟล์ ให้เปลี่ยนไปตามที่เราตั้งค่าไว้ด้วยนะ</p>
<h2>ลองทดสอบ Automation Deployment</h2>
<p>ตอนนี้ไฟล์ที่ผมใช้ทดสอบทำงานบวกเลขได้ตามปกติ และไฟล์ test unit ผมก็ยังใช้งานได้ตามปกติ<br />
ผมจะลองเพิ่มข้อความบนไฟล์ calculate.php โดยยังไม่ได้แก้ไขอะไร เพื่อดูว่าระบบไหลไปได้ถูกต้องหรือไม่</p>
<p>[wc_code]echo &#8216;Hi, automate test and deploy (success, all test case)&#8217;;[/wc_code]</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4077" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_46_59-D__www_test_test_ci_cd_src_calculate.php-Notepad.png" alt="" width="463" height="174" /></p>
<p>จากนั้นให้ Push เข้าสู่ระบบ</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4078" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-11_25_25-MINGW64__d_www_test_test_ci_cd.png" alt="" width="509" height="311" /></p>
<p>ลองเปิดดูบน Jenkins จะต้องพบว่ามัน Success</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4080" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_47_28-Test_CI_CD_Bickbucket-7560-Console-Jenkins-1024x476.png" alt="" width="1024" height="476" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_47_28-Test_CI_CD_Bickbucket-7560-Console-Jenkins-1024x476.png 1024w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_47_28-Test_CI_CD_Bickbucket-7560-Console-Jenkins-600x279.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_47_28-Test_CI_CD_Bickbucket-7560-Console-Jenkins-768x357.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_47_28-Test_CI_CD_Bickbucket-7560-Console-Jenkins-1200x557.png 1200w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_47_28-Test_CI_CD_Bickbucket-7560-Console-Jenkins-700x325.png 700w, https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_47_28-Test_CI_CD_Bickbucket-7560-Console-Jenkins.png 1492w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>จากนั้นลองเปิดบนเว็บไซต์ Production ที่เราได้เตรียมไว้ จะต้องแสดงข้อความที่เพิ่มขึ้นมา</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4081" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_50_17-myifew.com_test_ci_cd_src_calculate.php_.png" alt="" width="399" height="99" /></p>
<p>แปลว่า ระบบ Jenkins ทำการทำการ Automate Test และเมื่อทดสอบ Unit Test ผ่านทั้งหมด ก็ได้ Automate Deploy ให้เราเรียบร้อยแล้ววว</p>
<p>คราวนี้ มาลองทดสอบกรณีที่ Unit Test ทำงานไม่ผ่านบ้าง<br />
โดยผมได้แก้สูตรคิดเลข จาก บวก เป็น หาร ดังนั้น Unit Test ที่ผมทำการทดสอบไว้ทั้งหมดจะผิดทันที เพราะคำตอบมันเป็นผลลัพธ์ของการบวกเท่านั้น<br />
และผมได้ทำการแก้ไขข้อความด้วยว่า จะเกิดการ fail, all test case</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4082" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_48_04-D__www_test_test_ci_cd_src_calculate.php-Notepad-1.png" alt="" width="484" height="177" /></p>
<p>เช่นเดิม แก้ไขเสร็จ ทำการ git push ขึ้นไปบน Bitbucket</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4083" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_49_04-μTorrent-3.5-build-43804-32-bit.png" alt="" width="471" height="250" /></p>
<p>จากนั้นเมื่อไปดูบน Jenkins มันจะแสดงข้อความ FAILURES ขึ้นมา เพราะ Unit Test เราไม่ผ่าน</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4084" src="https://myifew.com/wp-content/uploads/2017/06/Test_CI_CD_Bickbucket-7561-Console-Jenkins--811x1024.png" alt="" width="811" height="1024" srcset="https://myifew.com/wp-content/uploads/2017/06/Test_CI_CD_Bickbucket-7561-Console-Jenkins--811x1024.png 811w, https://myifew.com/wp-content/uploads/2017/06/Test_CI_CD_Bickbucket-7561-Console-Jenkins--600x757.png 600w, https://myifew.com/wp-content/uploads/2017/06/Test_CI_CD_Bickbucket-7561-Console-Jenkins--768x969.png 768w, https://myifew.com/wp-content/uploads/2017/06/Test_CI_CD_Bickbucket-7561-Console-Jenkins--555x700.png 555w, https://myifew.com/wp-content/uploads/2017/06/Test_CI_CD_Bickbucket-7561-Console-Jenkins-.png 943w" sizes="auto, (max-width: 811px) 100vw, 811px" /></p>
<p>ดังนั้น ไฟล์บน Procution ก็จะไม่มีอะไรเปลี่ยนแปลง เพราะเมื่อ Unit Test ไม่ผ่าน มันจะไม่ไปเรียกไฟล์ deployment ทำต่อ</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4081" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-18-12_50_17-myifew.com_test_ci_cd_src_calculate.php_.png" alt="" width="399" height="99" /></p>
<h2>สรุป</h2>
<p>จากที่ได้ลองผิดลองถูกทำมาจนครบ ทำให้เห็นภาพได้ชัดเจนเลยครับว่า Continuous Integration และ Continuous Deployment มันสะดวกและเร็วขึ้นมาก ช่วยส่งเสริมกับเรื่องการส่งมอบงานเป็นรอบและส่งให้ได้ไว เพื่อให้มีการ feedback เร็ว ดังนั้น การเสียเวลาศึกษาและตั้งระบบขึ้นมาอีกสักหน่อย มันจะช่วยงานเราได้ในระยะยาว</p>
<p>แต่อย่างที่ชื่อเรื่องบอกนะครับ นี่เป็นเพียงการเริ่มต้น ดังนั้นขั้นตอนที่เราจะใช้งานจริงๆ อาจจะมีมากกว่านี้ที่ต้องเพิ่มขึ้น ทั้งการเพิ่ม Security, การเพิ่มเรื่องของ Test, การ git push ไปพักไว้ที่ dev branch ก่อน, การ Deploy ไปยัง Stating Server เพื่อทำ Acceptant Test แล้วค่อย merge git เข้าสู่ master branch และ deploy Production &#8230; ผมก็คงเขียนไม่หมด เอาเป็นว่า ไปเผชิญโลกกว้างกันดูครับ</p>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4089 aligncenter" src="https://myifew.com/wp-content/uploads/2017/06/BestPractices_for_a_MatureContinuousDeliveryPipeline.png" alt="" width="595" height="451" />(รูปจาก http://www.bogotobogo.com/DevOps/DevOps_CI_CD_Pipeline_Sample.php)</p>
<p>ดังนั้น วิธีการของผมก็ไม่ใช่สิ่งที่ดีที่สุด ถ้าหากผิดพลาดประการใด หรือมีคำแนะนำเพิ่มเติม มาแลกเปลี่ยนกันได้ครับ และกราบขอคำชี้แนะด้วยคร้าบบ..</p>
<p>เว็บอ้างอิง</p>
<ul>
<li><a href="http://chrisbeaver.com/2014/10/automatically-deploy-private-git-repo-server/" target="_blank" rel="noopener">Automatically Deploy Private Git Repo to Server</a></li>
<li>รูปปกจาก <a href="http://www.mindtheproduct.com/2016/02/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/" target="_blank" rel="noopener">http://www.mindtheproduct.com/2016/02/what-the-hell-are-ci-cd-and-devops-a-cheatsheet-for-the-rest-of-us/</a></li>
</ul>
<p>ซี่รี่ &#8220;เริ่มต้นทำ CI/CD&#8221;</p>
<ul>
<li><a href="https://myifew.com/4027/how-to-setup-jenkins-automation-tools/">เริ่มต้นทำ CI/CD – วิธีติดตั้ง Jenkins บน Ubuntu (1)</a></li>
<li><a href="https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/">เริ่มต้นทำ CI/CD – Automation Testing ด้วย PHPUnit และ Jenkins (2)</a></li>
<li><a href="https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/">เริ่มต้นทำ CI/CD – Automation Deploy ด้วย Git (Bitbucket) และ Jenkins (3 &#8211; จบ)</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>เริ่มต้นทำ CI/CD &#8211; Automation Testing ด้วย PHPUnit และ Jenkins (2)</title>
		<link>https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/</link>
					<comments>https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 15 Jun 2017 17:10:35 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Automation Testing]]></category>
		<category><![CDATA[Automation Tools]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Jenkins]]></category>
		<category><![CDATA[PHPUnit]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=4039</guid>

					<description><![CDATA[Software ที่ใช้ได้และส่งมอบงานได้ไว ก็ต้องมี Automate Test ที่ทำงานได้แทนเรา และครอบคลุม หนึ่งในนั้นคือ Unit Test]]></description>
										<content:encoded><![CDATA[<p>บล็อกที่แล้วเขียนเรื่อง <a href="https://myifew.com/4027/how-to-setup-jenkins-automation-tools/">วิธีติดตั้ง Jenkin</a> ไว้ เพื่อเตรียมทำ CI (Continuous Integration)<br />
แต่ก่อนจะไปถึงตรงนั้น นอกจากต้องใช้ Version Control เป็นแล้ว ก็ต้องมีวิธีการทดสอบโค้ดที่เขียนก่อน</p>
<p>และคุณประโยชน์ที่เราจะไปใช้ Scrum เพื่อทำ Agile คือ การส่งมอบงาน หรือ Software ที่ใช้ได้ ให้ได้ไวๆ<br />
ดังนั้น การส่งมอบให้ได้ไว คือการทำงานเป็นรอบ และการทำงานเป็นรอบ เราจะได้ผลตอบรับไว (fast feedback) ว่าใช่หรือไม่ใช่ ผิดหรือถูก</p>
<p>เช่นกัน Software ที่ใช้ได้และส่งมอบงานได้ไว ก็ต้องมี Automate Test ที่ทำงานได้แทนเรา และครอบคลุม หนึ่งในนั้นคือ Unit Test<span id="more-4039"></span></p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4050" src="https://myifew.com/wp-content/uploads/2017/06/AgileTestingPyramid2.jpg" alt="" width="953" height="580" srcset="https://myifew.com/wp-content/uploads/2017/06/AgileTestingPyramid2.jpg 953w, https://myifew.com/wp-content/uploads/2017/06/AgileTestingPyramid2-600x365.jpg 600w, https://myifew.com/wp-content/uploads/2017/06/AgileTestingPyramid2-768x467.jpg 768w, https://myifew.com/wp-content/uploads/2017/06/AgileTestingPyramid2-700x426.jpg 700w" sizes="auto, (max-width: 953px) 100vw, 953px" /></p>
<p>ว่าแล้วก็ลองมาดูกัน</p>
<h2>ติดตั้ง PHPUnit บน Ubuntu</h2>
<p>ใช้คำสั่งเดียว ดังนี้</p>
<p>[wc_code]$ sudo apt-get install phpunit[/wc_code]</p>
<p>ทดสอบด้วยคำสั่ง</p>
<p>[wc_code]$ phpunit &#8211;version[/wc_code]</p>
<p>จะแสดงข้อความ ประมาณ [wc_code]PHPUnit 3.7.21 by Sebastian Bergmann.[/wc_code] ก็พร้อมใช้แล้วครับ</p>
<h2>ติดตั้ง PHPUnit บน Windows</h2>
<p>ซับซ้อนนิด ลองทำตามดู</p>
<ol>
<li>.ไป Download PHPUnit ที่ https://phpunit.de/</li>
<li>จะได้ไฟล์ชื่อประมาณว่า phpunit-6.2.1.phar ให้เอามันไปไว้ที่ไหนโฟลเดอร์ไหนสักแห่ง ในที่นี้ผมไว้ที่ C:\bin</li>
<li>จากนั้นเข้าไปที่ windows command ด้วยการกด ปุ่มรูป windows ที่ keyboard + R</li>
<li>พิมพ์คำสั่ง<br />
[wc_code]cd C:\bin<br />
echo @php &#8220;%~dp0phpunit-6.2.1.phar&#8221; %* &gt; phpunit.cmd[/wc_code]</li>
<li>ถ้าสังเกตในโฟลเดอร์ของเรา จะพบไฟล์ชื่อ phpunit.cmd ขึ้นมาไฟล์หนึ่ง<br />
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4042" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_12_12-bin.png" alt="" width="751" height="133" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_12_12-bin.png 751w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_12_12-bin-600x106.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_12_12-bin-700x124.png 700w" sizes="auto, (max-width: 751px) 100vw, 751px" /></li>
<li>จากนั้นไปตั้งค่า Environment Variables และใส่ Path เป็นที่อยู่โฟลเดอร์ที่เราเก็บไฟล์ไว้ นั่นก็คือ C:\bin<br />
<img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4041" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_08_59-bin-1024x659.png" alt="" width="1024" height="659" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_08_59-bin-1024x659.png 1024w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_08_59-bin-600x386.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_08_59-bin-768x495.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_08_59-bin-700x451.png 700w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_08_59-bin.png 1129w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></li>
<li>คราวนี้เราจะสามารถใช้งาน phpunit ที่โฟลเดอร์อื่นๆ นอกเหนือจาก C:\bin ได้แล้ว<br />
<img loading="lazy" decoding="async" class="alignnone size-full wp-image-4040" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_10_34-bin.png" alt="" width="981" height="514" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_10_34-bin.png 981w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_10_34-bin-600x314.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_10_34-bin-768x402.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-18_10_34-bin-700x367.png 700w" sizes="auto, (max-width: 981px) 100vw, 981px" /></li>
</ol>
<h2>เริ่มต้นลองเขียน PHPUnit แบบง่ายๆ</h2>
<p>สมมติว่าผมสร้างไฟล์ชื่อ Calculate.php ในนั้นมี Class ชื่อ Calculate และมี Function บวกเลขขึ้นมาตัวหนึ่ง</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4047" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_04_44-D__www_test_test_ci_cd_src_calculate.php-Notepad.png" alt="" width="595" height="152" /></p>
<p>ผมต้องสร้างไฟล์ทดสอบขึ้นมาประกบ Function นี้ โดยผมตั้งชื่อว่า test_calculate.php และมีโค้ด ดังนี้</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4061" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_07_46-D__www_test_test_ci_cd_test_test_calculate.php-Notepad-1.png" alt="" width="823" height="504" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_07_46-D__www_test_test_ci_cd_test_test_calculate.php-Notepad-1.png 823w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_07_46-D__www_test_test_ci_cd_test_test_calculate.php-Notepad-1-600x367.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_07_46-D__www_test_test_ci_cd_test_test_calculate.php-Notepad-1-768x470.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_07_46-D__www_test_test_ci_cd_test_test_calculate.php-Notepad-1-700x429.png 700w" sizes="auto, (max-width: 823px) 100vw, 823px" /></p>
<p>ไฟล์ นี้ผมจะ include ไฟล์ที่จะทำการทดสอบมาด้วย นั่นคือ Calculate.php<br />
จากนั้นผมจะ extends เรียกใช้ตัว PHPUnit_Framework_TestCase เพื่อเรียกใช้งานคำสั่งต่างๆของ PHPUnit</p>
<p>class Test_calculate extends PHPUnit_Framework_TestCase</p>
<p>เรียกใช้ function setup() ซึ่งมันจะทำคำสั่งทั้งหมดในนี้ทุกครั้งที่มีการทดสอบ function อื่นๆ เสมอ</p>
<p>public function setup() {<br />
$this-&gt;calculate = new Calculate();<br />
}</p>
<p>สร้าง function ทดสอบการบวกเลขขึ้นมา โดยการตั้งชื่อของ PHPUnit จะต้องขึ้นต้นด้วย test เสมอ<br />
และผทใช้คำสั่ง assertEquals() เพื่อตรวจสอบว่า ผลลัพธ์ที่ได้จาก $this-&gt;calculate-&gt;add($a, $b) เท่ากับ $expected หรือไม่<br />
โดยตัวแปล $a, $b, $expected ผมให้เรียกใช้มาจากชุดตัวเลขทดสอบ ที่เก็บไว้ใน function additionProvider()<br />
โดยวิธีการเรียกใช้นั้น คือคำสั่ง @dataProvider ที่อยู่ในกรอบคอมเม้น<br />
/**<br />
* @dataProvider additionProvider<br />
*/<br />
public function testAdd($a, $b, $expected) {<br />
$this-&gt;assertEquals($expected, $this-&gt;calculate-&gt;add($a, $b));<br />
}</p>
<p>public function additionProvider()<br />
{<br />
return [<br />
&#8216;0+0=0&#8217; =&gt; [0, 0, 0],<br />
&#8216;0+1=1&#8217; =&gt; [0, 1, 1],<br />
&#8216;1+0=0&#8217; =&gt; [1, 0, 0],<br />
&#8216;1+4=3&#8217; =&gt; [1, 4, 3]<br />
];<br />
}</p>
<p>จากนั้นทำการรันคำสั่ง</p>
<p>[wc_code]$ phpunit test_calculate.php[/wc_code]</p>
<p>ผลที่ได้จะเป็นดังรูปนี้</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4063" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_08_20.png" alt="" width="827" height="447" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_08_20.png 827w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_08_20-600x324.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_08_20-768x415.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-22_08_20-700x378.png 700w" sizes="auto, (max-width: 827px) 100vw, 827px" /></p>
<p>ความหมายคือ ผลการทดสอบ ไม่ผ่าน<br />
โดยทดสอบด้วย 4 ชุดข้อมูล ไม่ผ่าน 2 ชุดข้อมูล</p>
<h2>ให้ Jenkins ทดสอบ PHPUnit อัตโนมัติ ทุกครั้งที่มีการ Push สู่ Git</h2>
<p>กลับไปที่ Jenkins Project ที่สร้างไว้จากบล็อก <a href="https://myifew.com/4027/how-to-setup-jenkins-automation-tools/">สอนติดตั้ง Jenkins</a><br />
ในส่วนของ Build ให้กดปุ่ม Add build step เพื่อเพิ่มการทำงานในตอน build<br />
จากนั้นเลือกเมนู Excute shell และใส่โค้ดไปว่า</p>
<p>[wc_code]phpunit &#8211;log-junit test/results/phpunit.xml test/test_calculate.php[/wc_code]</p>
<p>ส่วนของ test/results/phpunit.xml จะเป็น path ที่เก็บไฟล์ report, ส่วน test/test_calculate.php คือไฟล์ที่ใช้ทดสอบ<br />
ดังนั้นใครไฟล์ทดสอบไว้อย่างไร ก็แก้กันตามนั้นส่วนไฟล์ report ก็แล้วแต่จะตั้งนะ</p>
<p>ต่อมา ในส่วนของ Post-build Actions ให้กดปุ่ม Add post-build action เพื่อเพิ่มการทำงานหลัง build เสร็จ<br />
จากนั้นเลือกเมนู Publish JUnit test result report และใส่ที่อยู่ของ report เมื่อสักครู่เข้าไป</p>
<p>[wc_code]test/results/phpunit.xml[/wc_code]</p>
<p>(มันจะแจ้งตัวอักษรแดงๆ ว่าไม่พบไฟล์ก็ปล่อยมันไป)</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4052" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_52_30-Test_CI_CD_Bickbucket-Config-Jenkins-1024x595.png" alt="" width="1024" height="595" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_52_30-Test_CI_CD_Bickbucket-Config-Jenkins-1024x595.png 1024w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_52_30-Test_CI_CD_Bickbucket-Config-Jenkins-600x349.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_52_30-Test_CI_CD_Bickbucket-Config-Jenkins-768x446.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_52_30-Test_CI_CD_Bickbucket-Config-Jenkins-1200x697.png 1200w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_52_30-Test_CI_CD_Bickbucket-Config-Jenkins-700x407.png 700w, https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_52_30-Test_CI_CD_Bickbucket-Config-Jenkins.png 1463w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>หลังจากนั้นให้ลองกดปุ่ม Build ดู และให้กดไปที่รายการที่ Build ครั้งล่าสุด</p>
<p><img loading="lazy" decoding="async" class="alignnone size-full wp-image-4053" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-15-23_59_40-Test_CI_CD_Bickbucket-Jenkins.png" alt="" width="355" height="204" /></p>
<p>ให้เลือกเมนู Test Result ก็จะพบผลการทดสอบที่แยก Function การทำงานพร้อม Progress Bar บอกผลด้วยว่า ผ่าน/ไม่ผ่าน กี่ Function</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4054" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_00_29-Test_CI_CD_Bickbucket-7528-Test-Results-Jenkins-1024x414.png" alt="" width="1024" height="414" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_00_29-Test_CI_CD_Bickbucket-7528-Test-Results-Jenkins-1024x414.png 1024w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_00_29-Test_CI_CD_Bickbucket-7528-Test-Results-Jenkins-600x242.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_00_29-Test_CI_CD_Bickbucket-7528-Test-Results-Jenkins-768x310.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_00_29-Test_CI_CD_Bickbucket-7528-Test-Results-Jenkins-1200x485.png 1200w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_00_29-Test_CI_CD_Bickbucket-7528-Test-Results-Jenkins-700x283.png 700w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_00_29-Test_CI_CD_Bickbucket-7528-Test-Results-Jenkins.png 1361w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>ในหน้าของ History ก็จะบอกประวัติของการพบข้อผิดพลาดว่ามากขึ้นหรือลดลง</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4055" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_01_52-History-for-Test-Results-Jenkins-1024x453.png" alt="" width="1024" height="453" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_01_52-History-for-Test-Results-Jenkins-1024x453.png 1024w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_01_52-History-for-Test-Results-Jenkins-600x265.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_01_52-History-for-Test-Results-Jenkins-768x340.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_01_52-History-for-Test-Results-Jenkins-1200x531.png 1200w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_01_52-History-for-Test-Results-Jenkins-700x310.png 700w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_01_52-History-for-Test-Results-Jenkins.png 1347w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>เมื่อไปดูหน้าของ Project ก็จะมี Trend การพบข้อผิดพลาด</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4056" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_03_01-Test_CI_CD_Bickbucket-Jenkins-1024x440.png" alt="" width="1024" height="440" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_03_01-Test_CI_CD_Bickbucket-Jenkins-1024x440.png 1024w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_03_01-Test_CI_CD_Bickbucket-Jenkins-600x258.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_03_01-Test_CI_CD_Bickbucket-Jenkins-768x330.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_03_01-Test_CI_CD_Bickbucket-Jenkins-1200x516.png 1200w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_03_01-Test_CI_CD_Bickbucket-Jenkins-700x301.png 700w, https://myifew.com/wp-content/uploads/2017/06/2560-06-16-00_03_01-Test_CI_CD_Bickbucket-Jenkins.png 1347w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<h2>สรุป</h2>
<p>หลังจากไดทำ Unit Test และไปให้ Jenkins เป็นตัวรันทดสอบให้อัตโนมัติทุกครั้งที่ Commit Code คราวนี้เราก็สบายใจได้แล้วว่า ทุกครั้งที่ทำงานและนำโค้ดขึ้น Git เราจะมีโค้ดที่สามารถทำงานได้ เราได้เริ่มต้นเข้าสู่ Continuous Integration ด้วย Unit Test แล้ววว</p>
<p>ในบล็อกตอนหน้า ผมจะนำโค้ดที่ใช้งานได้บน Git เข้าสู่ Production Server เพื่อลองทำ Continuous Deployment กันครับ</p>
<p>&nbsp;</p>
<p>เว็บอ้างอิง</p>
<ul>
<li><a href="http://www.somkiat.cc/php-continuous-integration-with-jenkins/" target="_blank" rel="noopener noreferrer">สรุปการใช้งาน Jenkins ร่วมกับ PHP project แบบง่ายๆ</a></li>
<li><a href="http://www.somkiat.cc/imrpove-quality-with-continuous-integration/" target="_blank" rel="noopener noreferrer">ปรับปรุงคุณภาพของ Software ด้วย Continuous Integration Process กันนะ</a></li>
<li>รูปปกจาก https://buddy.works/blog/introducing-phpunit</li>
</ul>
<p>ซี่รี่ &#8220;เริ่มต้นทำ CI/CD&#8221;</p>
<ul>
<li><a href="https://myifew.com/4027/how-to-setup-jenkins-automation-tools/">เริ่มต้นทำ CI/CD – วิธีติดตั้ง Jenkins บน Ubuntu (1)</a></li>
<li><a href="https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/">เริ่มต้นทำ CI/CD – Automation Testing ด้วย PHPUnit และ Jenkins (2)</a></li>
<li><a href="https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/">เริ่มต้นทำ CI/CD – Automation Deploy ด้วย Git (Bitbucket) และ Jenkins (3 &#8211; จบ)</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>เริ่มต้นทำ CI/CD &#8211; วิธีติดตั้ง Jenkins บน Ubuntu (1)</title>
		<link>https://myifew.com/4027/how-to-setup-jenkins-automation-tools/</link>
					<comments>https://myifew.com/4027/how-to-setup-jenkins-automation-tools/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Sat, 10 Jun 2017 04:44:50 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Automation Tools]]></category>
		<category><![CDATA[Continuous Delivery]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Jenkins]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=4027</guid>

					<description><![CDATA[Jenkins เป็น Automation Tools ที่เอาไว้ทำอะไรต่างๆแบบอัตโนมัติ ในที่นี้เราจะเอามันไปใช้ทำ CI/CD เพื่อช่วยชีวิตนักพัฒนาอย่างเราให้สบายขึ้น]]></description>
										<content:encoded><![CDATA[<p>ตอนแรกว่าจะเขียนรวดเดียวจบถึงวิธีทำ CI/CD (Continuous Integration and Continuous Deployment) ด้วย Jenkins และ Bitbucket แต่พอเขียน Jenkins จบ รู้สึกว่ายาวไปหน่อย เลยขอตัดเอาเป็น Jenkins ก่อนก็แล้วกันนะ</p>
<p>Jenkins เป็น Automation Tools ที่เอาไว้ทำอะไรต่างๆแบบอัตโนมัติ ซึ่งในที่นี้เราเอามันไปใช้ทำ CI/CD เพื่อช่วยชีวิตนักพัฒนาอย่างเราให้สบายขึ้น อบย่างเช่น นักพัฒนาเพียงแค่เขียนโค้ด นำขึ้น Git แล้วให้ Jenkins ทำการทดสอบจากที่เราตั้งค่าไว้ ไม่ว่าจะ Robot Framework หรือ Test Unit ก็ตาม เมื่อผ่านเรียบร้อย ก็นำกลับไป Merge Code เข้า Git หรือจะ Deploy ต่อไปยัง Server ก็ว่ากันไป (ซึ่งผมจะเขียนบล็อกสอนทำตามนี้แหละ)<span id="more-4027"></span></p>
<p>เนื่องด้วยผมใช้ Linux Ubuntu นะครับ ใครใช้ Linux/Windows อื่นๆ ก็ลองปรับๆเทียบเคียงดูอีกที</p>
<h2>สิ่งที่ต้องมี</h2>
<p>Server ที่ใช้ Ubuntu มี Ram ขั้นต่ำ 1GB จากนั้นให้สร้าง user ที่สามารถใช้งาน sudo ได้และใช้ File Key Authentication ในการเข้าสู่ระบบ (<a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04" target="_blank" rel="noopener noreferrer">วิธีการสร้าง user + file key authentication + disable root user + disable password authentication</a>)</p>
<h2>ติดตั้ง Jenkins</h2>
<p>เพิ่ม repository key ใน server</p>
<p>[wc_code]$ wget -q -O &#8211; https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -[/wc_code]</p>
<p>พิมพ์ไปแล้วจะแสดงคำว่า [wc_code]OK[/wc_code] เป็นใช้ได้ จากนั้น กำหนด Debian package repo address</p>
<p>[wc_code]$ echo deb http://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list[/wc_code]</p>
<p>ทำการ update package สักหน่อย</p>
<p>[wc_code]$ sudo apt-get update[/wc_code]</p>
<p>สุดท้ายก็พิมพ์คำสั่งติดตั้ง Jenkins</p>
<p>[wc_code]$ sudo apt-get install jenkins[/wc_code]</p>
<p>จากนั้นให้ทำการ เปิดใช้ Jenkins</p>
<p>[wc_code]$ sudo service jenkins start[/wc_code]</p>
<p>แล้วลองเช็คดูว่า Jenkins ทำงานจริงหรือไม่</p>
<p>[wc_code]$ sudo service jenkins status[/wc_code]</p>
<p>ถ้า Jenkins ทำงานอยู่ ผลลัพธ์ที่ได้จะแสดงประมาณนี้</p>
<p>[wc_code]Jenkins Automation Server is running with the pid 12445[/wc_code] (เลขข้างหลังอะไรก็ว่าไป อาจไม่เหมือนกัน)</p>
<h2>เปลี่ยนเลข Port Jenkins สักหน่อย</h2>
<p>(ถ้าใครไม่ทำตรงนี้ ก็ข้ามไปได้ครับ ใช้ Port 8080 ดังเดิม)</p>
<p>ปกติ Jenkins จะใช้ Port 8080 ซึ่งผมคิดว่าเกร่อไปนิด เลยอยากเปลี่ยนเป็นเลขอื่นๆแทน โดยทำดังนี้</p>
<p>แก้ไข file ชื่อ /etc/default/jenkins</p>
<p>[wc_code]$ sudo vi /etc/default/jenkins[/wc_code]</p>
<p>แก้เลข port บนหาบรรทัดที่เขียนว่า HTTP_PORT</p>
<p>[wc_code]HTTP_PORT=8083[/wc_code]</p>
<p>จากนั้น save แล้วออกมา restart Jenkins อีกรอบ</p>
<p>[wc_code]$ sudo service jenkins restart[/wc_code]</p>
<h2>ตั้งค่าใช้งาน Jenkins</h2>
<p>เมื่อติดตั้งและเปลี่ยน port เรียบร้อย คราวนี้มาตั้งค่ากัน โดยเข้าไปที่ URL เว็บของเราหรือ IP แล้วตามด้วยเลข Port ที่เรากำหนดเมื่อสักครู่</p>
<p>[wc_code]http://ip_address_or_domain_name:8083[/wc_code]</p>
<p>การเข้าใช้งานครั้งแรก จะขึ้นหน้าตาแบบนี้ครับ</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4030" src="https://myifew.com/wp-content/uploads/2017/06/unlock-jenkins-1024x531.png" alt="" width="1024" height="531" srcset="https://myifew.com/wp-content/uploads/2017/06/unlock-jenkins-1024x531.png 1024w, https://myifew.com/wp-content/uploads/2017/06/unlock-jenkins-600x311.png 600w, https://myifew.com/wp-content/uploads/2017/06/unlock-jenkins-768x399.png 768w, https://myifew.com/wp-content/uploads/2017/06/unlock-jenkins-700x363.png 700w, https://myifew.com/wp-content/uploads/2017/06/unlock-jenkins.png 1137w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>ซึ่งมันให้เราเอารหัสเปิดใช้งานครั้งแรกมากรอก โดยพิมพ์คำสั่งดูข้อมูลจาก /var/lib/jenkins/secrets/initialAdminPassword</p>
<p>[wc_code]$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword[/wc_code]</p>
<p>เราจะได้ตัวอักษรผสมตัวเลข 32 หลัก ซึ่งอันนี้แหละ เป็นรหัสที่ใช้กรอก</p>
<p>เมื่อกดไปขั้นต่อไป ให้เลือก Install suggested plugins เป็นค่าเริ่มต้นไปก่อน</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4032" src="https://myifew.com/wp-content/uploads/2017/06/jenkins-customize-1024x531.png" alt="" width="1024" height="531" srcset="https://myifew.com/wp-content/uploads/2017/06/jenkins-customize-1024x531.png 1024w, https://myifew.com/wp-content/uploads/2017/06/jenkins-customize-600x311.png 600w, https://myifew.com/wp-content/uploads/2017/06/jenkins-customize-768x399.png 768w, https://myifew.com/wp-content/uploads/2017/06/jenkins-customize-700x363.png 700w, https://myifew.com/wp-content/uploads/2017/06/jenkins-customize.png 1137w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>แล้วมันจะทำการติดตั้งอะไรก็ว่าไป จนไปถึงหน้ากรอกข้อมูล Admin User ก็ตั้งได้จตามสะดวกที่ต้องการ เป็นอันเสร็จพิธี และเมื่อกดปุ่ม Start using Jenkins จะเจอหน้าแรกประมาณนี้ (Test Project กับ Test CI CD (Bitbucket) ไม่ต้องไปสนใจมันนะฮะ พอดีผมลืมแคปเจอร์หน้าตอนที่ยังไม่มี Project ขึ้น แหะๆ)</p>
<p><img loading="lazy" decoding="async" class="alignnone size-medium wp-image-4034" src="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-11_21_03-Dashboard-Jenkins-1024x545.png" alt="" width="1024" height="545" srcset="https://myifew.com/wp-content/uploads/2017/06/2560-06-10-11_21_03-Dashboard-Jenkins-1024x545.png 1024w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-11_21_03-Dashboard-Jenkins-600x319.png 600w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-11_21_03-Dashboard-Jenkins-768x409.png 768w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-11_21_03-Dashboard-Jenkins-1200x639.png 1200w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-11_21_03-Dashboard-Jenkins-700x372.png 700w, https://myifew.com/wp-content/uploads/2017/06/2560-06-10-11_21_03-Dashboard-Jenkins.png 1915w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>&nbsp;</p>
<p>เว็บอ้างอิง</p>
<ul>
<li><a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-16-04" target="_blank" rel="noopener noreferrer">Initial Server Setup with Ubuntu 16.04</a></li>
<li><a href="https://www.digitalocean.com/community/tutorials/how-to-install-jenkins-on-ubuntu-16-04" target="_blank" rel="noopener noreferrer">How To Install Jenkins on Ubuntu 16.04</a></li>
<li><a href="https://stackoverflow.com/questions/15265277/how-to-start-jenkins-on-different-port-rather-than-8080-using-command-prompt-in" target="_blank" rel="noopener noreferrer">How to start Jenkins on different port rather than 8080 using command prompt in Windows?</a></li>
<li>รูปปกจาก http://www.drdobbs.com/testing/soasta-and-cloudbees-team-for-jenkins-pl/240152753</li>
</ul>
<p>ซี่รี่ &#8220;เริ่มต้นทำ CI/CD&#8221;</p>
<ul>
<li><a href="https://myifew.com/4027/how-to-setup-jenkins-automation-tools/">เริ่มต้นทำ CI/CD – วิธีติดตั้ง Jenkins บน Ubuntu (1)</a></li>
<li><a href="https://myifew.com/4039/automation-testing-by-phpunit-and-jenkins/">เริ่มต้นทำ CI/CD – Automation Testing ด้วย PHPUnit และ Jenkins (2)</a></li>
<li><a href="https://myifew.com/4072/automation-deploy-git-bitbucket-jenkins/">เริ่มต้นทำ CI/CD – Automation Deploy ด้วย Git (Bitbucket) และ Jenkins (3 &#8211; จบ)</a></li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/4027/how-to-setup-jenkins-automation-tools/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
