ทำ Data Pipeline กับ SFTP Server ด้วย GitLab และ Google Cloud Platform

เมื่อวานลองทำ Data Pipeline ท่าใหม่ที่ไม่เคยทำมาก่อน โดยลูกค้าจะเอาไฟล์มา Drop ไว้ให้บน SFTP แล้วเราจะต้องดูดจาก SFTP ส่งไปหา BigQuery คิดไปคิดมาได้ Solution แปลกใหม่น่าสนใจ เลยเอามาแชร์ให้อ่านกันเล่นๆ

Concept โดยคร่าวคือ เราจะต้อง Sync ข้อมูลจาก SFTP ลงมาใน Local ให้ได้ก่อน แล้วก็เลือกเฉพาะไฟล์ที่มีการเปลี่ยนแปลงส่งขึ้นไปบน Google Cloud Function (GCF) แล้วไปรัน Data Pipeline ต่อบนนั้น ซึ่งข้างบน GCloud นี่ไม่น่าเห็นห่วง เครื่องมือเขาพร้อมอยู่แล้ว แล้วน้องๆ ก็ช่วยกันดำเนินการจนสำเร็จสวยงามไปแล้ว เหลือแต่ส่วนที่เรารับผิดชอบเนี่ยแหละยังไม่ได้ทำ ทุกคนรออยู่ 555 สิ่งที่ต้องคิดเพราะยังไม่เคยทำมาก่อนคือ เรา Sync ไฟล์ลงมาจาก SFTP ได้ยังไงนี่ล่ะ แล้วจะเลือกส่งเฉพาะไฟล์ที่มีการอัพเดทได้อย่างไร

ระหว่างจัดการเรื่อง SFTP หันไปหันมา ไปเจอ lftp มีคำสั่งเอาไว้ mirror ไฟล์จาก SFTP ได้ เทพมาก ไม่ต้องคิดมากเรื่อง sync กับ SFTP อีกต่อไป

ต่อมาเริ่มพยายามเขียน Bash Script เลือกเอาเฉพาะไฟล์ใหม่ที่เพิ่มลงมา เตรียมส่งขึ้น GCF ละ แต่ฉุกคิดขึ้นมาได้ว่า เฮ้ย ถ้าเอาไปใส่ Git ล่ะ ทำได้ไหมนะ ก็ลองลองดู ไปสร้าง User ใหม่ใน GitLab ให้สิทธิ์เข้า Repo แล้วก็เชื่อม SSH Key สำหรับเครื่อง Server แล้วก็ Clone มาลงเรียบร้อย

จากนั้นก็สร้าง Script ให้มันรันทุกอย่างเป็นอัตโนมัติประมาณนี้

ทุกครั้งที่รัน จะสั่ง git pull อัพเดท Script เรียบร้อยแล้วสั่ง Sync ไฟล์จาก SFTP จากนั้นใส่ทุกความเคลื่อนไหวลงไปใน Git ทำการ Commit และ Push ขึ้นไป เรียบร้อยแล้วก็เซท Cron ให้มันรันเองทุกๆ ช่วงเวลาที่กำหนด

!! Work like magic !!

  • ไม่ต้อง Remote เข้าไปที่ Server เพื่อแก้ Script เพราะแก้จาก Git Remote ได้เลย ก่อนจะรันมัน Git Pull
  • เมื่อมีการเปลี่ยนแปลง จะเกิดขึ้น จะมี Git Commit ใหม่และถูก Push ขึ้นมา แต่ถ้าไม่มีการเปลี่ยนแปลง มันก็จะ Commit ไม่ได้ จึงไม่มีการเปลี่ยนแปลง
  • ตาม Track ได้ตลอดว่ามีไฟล์อัพเดทเมื่อไหร่จาก GitLab ไม่ต้อง Remote เข้าไปดูเอง
  • พอมี Commit Push ขึ้นไป GitLab CI ก็จะถูกรัน ทีนี้อยากจะเขียนภาษาอะไรจัดการต่อก็จัดได้หมด อยากรู้ว่าไฟล์ไหนมีการเปลี่ยนแปลงบ้างก็ไปเอา History ของ Git ออกมาดูแล้ว Regex เอาเฉพาะที่เปลี่ยนแปลงมารันได้เลย

วันนี้ตื่นมาสมองโปร่ง คิดต่อยอดไปได้อีกหน่อย ทำไมเราถึงต้องตั้งเครื่อง Server มาเปิดทิ้งไว้ด้วยล่ะ เสี่ยงมีปัญหา ต้องมีคอย Monitor ในเมื่อมี Farm GitLab Runner ของตัวเองอยู่แล้ว แล้วทุกๆ ครั้งที่มันรัน Pipeline มันก็สร้างเครื่องก็ Pull Git มาอยู่ละ ทำไมไม่รันบน GitLab CI ไปเลย แล้วก็สั่งให้มันรัน Pipeline บน GitLab ได้เลย ไม่ต้องตั้ง Cron บน Server ทีนี้ก็จะทำ Data Pipeline โดยไม่ต้องดูแลเครื่อง อันนี้เดี๋ยวก็จะต่อยอดกันต่อไปเร็วๆ นี้

นี่เป็นครั้งที่ 2 ในการเลือกเอา GitLab CI ในการทำ Data Pipeline ก่อนหน้านี้เอามารัน Script ที่รันโคตรนานแต่แบ่งงานได้ ก็เลยให้มันช่วยแบ่งงานแล้วทำเป็น Parallel Spawn เครื่อง Preemptible ขึ้นมารัวๆ ซึ่งความจริงมันก็คืองานโปรเจกต์เดียวกันนี่ล่ะ แต่รอบนี้เอามารัน Data Pipeline ซะเลย เพิ่มความ Automate ขึ้นไปอีกระดับ

เป็นการใช้เครื่องมือที่ไม่ได้ออกแบบมาให้เป็น Data Pipeline แต่โคตรเหมาะกับบางโจทย์ของการทำ Data Pipeline เลย

Credit OK ของเราใช้ 3 เครื่องมือทำครบทุกอย่าง GCP, GitLab, Slack 🙂

ตั้งเครื่อง GitLab Runner ใช้เอง แบบ Auto Scale ได้ ในราคาเบาๆ ด้วย Preemptible Instance

วันนี้จะขอมาเล่าส่วนหนึ่งของงาน DevOps ในบริษัท เป็นเรื่องของการเอา GitLab Runner เข้าไปรันบนเครื่อง Preemptible Instance ของ Google Cloud Platform ทำให้ลดค่าเครื่องไปได้อย่างมาก แต่ยังทำงานทุกอย่างเป็นปรกติดี เอาล่ะครับ อย่ามัวรอช้า เรามาเริ่มกันเลยดีกว่า

Continue reading

ทำเว็บไซต์ด้วย Hugo แล้วโฮสกันฟรีๆ บน GitLab Pages และ Cloudflare

สวัสดี​ครับ วันนี้ผมจะมาแนะนำเรื่องการทำเว็บไซต์​แล้วไปโฮสบน GitLab​ กันต่อ ซึ่งวันนี้จะเป็นการแนะนำเครื่องมือ​ทำเว็บไซต์แบบ static websit generator ที่ผมเพิ่งได้ลองใช้แล้วถูกใจมาก ชื่อว่า Hugo โดยบทความนี้จะแนะนำให้รู้จักกับ Hugo ข้อดี ข้อด้อย เปรียบเทียบ​กับการใช้ CMS ทั่วไป การใช้งานเบื้องต้น ไปจนถึงการโฮสบน GitLab Pages เชื่อม Domain จริง แล้วปิดท้ายด้วยการทำ HTTPS แบบง่ายๆ โดยใช้ Cloudflare​ เอาให้ได้ไปรับงานทำเว็บกันอย่างมันมือไปเลย

Continue reading

ใช้ GitLab Pages โฮส Static Website ฟรีๆ ไม่ต้องตั้ง Server (Step By Step)

สวัสดีครับ วันนี้ผมจะมาขอแนะนำฟีเจอร์เด็ดของเครื่องมือที่ผมชอบมากตัวหนึ่ง นั่นก็คือ GitLab Pages นั่นเอง อธิบายสั้นๆ ก็คือ GitLab Pages เอาไว้โฮสเว็บไซต์แบบ Static คือมาแต่ฝั่ง HTML/CSS/JS นั่นเอง โดยที่เราไม่จำเป็นต้องตั้ง Server ของตัวเองเลย GitLab อาสาไปโฮสให้ฟรีๆ แต่ด้วยพลังของ GitLab CI/CD ทำให้มีการสร้างโปรแกรมขึ้นมาเพื่อ Generate Static Website กันบน Online ได้เลย หนึ่งตัวที่น่าสนใจก็คือ Hugo แต่อันนั้นจะเล่าในวันหลัง ส่วนวันนี้ผมจะมาสอนการใช้แบบพื้นฐานเป็น Plain HTML กันก่อน 🙂

Continue reading

GitLab CI บทที่ 2 GitLab Runner

ก่อนจะเริ่ม GitLab CI เราก็ต้องมารู้จักกับ GitLab Runner กันเสียก่อน GitLab Runner คือ Agent ที่จะคอยรันงานที่ส่งมาจาก GitLab นั่นเอง บางคนอาจคิดไปถึงว่า เราจะ Test โปรแกรมของเราได้อย่างไรในเมื่อ Environment ของเราไม่เหมือนกันคนอื่น บางคนเขียน Ruby บางคน Java บางคน Python อย่างนี้ก็ต้องสร้างเครื่องมาเฉพาะหมดเลยหรือเปล่า คำตอบก็คือ ใช่ และ ไม่ใช่ ที่บอกว่าใช่ ก็เพราะว่า เวลาจะทดสอบระบบอะไรนั้น เราก็ต้องทำ Environment ขึ้นมาแน่นอน อันนี้หลีกเลี่ยงไม่ได้ แต่ที่บอกว่าไม่ใช่ก็ตรงที่ว่า เราไม่ต้องสร้างเครื่องใหม่หลายๆ เครื่อง อย่าลืมว่ายุคนี้มี Docker แล้ว การจะตั้ง Containner ที่มี Environment อย่างที่เราต้องการเป็นเรื่องหมูๆ เอาจริงๆ แทบจะ Copy สคริปที่ชาวบ้านทำๆ กันเอาไว้มาใช้ ส่วนใหญ่ก็แทบจะใช้งานได้ทันทีถ้าเราพัฒนามาในรูปแบบที่คนส่วนใหญ่ทำกัน ซึ่ง GitLab Runner ก็อาศัยพวก VM เนี่ยล่ะในการในการทำให้เครื่องหนึ่งเครื่องเป็น Enviromment อะไรก็ได้ ซึ่งสำหรับผมจะเลือกใช้ Docker เป็นหลักครับ

อ่อ สำหรับคนที่ใช้ GitLab ที่มี Runner พร้อมใช้อยู่แล้ว อย่างเช่นคนที่จะใช้ Share Runner บน gitlab.com ก็สามารถข้ามบทนี้ไปได้เลยครับ Continue reading

GitLab CI/CD บทที่ 1 Introduction

กล่าวสวัสดีเพื่อนๆ ชาวโปรแกรมเมอร์ทั้งหลาย เมื่อไม่นานที่ผ่านมาผมได้มีโอกาสได้สัมผัสประสบการณ์การทำทำ CI/CD อย่างจริงๆ จังๆ ด้วย GitLab เนื่องด้วยส่วนตัวเป็นคนสนใจพยายามพัฒนาซอฟแวร์แบบเน้นคุณภาพมาแต่ต้นอยู่แล้ว สาเหตุเพราะความขี้เกียจมาตามแก้บั๊กในภายหลัง ก็เลยศึกษาหาหนทางที่ชาวบ้านเขาทำกันมานมนาน แต่ก็ด้วยความที่ก็ยังถือว่าเป็นเด็กน้อยในวงการและเป็นสายอินดี้ไม่ไปอยู่ บ.พัฒนาซอฟแวร์ใหญ่ๆ ก็เลยยังไม่ได้มีโอกาสสัมผัส CI/CD อย่างเพื่อนๆ เขา เพิ่งจะมาได้จับจริงๆ จังๆ ก็คราวนี้แหละ แล้วพอได้สัมผัสแล้วก็รู้สึกเห็นคุณค่าของมัน และอยากให้นักพัฒนาซอฟแวร์ที่มีแนวคิดแบบเดียวกันได้มีโอกาสพัฒนาตัวเองขึ้นๆ ไป จึงเกิดเป็นแรงอยากจะแบ่งปันประสบการณ์และเขียนเป็น Blog Series

สารบัญ

บทที่ 1 Introduction
บทที่ 2 GitLab Runner

Continue reading