Jenkins with .net core on docker container

สำหรับบทความนี้จะออกแนวๆ ขี้เกียจหน่อยๆ ครับ เพราะเนื่องจากได้มีเวลาลองเล่น Jenkins แล้วดันติดปัญหาตรงที่ …

Build .net Coreไม่ได้!!

เอายังไงดีละทีนี้ จะไปหาเครื่องมาทำ Agent ก็ไม่ไหวเพราะมี Notebook เครื่องเดียว

หรือจะลงมันบน Windows เลย ไม่เอาดีกว่า ขี้เกียจ Config อีก

เอาอย่างงี้เลยแล้วกัน ใช้ Docker มาช่วยเอาดีกว่าจะได้ไม่ต้องไปยุ่งอะไรกับตัว Environment ของ Windows ว่าแล้วก็เตรียมของกันดีกว่าครับ

ของที่ต้องมี

  • Docker (Linux Container) (ฺBase image มีขนาดไฟล์เล็กกว่าของฝั่ง Windows มากๆ ครับ เลยเลือกใช้งานตัวนี้แทน)
  • VS Code
  • Internet

จากนั้นมาลงมือทำกันเลยดีกว่าครับ

เปิด VS Code ขึ้นมาแล้วจากนั้นให้ติดตั้ง Extension ของ Docker เพื่อเป็นตัวช่วยในการเขียนคำสั่งครับ

Docker extension for VS Code

หลังจากที่ลง Extension เสร็จแล้ว ก็ให้สร้างไฟล์ชื่อ Dockerfile ขึ้นมา ซึ่งไอคอนของไฟล์ที่สร้างขึ้นมาก็จะเป็นรูปปลาวาฬ แบบนี้ครับ

Create new Dockerfile

ขั้นตอนต่อไป เราะจะระบุ Base Image ที่เราต้องการจะเอามาใช้งานกัน โดยเราจะใช้ Base image ของ ทาง Jenkins ที่เขาสร้างเอาไว้แล้ว (Jenkins Base image จะมีอยู่ด้วยกัน 2 ตัว คือของทาง Jenkins เองและของทาง Docker สร้างขึ้นมา)

โดยที่เราจะใช้คำสั่ง FROM เพื่อกำหนดตามโค๊ดด้านล่าง

FROM jenkins/jenkins:latest

ใส่ Maintainer เอาไว้เผื่อใครเอาไปใช้แล้วอยากขอลายเซ็นต์ (หรือจะบอกว่าเอาไปใช้งานไม่ได้กันแน่นะ)

MAINTAINER Vatthanachai W.(vatthanachai.w@gmail.com)

แล้วจากนั้นเราจะใช้สิทธิ์ของ root หรือผู้ดูแลระบบในการติดตั้งโปรแกรม โดยใช้คำสั่ง USER เพื่อระบุ User ที่ต้องการใช้ ตามนี้

USER root

จากนั้นเราจะทำการอัพเดทระบบกันก่อนสักหน่อย ก่อนจะทำการติดตั้ง ด้วยคำสั่ง ดังนี้

RUN apt-get update && \ 
apt-get upgrade -y && \
apt-get dist-upgrade -y

ต่อไปจะเป็นการเตรียมติดตั้งตัว .net core 2 สำหรับในขั้นตอนนี้จะมีการติดตั้ง Packages ต่างๆ ที่จำเป็นต้องใช้งานลงไปด้วย รวมถึงการเพิ่ม source list เพื่อให้สามารถโหลด Packages มาติดตั้ง ซึ่งสามารถอ่านรายละเอียดได้จากบทความของ Microsoft ตามลิงค์นี้ได้ครับ https://docs.microsoft.com/en-us/dotnet/core/linux-prerequisites?tabs=netcore2x

RUN apt-get install -y apt-transport-https \
&& apt-get install -y --no-install-recommends \
curl libunwind8 gettext apt-transport-https && \
curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg && \
mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg && \
sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/dotnetdev.list' && \
apt-get update

จากนั้นเราก็จะมาทำการติดตั้ง .net core2 และกำหนด Environment สำหรับ Jenkins กันด้วยคำสั่ง

RUN apt-get install -y dotnet-sdk-2.1 && \
export PATH=$PATH:$HOME/dotnet && \
dotnet --version

เมื่อเสร็จแล้วก็จะมาเคลียร์ของที่ไม่ได้ใช้งานออกจาก Docker image ที่เราสร้างขึ้นด้วยคำสั่ง

RUN apt-get clean && apt-get autoremove -y

และเซ็ต user ให้กลับเป็น jenkins เหมือนเดิม ก็เป็นอันจบการสร้าง
Jenkins + .net Images ของเราเอง

USER jenkins
All code

จากนั้นเปิด Console ขึ้นมาเพื่อทำการ Build Image จะใช้ DOS, Bash หรือ
Power shell ก็ได้ครับ จริงๆ จะใช้ Terminal ของตัว VS Code แบบผมก็ได้ครับ
(ใช้คีย์ลัด Ctrl + Shift + p แล้วพิมพ์ terminal)

Vs Code >> Terminal

จากนั้นใช้คำสั่งด้านล่าง เพื่อทำการ Build Image และอย่าลืมเพิ่ม “.” เอาหลังสุดด้วยนะครับ

$> docker build -t jenkin-netcode:2.1 .

จากนั้นนั่งรอไปเรื่อยๆ จนเสร็จครับ

Build Image Inprogress
After build image success

จากนั้นให้ลองใช้คำสั่งนี้ เพื่อเช็คดูว่า Docker image ที่เราทำการ build สามารถเรียกใช้งานได้หรือยัง ซึ่งจะมีชื่อ jenkins-netcore ขึ้นมา โดยจะมี Tag บอกว่าเป็น version 2.1 ดังภาพข้างล่าง

$> docker images

จากนั้นก็จะเป็นขั้นตอนการเรียกใช้งาน Image ที่เราสร้างขึ้นมา โดยเราจะใช้คำสั่งนี้เพื่อเป็นการสร้าง Container ที่ชื่อว่า jenkins ขึ้นมา

$> docker run -d -p 8080:8080 --name jenkins jenkin-netcode:2.1

หลังจากนั้นรอสักครู่ ก็จะสามารถเรียกใช้งาน ผ่านทาง Url : http://localhost:8080 ได้แล้วครับ

Jenkins Start page

สำหรับการดคีย์เพื่อเข้าสู่การตั้งค่า เราสามารถใช้คำสั่ง logs เพื่อแสดงคีย์ ตามนี้ครับ

$> docker logs <Container ID || Container Name>

ซึ่งอย่างในตัวอย่างเราจะใช้ชื่อ jenkins เราก็จะใช้คำสั่งแบบนี้ได้เลยครับ

$> docker logs jenkins
Jenkins initial setup password

ส่วนในการติดตั้ง plugin ผมจะติดตั้งเพิ่มแค่ gitlab ครับ นอกนั้นก็ตามที่ jenkins เลือกมาให้ครับ

Jenkins’s plug-in install

หลังจากนั้น เราจะมาลองสร้างโปรเจคเปล่าๆ เพื่อทดสอบดูว่าตัว jenkins สามารถใช้งานคำสั่ง dotnet ของตัว .net core ได้หรือเปล่า โดยผมจะลองสร้างโปรเจคเปล่าๆ ที่ชื่อว่า hello และเป็นแบบ freestyle project ขึ้นมา ตามภาพข้างล่าง แล้วคลิก OK

Create new project in jenkins

จากนั้นให้เลื่อนลงมาข้างล่างในส่วนของ Buid ให้เราเลือก Excute Shell ดังภาพ

แล้วใช้คำสั่งสร้างโปรเจคใหม่ของ .net core เพื่อทดสอบว่าสามารถ Build โปรเจคได้หรือไม่ ดังนี้

mkdir hello && \
cd hello && \
dotnet new console && \
dotnet build

จากนั้นให้ Save แล้วจะเข้าสู่หน้า manage ของโปรเจคที่สร้างขึ้น ดังภาพ

ทดสอบการทำงานโดยคลิกที่ Build Now ในฝั่งซ้ายมือ เพื่อรันโปรเจค

ซึ่งจะมารายการ Build แสดงขึ้นมา ดังภาพซึ่งจะอยู่ข้างล่างของเมนู

เมื่อคลิกเข้าไปดูจะแสดงรายละเอียด ดังภาพ

สำหรับรายละเอียดการทำงาน เราสามารถเข้าไปดูได้ที่เมนู Console Output โดยจะอยู่ทางซ้ายมือ ดังภาพ

และเมื่อคลิกเข้ามาแล้ว จะมีรายละเอียดข้อมูลการทำงาน ดังภาพ ก็สามารถเอาไปใช้งานจริงได้แล้วครับ

ขอบคุณทุกๆ ท่านที่อ่านมาจนจบนะครับ หวังว่าจะพอมีประโยชน์สำหรับการทำงานนะครับ :)

--

--