今天來嘗試一下如何使用 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 來完成整個自動化流程。
流程圖
圖片參考: YouTube
相關流程如下:
# 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
在 AWS EC2 上建置一個執行個體,因為該需要使用的服務資源需求較高,故會開 t2.large 的虛擬機,這個會需要一些費用,隨需 Linux 基礎定價每小時 0.0928 USD (美元),實際價格還請參考官方公告。使用完立即刪除,就不會花太多$?
key-pair
,透過此金鑰來連線 EC2→ 啟動執行個體
以 ssh 連線至 ec2 VM。
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,需要「編輯傳入規則」,新增傳入規則讓本機可以連過去:
或是較謹慎點可以使用:
查看 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 檔案名稱可以隨意、位置也可以隨意。
在 java-maven-sonar-argocd-helm-k8s/spring-boot-app/JenkinsFile
中會使用到 docker 與 sonarqube,故需安裝一些插件:
JenkinsFile
裡面會有提到。回到 Jenkins 安裝 plugins:
Docker Pipeline
:資訊主頁 → 管理 Jenkins → Jenkins Plugins → Available plugins → docker pipeline → 安裝SonarQube Scanner
:步驟同 Docker Pipeline將 Jenkins 與 SonarQube 安裝在同台機器上以免除掉需要額外設定兩者的連線。
接著在 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
,這邊會要輸入一個新的密碼,進入後會來到下圖。
剛才在 Jenkins 有安裝 SonarQube Scanner plugin,這個服務需要 token 權限。在 SonarQube 上產生 token:
→ Generate 產生 token。
回到 Jenkins 加入 Credentials:
回到 Jenkins 資訊主頁 → 管理 Jenkins → Credentials → System → Global credentials → Add Credentials → Secret text
sonarqube
→ Create 建立 Credentials。
接著在 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。
下一篇繼續。