<?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>Continuous Deployment &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<atom:link href="https://myifew.com/tag/continuous-deployment/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>Continuous Deployment &#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>เริ่มต้นทำ 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>
		<item>
		<title>How To Set Up Deployment with Git</title>
		<link>https://myifew.com/3932/how-to-set-up-deployment-with-git/</link>
					<comments>https://myifew.com/3932/how-to-set-up-deployment-with-git/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Tue, 21 Mar 2017 07:46:17 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Continuous Deployment]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[Git Deployment]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=3932</guid>

					<description><![CDATA[เวลาปรับปรุง code แล้วนำไฟล์ขึ้น server ก็คงใช้ upload ปกติทั่วไป อันนี้มาลองดูวิธีที่หล่อขึ้นมาอีกนิด คือใช้ git ทำ deployment เพื่ออำนวยความสะดวกในการทำงานร่วมกับทีม สะดวกในการ merge file, มี subversion และไม่ต้องหาไฟล์ที่แก้ไขเพื่ออัพโหลด]]></description>
										<content:encoded><![CDATA[<p>เวลาปรับปรุง code แล้วนำไฟล์ขึ้น server ก็คงใช้ upload ปกติทั่วไป อันนี้มาลองดูวิธีที่หล่อขึ้นมาอีกนิด คือใช้ git ทำ deployment เลย ซึ่งยังไม่เป็น Continuous Integration (CI) และ Continuous Deployment (CD) เพราะยังไม่ใช่ Automatic Deployment แต่แค่อำนวยความสะดวกในการทำงานร่วมกับทีม สะดวกในการ merge file, มี subversion และไม่ต้องหาไฟล์ที่แก้ไขเพื่ออัพโหลด<span id="more-3932"></span></p>
<p>บทความนี้อ้างอิงวิธีการจาก <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps" target="_blank">Digitalocean Tutorials : How To Set Up Automatic Deployment with Git with a VPS</a></p>
<blockquote><p>คำเตือน: อย่างที่บอก มันแค่อำนวยความสะดวกด้วย Git ดังนั้นก่อนจะ Deploy ขึ้น Production Server ควรผ่านการ Test ให้เสร็จเสียก่อน</p></blockquote>
<p style="text-align: center;"><img loading="lazy" decoding="async" class="alignnone size-full wp-image-3934 aligncenter" src="https://myifew.com/wp-content/uploads/2017/03/git-deployment-1.gif" alt="" width="674" height="481" />(รูปตัวอย่างของ Git Deployment ของ จาก <a href="http://www.flyingcorkmedia.com/blog/our-git-deployment-setup/" target="_blank">flyingcorkmedia.com</a>)</p>
<h2>เตรียมของ</h2>
<p>บน Production Server:</p>
<ul>
<li>Directory ที่เราใช้ Live เว็บไซต์ เช่น <em>/var/www/domain.com</em></li>
<li>Directory ที่เราใช้เก็บ Git Repo เช่น <em>/var/repo/site.git</em></li>
</ul>
<p>บน Localhost:</p>
<ul>
<li>ติดตั้ง Git</li>
<li>ทำการผูก SSH Key ระหว่างเครื่องเรา (Localhost) กับ Production Server (ถ้าไม่ผูกก็ได้ แต่จะต้องมาพิมพ์รหัสตลอดทุกครั้งที่ Commit นะ, ตัดสินใจดูเอาเอง)</li>
</ul>
<h2>เริ่มต้นทำ Git Repo บน Production Server</h2>
<p>ถ้ายังไม่ได้สร้าง /var/repo/site.git ให้ใช้คำสั่ง</p>
<p>[wc_code]mkdir /var/repo/site.git[/wc_code]</p>
<p>จากนั้น เข้าไป git init ให้มันด้วยคำสั่ง git init &#8211;bare</p>
<p>[wc_code]cd /var/repo/site.git<br />
git init &#8211;bare[/wc_code]</p>
<p>อธิบาย: git init &#8211;bare จะสร้างและเก็บค่าคอนฟิกของ Version Control เฉยๆ จะไม่มีการเก็บ Source Code</p>
<h2>ทำการ Git Hook</h2>
<p>ให้เข้าไปที่ไดเร็กทอรี่ repo ที่ได้สร้างไว้เมื่อสักครู่ จากนั้น ปรับ permission ไฟล์ hooks/post-receive เพื่ออนุญาตให้ execute file ได้ และเข้าไปแก้ไขข้อมูลในไฟล์นั้น</p>
<p>[wc_code]cd /var/repo/site.git<br />
chmod +x hooks/post-receive<br />
vi hooks/post-receive[/wc_code]</p>
<p>ในไฟล์นั้นจะไม่มีข้อมูลใดๆ จากนั้นให้เราใส่คำสั่งดังนี้</p>
<p>[wc_code]#!/bin/sh<br />
git &#8211;work-tree=/var/www/domain.com &#8211;git-dir=/var/repo/site.git checkout -f[/wc_code]</p>
<p>เป็นการบอกว่า เมื่อมีการ git push เข้ามา ให้ส่ง source code ไปยัง /var/www/domain.com</p>
<p>จากนั้นให้เราบันทึกและออกมาจากหน้า editor<br />
เป็นอันเสร็จขั้นตอนที่ต้องทำบน Production Server</p>
<h2>ทำ Git Repo บน Localhost</h2>
<p>คราวนี้เรามาจัดการบนเครื่อง Localhost เราต่อ โดยให้เราเข้าไปที่ไดเร็กทอรี่ที่เก็บ Source Code ของเรา จากนั้นเข้า Git Bash และทำการพิมพ์ git init</p>
<p>[wc_code]git init[/wc_code]</p>
<p>และพิมพ์คำสั่งทำการสร้าง remote ขึ้นมาชื่อ live</p>
<p>[wc_code]git remote add live ssh://user@mydomain.com/var/repo/site.git[/wc_code]</p>
<p>เป็นอันเสร็จขั้นตอนของ Localhost ครับ</p>
<h2>ทดลองใช้งาน</h2>
<p>ให้ลองสร้างไฟล์ขึ้นมาสักไฟล์หนึ่ง จากนั้น ทำการ commit git ตามปกติ แต่ ขั้นตอน push ให้ส่งไปที่ remote live แทน เช่น</p>
<p>[wc_code]git add .<br />
git commit -m &#8220;Test push file to production server&#8221;<br />
git push live master[/wc_code]</p>
<p>ข้อมูลบนเว็บไซต์ของเราบน Production Server จะมีการเปลี่ยนแปลงไปตามที่เราได้แก้ไขไป</p>
<h2>เพิ่มขั้นตอนทำเป็น Development Environment ก่อนก็ได้นะ</h2>
<p>การเอาขึ้น Production ด้วยคำสั่งเดียวมันดูอันตรายไปหน่อย อาจทำขั้นตอนเดียวกันนี้แต่เป็น Development Environment ก่อนก็ได้ โดยทำเหมือนเดิมทุกอย่างเลยครับ</p>
<p>โดยสมมติว่า</p>
<ul>
<li>Directory ที่เราใช้ Live Beta เว็บไซต์ เช่น /var/www/<strong>beta</strong></li>
<li>Directory ที่เราใช้เก็บ Git Repo Beta เช่น /var/repo/<strong>beta.git</strong></li>
</ul>
<p>ให้สร้าง Config Version Control</p>
<p>[wc_code]cd /var/repo/<strong>beta.git</strong><br />
git init &#8211;bare<br />
chmod +x hooks/post-receive<br />
vi hooks/post-receive[/wc_code]</p>
<p>ใส่ข้อมูลในไฟล์ hooks/post-receive ว่า</p>
<p>[wc_code]#!/bin/sh<br />
git &#8211;work-tree=/var/www/<strong>beta</strong> &#8211;git-dir=/var/repo/<strong>beta.git</strong> checkout -f[/wc_code]</p>
<p>จากนั้นมา add remote beta ใน repo localhost เราไปที่ไดเร็ดทอรี่ beta.git</p>
<p>[wc_code]git remote add <strong>beta</strong> ssh://user@mydomain.com/var/repo/<strong>beta.git</strong>[/wc_code]</p>
<p>คราวนี้ เวลาพัฒนาหรือแก้ไขปรับหรุง Source Code เสร็จ ก็ทำการนำเข้า Dvelopment Environment เพื่อทดสอบก่อน</p>
<p>[wc_code]git add .<br />
git commit -m &#8220;New version&#8221;<br />
git push beta master[/wc_code]</p>
<p>เมื่อทดสอบระบบทั้งหมดใน Development Environment  เสร็จ ก็ทำการนำเข้า Production อีกครั้ง</p>
<p>[wc_code]git push live master[/wc_code]</p>
<p>เป็นอันจบขั้นตอนทั้งหมด</p>
<p>ไว้คราวหน้าลอง CI/CD แล้วจะมาเขียนเหลาไหฟังอีกครั้ง</p>
<p>&#8212;</p>
<p>Featured Image from  <a href="http://www.flyingcorkmedia.com/blog/our-git-deployment-setup/" target="_blank">flyingcorkmedia.com</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/3932/how-to-set-up-deployment-with-git/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
