iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
DevOps

第一次參賽就學 Kubernetes系列 第 28

[Day 28] 使用 Jenkins 建置 CI/CD Pipeline 專案 (一)

  • 分享至 

  • xImage
  •  

今天來嘗試一下如何使用 Jenkins 建立 Pipeline 自動化作業,本篇實作參考 IMPLEMENTING THE ULTIMATE CI/CD PIPELINE | LIVE DEMO| JENKINS END TO END PROJECT| BEST CICD PROJECT 學習如何建立 CICD Pipeline 並將應用程式部署至 Kubernetes。

其實這個影片都有很詳細的教學在 GitHub 上,在這邊是以自己觀看影片與資料後紀錄整個學習過程。另外是這篇會使用到 AWS EC2 服務會需要花一點費用,開一個小時的話費用不到 1 美金(會開一個 t2.large 的 VM,但學習完後就馬上刪除),請自行斟酌。

該篇主要會使用 AWS EC2 建立一個執行環境,並在其上建立 Jenkins、SonarQube 和 Docker,於本機建立 minikube 叢集、於叢集上部署 Argo CD Server 來完成整個自動化流程。

流程圖
https://ithelp.ithome.com.tw/upload/images/20231030/20162511xY0wiroGzH.png
圖片參考: YouTube

  • SonarQube:是一套基於Java 開發的程式碼檢測以及品質管理平台,可以檢測出專案中重複程式碼、潛在 bug、程式碼規範、安全性漏洞等問題。
  • Argo CD:是一套開源的持續交付工具。採用 GitOps 方法,將程式部署的描述文件(manifests)儲存在 Git repo 中。當 repo 上的部署描述文件發生變更時,Argo CD 會自動將這些變更部署到 Kubernetes 叢集。

流程

相關流程如下:

  1. Fork 專案
  2. 建立 AWS EC2
  3. 安裝 Jenkins
  4. 設定 Sonar Server
  5. 安裝 Docker
  6. 啟動 minikube
  7. 安裝 Argo CD Operator
  8. JenkinsFile 說明
  9. Build Pipeline
  10. 設定 Argo CD 自動部署

1. Fork 專案

# 1. git clone 專案

# 2. 下載 maven 並執行
mvn clean package

# 3. build image
docker build -t ultimate-cicd-pipeline:v1 .

# 4. 進入到 spring-boot-app 執行
docker run -d -p 8010:8080 -t ultimate-cicd-pipeline:v1

https://ithelp.ithome.com.tw/upload/images/20231027/20162511MrX44VbcCE.png

2. 建立 AWS EC2

在 AWS EC2 上建置一個執行個體,因為該需要使用的服務資源需求較高,故會開 t2.large 的虛擬機,這個會需要一些費用,隨需 Linux 基礎定價每小時 0.0928 USD (美元),實際價格還請參考官方公告。使用完立即刪除,就不會花太多$?

  • Name: ultimate-cicd
  • AMI: Ubuntu Server 22.04 TLS
  • 架構: 64 位元
  • 執行個體類型: t2.large (使用完立即刪除)
  • 建立金鑰對(登入) key-pair,透過此金鑰來連線 EC2

→ 啟動執行個體

3. 安裝 Jenkins

以 ssh 連線至 ec2 VM。

  • pem 是建立金鑰對後下載的檔案
  • IP 可在該執行個體的「公有 IPv4 地址」找到
sudo ssh -i "your_pem_file_location" ubuntu@IP

💡 若是使用 putty,則可參考以下:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html#putty-ssh

安裝 openJDK 17 (因 SonarQube 近期版本不支援 openJDK 11 故安裝 17)。

sudo apt update
sudo apt install openjdk-17-jre

# 安裝完確認安裝版本
java -version

openjdk version "17.0.8.1" 2023-08-24
OpenJDK Runtime Environment (build 17.0.8.1+1-Ubuntu-0ubuntu122.04)
OpenJDK 64-Bit Server VM (build 17.0.8.1+1-Ubuntu-0ubuntu122.04, mixed mode, sharing)

安裝 Jenkins。

sudo wget -O /usr/share/keyrings/jenkins-keyring.asc \
  https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
  https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
  /etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install jenkins

為了要連線過去 ec2,需要「編輯傳入規則」,新增傳入規則讓本機可以連過去:

  • 所有流量、隨處 IPv4,使任何連線可以連過去 ec2

或是較謹慎點可以使用:

  • 所有流量、限制為本機電腦的 IP,讓 ec2 限制只有這個 IP 可以連過去
  • 所有流量、限制為該 ec2 自身的 IP,之後讓 jenkins 服務可以連到 SonarQube Server

查看 process。

  • ps -ef 是用來列出系統中所有正在執行的程序
  • grep jenkins 是用來過濾列表,只顯示包含 jenkins 字符串的程序。
ps -ef | grep jenkins

jenkins     5143       1 14 05:38 ?        00:00:38 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080

開啟瀏覽器連過去 ec2 上的 Jenkins :http://ec2-public-ip-address:8080

解鎖 Jenkins,金鑰透過在 ssh 的 terminal 下指令查看,並複製到 Jenkins Web 中

sudo cat /var/lib/jenkins/secrets/initialAdminPassword

建立第一位管理員使用者,這邊可以跳過、並以 admin 繼續。執行個體設定的部分按下儲存並繼續。

新增作業

來到首頁新增一個 pipeline 作業,步驟如下:

  • 新增作業 → 項目名稱輸入 ultimate-cicd → pipeline → pipeline script from SCM → SCM: Git → Repository URL: https://github.com/your-username/Jenkins-Zero-To-Hero/ → branch: main → script path: java-maven-sonar-argocd-helm-k8s/spring-boot-app/JenkinsFile → 儲存

在 pipeline 腳本有兩種方式可以輸入,第一種是直接輸入在 Jenkins Web 上,第二種方式是將腳本放在 GitHub or GitLab,並指向存在 repo 的資料夾內的 JenkinsFile其中 Jenkins 檔案名稱可以隨意、位置也可以隨意。

安裝 plugins

java-maven-sonar-argocd-helm-k8s/spring-boot-app/JenkinsFile 中會使用到 docker 與 sonarqube,故需安裝一些插件:

  • 使用 docker 為 agent,需要使用到作者寫好的一個 image,這在後面 JenkinsFile 裡面會有提到。

回到 Jenkins 安裝 plugins:

  • Docker Pipeline:資訊主頁 → 管理 Jenkins → Jenkins Plugins → Available plugins → docker pipeline → 安裝
  • SonarQube Scanner:步驟同 Docker Pipeline

將 Jenkins 與 SonarQube 安裝在同台機器上以免除掉需要額外設定兩者的連線。

4. 設定 Sonar Server

接著在 ec2 上安裝 sonarqube。

安裝 unzip。

sudo su -
apt install unzip

新增 user。

adduser sonarqube

Adding user `sonarqube' ...
Adding new group `sonarqube' (1001) ...
Adding new user `sonarqube' (1001) with group `sonarqube' ...
Creating home directory `/home/sonarqube' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for sonarqube
Enter the new value, or press ENTER for the default
	Full Name []:
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n] Y

下載 Sonarqube-9.9.2。

# 以 sonarqube user 下載 binary SonarQube 9.6.1
sudo su - sonarqube

# latest version
wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.2.77730.zip

ls
unzip *
ls
chmod -R 755 /home/sonarqube/sonarqube-9.9.2.77730
chown -R sonarqube:sonarqube /home/sonarqube/sonarqube-9.9.2.77730

# 啟動 SonarQube server
cd sonarqube-9.9.2.77730/bin/linux-x86-64/
ls

./sonar.sh start
/usr/bin/java
Starting SonarQube...
Started SonarQube.

# 查看 server 狀態
./sonar.sh status
/usr/bin/java
SonarQube is running (5796).

原本使用 OpenJDK 11、下載 SonarQube 9.9.2 版會出現以下錯誤,故後來改為使用 OpenJDK 17。

以下是錯誤訊息。

# /logs
cat nohup.log

Error: LinkageError occurred while loading main class org.sonar.application.App
	java.lang.UnsupportedClassVersionError: org/sonar/application/App has been compiled by a more recent version of the Java Runtime (class file version 61.0), this version of the Java Runtime only recognizes class file versions up to 55.0

接著前往瀏覽器輸入 http://ec2-public-ip-address:9000,初始帳號密碼為:admin,這邊會要輸入一個新的密碼,進入後會來到下圖。

https://ithelp.ithome.com.tw/upload/images/20231027/2016251133qwc0vLhd.png

剛才在 Jenkins 有安裝 SonarQube Scanner plugin,這個服務需要 token 權限。在 SonarQube 上產生 token:

  • My Account → Security → Tokens
    • Name: jenkins
    • Type: User token
    • Expires in: 30 days

→ Generate 產生 token。

回到 Jenkins 加入 Credentials:

回到 Jenkins 資訊主頁 → 管理 Jenkins → Credentials → System → Global credentials → Add Credentials → Secret text

  • Secret: 貼上 token
  • ID: sonarqube

→ Create 建立 Credentials。

5. 安裝 Docker

接著在 ec2 上安裝 Docker,會到 ssh 連到 ec2 的視窗並執行以下指令。

# 回到 root
exit

sudo apt update
sudo apt install docker.io

# 給予 jenkins 跟 ubuntu user 權限
usermod -aG docker jenkins
usermod -aG docker ubuntu
systemctl restart docker

前往網址 http://ec2-public-ip-address:8080/restart,重新啟動 Jenkins。


下一篇繼續。


上一篇
[Day 27] Namespaces
下一篇
[Day 29] 使用 Jenkins 建置 CI/CD Pipeline 專案 (二)
系列文
第一次參賽就學 Kubernetes30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言