Go (programming language) Continuous Integration with Jenkins (Pipeline) ตอน 1

ผมได้มีโอกาสจับ GoLang ในงานที่ทำอยู่ และเวลาจะ deploy ทุกคนคงคุ้นเคยกับ Jenkins กันอยู่แล้ว วันนี้ผมเลยมาเขียนบทความ build, test, deploy แบบ pipeline

ตอนนี้ผมกำลังจะทำให้เสร็จแบบรูปด้านบนอยู่ครับ ก็เลยจะเขียนวิธีการเป็น Step by step ไว้แล้วกันแบบสด ๆ แล้วค่อยกลับมาแก้ไขอีกครั้ง

สิ่งที่ผมใช้ในครั้งนี้มี

  1. Amazon EC2 (Ubuntu 14.04) สำหรับ Jenkins (Install nginx, go, git)
  2. Amazon EC2 (RedHat) สำหรับ run go (Dev server)
  3. Jenkins 2
  4. Git
  5. RobotFramework

Amazon EC2 (Ubuntu 14.04)

ssh เข้า AWS

$ ssh -i xxx.pem ubuntu@ec2–xxx.compute.amazonaws.com

1. Update Aptitude Package Management

ผมใช้ aptitude ในการจัดการ Package ครับ

$ sudo aptitude update

2. Install NGINX

$ sudo aptitude install -y nginx

แก้ไข config nginx ให้เข้า browser ผ่าน IP หรือ domain ได้เลยไม่ต้องมี port 8080 ต่อท้ายสำหรับ Jenkins

เข้าไปที่ path

$ cd /etc/nginx/sites-available/
$ vim default

แก้ไข config nginx ดังนี้

# Based on http://nginx.org/en/docs/http/load_balancing.html
upstream backend {
#ip_hash;
server localhost:8080;
#server app02:8080;
}
server {
listen 80;
server_name localhost;
location ~* \/assets\/(css|images|js|template)\/* {
root /usr/share/nginx/;
expires max;
add_header Pragma public;
add_header Cache-Control "public, must-revalidate, proxy-revalidate";
add_header Vary Accept-Encoding;
access_log off;
}
location / {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $proxy_host;
add_header Request-Time $request_time;
add_header Upstream-Address $upstream_addr;
add_header Upstream-Response-Time $upstream_response_time;
proxy_pass http://backend;
}
error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location /nginx_status {
stub_status on;
access_log off;
}
}

3. Install Jenkins (Continuous Integration system)

$ wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo aptitude update -y
$ sudo aptitude search jenkins
$ sudo aptitude install -y jenkins

เริ่มการทำงานของ Jenkins

$ sudo service jenkins start

Restart NGINX

$ sudo service nginx restart

เข้า IP หรือ Domain ที่ติดตั้ง Jenkin ผ่าน browser “http://xx.xx.xx.xxx/”

ภาพนี้ตอนทำไม่ได้เก็บภาพไว้เลยมาทำย้อนหลังซึ่ง path ไม่ตรงเลยขอลบกันสับสน
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
ภาพนี้ตอนทำไม่ได้เก็บภาพไว้เลยมาทำย้อนหลังซึ่ง path ไม่ตรงเลยขอลบกันสับสน

เข้า port 80 ปกติ

4. Install Git

$ sudo aptitude install -y git

5. Install go (1.7)

$ curl https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz | tar xz

ย้าย folder go ไปไว้ใน /usr/local

$ sudo mv go /usr/local

go จะถูกย้ายมาอยู่ที่ /usr/local

$ cd /usr/local
$ ll

เพิ่ม GOROOT และ GOPATH

$ vim ~/.bashrc

เพิ่มบรรทัดล่างสุดของไฟล์ .bashrc

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

6. สร้าง ssh key สำหรับ User Ubuntu เวลาเชื่อมต่อกับ git repo

$ ssh-keygen -t rsa -b 4096 -C "Ubuntu@Jenkins"
$ cat ~/.ssh/id_rsa.pub

จากนั้น Copy key ไปไว้ที่ git repo ที่ใช้ เช่น github, bitbucket (SECURITY -> SSH keys)

GitHub: https://github.com/settings/keys

bitbucket.org: https://bitbucket.org/account/user/xxx/ssh-keys/

  • github
  • bitbucket

ทดสอบเชื่อมต่อ git repo

$ ssh -T git@bitbucket.org

7. สร้าง ssh key สำหรับ User Jenkins เวลาเชื่อมต่อกับ git repo

List users จะเห็น jenkins

$ cat /etc/passwd

Login as user Jenkins

$ sudo su - jenkins

ssh keygen

$ ssh-keygen -t rsa -b 4096 -C "Jenkins@Jenkins"
$ cat ~/.ssh/id_rsa.pub

จากนั้น Copy key ไปไว้ที่ git repo ที่ใช้ เช่น github, bitbucket (SECURITY -> SSH keys)

ทดสอบเชื่อมต่อ git repo

$ ssh -T git@bitbucket.org

8. Go workspace in Jenkins

สร้าง workspace ของ go กันครับ

$ cd ~/workspace/go

ถ้าไม่มีก็ทำการสร้าง workspace/go ก่อนเลย path จะเป็น “/var/lib/jenkins/workspace/go”

จากนั้นก็จะสร้าง workspace directory hierarchy

  • src contains Go source files,
  • pkg contains package objects, and
  • bin contains executable commands.

ด้วยคำสั่ง mkdir

$ mkdir -p {src, bin, pkg}

9. แก้ไข .bashrc ของ user Jenkins

$ vim ~/.bashrc

เพิ่ม GOROOT, GOPATH

export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=~/workspace/go

เดี๋ยวบทความหน้ามันจะยาวไปจนตาลายผมขอไปต่อตอน 2… แทนนะครับ

Go (programming language) Continuous Integration with Jenkins (Pipeline) ตอน 2
Like what you read? Give Pitchanon Dumrongsiri a round of applause.

From a quick cheer to a standing ovation, clap to show how much you enjoyed this story.