參考連結
解決:Jenkins: signature verification failed in update site ‘default‘ (show details)
jenkins 下一切皆檔案
虛擬機器器基本設定
cd /usr/local/src/
rz # 選擇以下安裝包(xshell 軟體命令)
下載完安裝包如下所示
依次執行以下命令,進行安裝
rpm -ivh jdk-8u121-linux-x64.rpm
# java -version # 檢驗是否安裝成功
rpm -ivh jenkins-2.99-1.1.noarch.rpm
啟動 jenkins 服務
systemctl start jenkins
設定 jenkins 服務開機自啟
systemctl enable jenkins
檢視 jenkins 服務啟動狀態
systemctl status jenkins
檢視伺服器埠啟用情況(jenkins 預設佔用 8080 埠)
netstat -lnupt
通過瀏覽器存取 10.0.0.12:8080(ip + 8080 埠)
查詢本機 ip 的方式
ip addr
獲取初始化密碼
cat /var/lib/jenkins/secrets/initialAdminPassword
輸入初始化密碼後點選 Continue,出現如下介面
點選 ×,不選擇提供的安裝選項
點選 Start using Jenkins
由於預設 jenkins 的密碼較複雜,所以首先更改 admin 使用者的密碼
通過安裝包載入外掛
rz # 選擇安裝包(xshell 軟體命令)
在 jenkins 外掛目錄中安裝外掛
cd /var/lib/jenkins/plugins/
解壓安裝包
tar xf plugins.tar.gz
將 plugins 中的檔案全部複製到 jenkins 外掛目錄下
cd plugins
mv * /var/lib/jenkins/plugins/
檢查是否複製成功
cd /var/lib/jenkins/plugins/
ll
重啟 jenkins 服務
systemctl restart jenkins
回到瀏覽器中會發現已載入外掛(注:非必要不更新)
通過命令檢視目錄
cd /var/lib/jenkins/plugins/
rpm -ql jenkins
執行建立的構建任務
修改 jenkins 使用者為 root 使用者(方便後續認證管理)
vim /etc/sysconfig/jenkins
重啟 jenkins 服務
systemctl restart jenkins
前提準備
安裝 git
yum -y install git
ssh 設定,進行許可權認證
ssh-keygen -t rsa # 加三次回車
cat /root/.ssh/id_rsa.pub # 複製公鑰,設定到 gitlab 上
點選「立即構建」,檢查是否設定無誤
也可以在終端檢視是否拉取原始碼成功
cd /var/lib/jenkins/workspace/My-freestyle-job/
ll
在 ci-node1(10.0.0.11)上安裝 httpd(Apache)服務,並設定伺服器埠為 10001
cd
yum -y install httpd
vim /etc/httpd/conf/httpd.conf
重啟 httpd 服務
systemctl restart httpd
檢視埠
netstat -lnupt
在瀏覽器中存取 10.0.0.11:10001
設定 ci-node2(10.0.0.12)到 ci-node1(10.0.0.11)的 ssh 免密碼登入
ssh-copy-id -i /root/.ssh/id_rsa.pub [email protected]
ssh 10.0.0.11 # 測試是否設定成功
exit # 斷開連線
在 ci-node2(10.0.0.12)上編寫打包指令碼
mkdir -p /server/scripts
cd /server/scripts
vim /server/scripts/deploy.sh
#!/bin/bash
#目標伺服器 IP 地址
host=$1
#job 名稱
job_name=$2
#包名
name=web-$(date +%F)-$(($RANDOM+10000))
#打包
cd /var/lib/jenkins/workspace/${job_name} && tar czf /opt/${name}.tar.gz ./*
#傳送包到目標伺服器
ssh ${host} "cd /var/www/ && mkdir ${name}"
scp /opt/${name}.tar.gz $host:/var/www/${name}
#解包
ssh ${host} "cd /var/www/${name} && tar xf ${name}.tar.gz && rm -f ${name}.tar.gz"
#使用軟連結方式部署服務
ssh ${host} "cd /var/www && rm -rf html && ln -s /var/www/${name} /var/www/html"
#!/bin/bash
host=$1
job_name=$2
name=web-$(date +%F)-$(($RANDOM+10000))
cd /var/lib/jenkins/workspace/${job_name} && tar czf /opt/${name}.tar.gz ./*
ssh ${host} "cd /var/www/ && mkdir ${name}"
scp /opt/${name}.tar.gz $host:/var/www/${name}
ssh ${host} "cd /var/www/${name} && tar xf ${name}.tar.gz && rm -f ${name}.tar.gz"
ssh ${host} "cd /var/www && rm -rf html && ln -s /var/www/${name} /var/www/html"
執行 deploy.sh 指令碼
sh /server/scripts/deploy.sh 10.0.0.11 My-freestyle-job
檢查是否傳輸成功
# 在 ci-node1(10.0.0.11)上
ll /var/www/web-2023-08-30-39547
# 在 ci-node2(10.0.0.12)上
ll /opt/
在瀏覽器中存取 10.0.0.11:10001
# 在 Command 中新增 shell 命令,執行指令碼
sh /server/scripts/deploy.sh 10.0.0.11 ${JOB_NAME}
檢查是否傳輸成功
# 在 ci-node1(10.0.0.11)上
ll /var/www/web-2023-08-30-31666
# 在 ci-node2(10.0.0.12)上
ll /opt/
將 URL 和 Secret Token 設定到 gitlab 上
測試是否設定成功
gitlab 模擬測試
使用 ci-node1(10.0.0.11)測試
cd
git clone [email protected]:zylyehuo/monitor.git
cd monitor/
vim index.html
如圖修改為 zylyehuo持續整合測試,進行測試
git add .
git commit -m "modify index.html on ci-node1"
git push -u origin master
獲取 gitlab 的 Access Tokens
設定 jenkins
設定測試
改動 index.html 進行測試
cd ~/monitor/
vim index.html
git add .
git commit -m "modify index.html on ci-node1 second"
git push -u origin master
Maven 是一個專案管理和綜合工具。Maven 提供了開發人員構建一個完整的生命週期框架。開發團隊可以自動完成專案的基礎工具建設,Maven 使用標準的目錄結構和預設構建生命週期。
Maven 簡化和標準化專案建設過程。處理編譯,分配,檔案,團隊共同作業和其他任務的無縫連線。 Maven 增加可重用性並負責建立相關的任務。
Maven 專案的結構和內容在一個 XML 檔案中宣告,pom.xml 專案物件模型(POM),這是整個 Maven 系統的基本單元。用來管理專案的構建,相關性和檔案。最強大的功能就是能夠自動下載專案依賴庫。
cd /usr/local/src/
rz # xshell 指令,選擇 3.3.9版本的 maven 安裝包
tar xf apache-maven-3.3.9-bin.tar.gz
mv apache-maven-3.3.9 /usr/local/
由於檔案名字太長,故進行軟連線
cd /usr/local/
ln -s /usr/local/apache-maven-3.3.9/ /usr/local/maven
檢查是否安裝成功
/usr/local/maven/bin/mvn -v
將 mvn 命令載入到環境變數中
vim /etc/profile
# export PATH=/usr/local/apache-maven-3.3.9/bin/:$PATH
source /etc/profile
檢驗是否設定成功
mvn -v
上傳一個 Java 專案進行測試使用
cd /usr/local/maven/
rz
mv hello-world.tar.gz /root/
tar xf hello-world.tar.gz
位於有 pom.xml 檔案的路徑下
mvn package # 第一次執行時間會比較久
mvn clean
mvn test
mvn install
mvn clean package # 按照順序執行,先清除上一次構建的結果,再構建/打包
Nexus 是一個強大的 Maven 倉庫管理器,它極大地簡化了本地內部倉庫的維護和外部倉庫的存取。
Nexus 在代理遠端倉庫的同時維護本地倉庫,以降低中央倉庫的負荷,節省外網頻寬和時間。
Nexus 是一套「開箱即用」的系統不需要資料庫,它使用檔案系統加 Lucene 來組織資料。
Nexus 使用 ExtJS 來開發介面,利用 Restlet 來提供完整的 REST APIs,通過 m2eclipse 與 Eclipse 整合使用。
Nexus 支援 WebDAV 與 LDAP 安全身份認證。
Nexus 還提供了強大的倉庫管理功能,構件搜尋功能,它基於 REST,友好的 UI 是一個 extjs 的 REST 使用者端,它佔用較少的記憶體,基於簡單檔案系統而非資料庫。
在 ci-node3(10.0.0.13)上
cd /usr/local/src/
rz
rpm -ivh jdk-8u121-linux-x64.rpm # 安裝 jdk
# java -version # 測試是否安裝成功
mv nexus-3.13.0-01-unix.tar.gz /usr/local/
cd /usr/local/
tar xf nexus-3.13.0-01-unix.tar.gz # 解壓
mv nexus-3.13.0-01-unix.tar.gz ./src/
ln -s /usr/local/nexus-3.13.0-01/ /usr/local/nexus # 軟連線
調整組態檔
cd /usr/local/nexus/bin/
vim nexus.rc
/usr/local/nexus/bin/nexus run
瀏覽器存取 10.0.0.13:8081,測試是否啟動成功
/usr/local/nexus/bin/nexus start
/usr/local/nexus/bin/nexus stop
/usr/local/nexus/bin/nexus status
cd /usr/local/maven/conf/
vim settings.xml
<!--在<profiles></profiles>之間加入下面的設定-->
<profile>
<id>my-nexus</id>
<repositories>
<!-- 私有庫地址-->
<repository>
<id>nexus</id>
<name>nexus</name>
<url>http://10.0.0.13:8081/repository/maven-public/</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<!--外掛庫地址-->
<pluginRepository>
<id>nexus</id>
<url>http://10.0.0.13:8081/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<!--在<settings></settings>之間加入下面的設定,啟用使用上面的設定-->
<activeProfiles>
<activeProfile>my-neuxs</activeProfile>
</activeProfiles>
<!--注:profile 名字要對應-->
<!--在<mirros></mirros>之間加入如下設定-->
<mirror>
<id>nexus-myself</id>
<!--*指的是存取任何倉庫都使用我們的私服-->
<mirrorOf>*</mirrorOf>
<name>Nexus myself</name>
<url>http://10.0.0.13:8081/repository/maven-public/</url>
</mirror>
刪除原先下載的 .m2 本地倉庫,防止其直接在本地倉庫下載,而不去存取遠端倉庫
cd /root/hello-world
rm -rf /root/.m2/
mvn clean
此時可以發現,存取的遠端倉庫地址以及發生改變,代表私服已經設定成功
在 gitlab 上新建專案,用於在 jenkins 中進行設定
將本地倉庫進行 git 初始化
git config --global user.name zylyehuo
git config --global user.email [email protected]
git init
git remote add origin [email protected]:root/helloworld.git
git add .
git commit -m "Initial commit"
git push -u origin master
將 gitlab 倉庫中 ssh 地址設定到 jenkins 中
測試是否設定成功
Jenkins pipeline 是 Jenkins 2.0 的精髓, ,是幫助 Jenkins 實現 CI 到 CD 轉變的重要角色。簡單來說,就是一套執行於 Jenkins 上的工作流框架,將原本獨立執行於單個或者多個節點的任務連線起來,實現單個任務難以完成的複雜釋出流程。Pipeline 的實現方式是一套 Groovy DSL,任何釋出流程都可以表述為一段 Groovy 指令碼,並且 Jenkins 支援從程式碼庫直接讀取指令碼,從而實現了Pipeline as Code 的理念。
Stage:一個 Pipeline 可以劃分為多個 Stage,每個 Stage 包含一組操作(Step)。注意一個 Stage 可以跨多個 Node 執行,即 Stage 實際上是 Step 的邏輯分組。
Node:一個 Node 就是一個 Jenkins 節點, 可以是 Master,或者是 Slave, 提供 Pipeline 中 Step 的具體執行環境。
Step:是最基本的操作單元,可以是建立一個目錄、從程式碼庫中 checkout 程式碼、執行一個 shell 命令、構建 Docker 映象、將服務釋出到 Kubernetes 叢集中。Step 由 Jenkins 和 Jenkins Plugin 各種外掛提供。
Jenkins Pipeline 支援兩種語法, 一種 Declarative Pipeline(宣告式), 一種 Scripted Pipeline(指令碼式)。 宣告式的 Pipeline 限制使用者使用嚴格的預選定義的結構,是一種宣告式的程式設計模型, 對比指令碼式的 Pipeline 學習起來更加簡單;指令碼式的 Pipeline 限制比較少,結構和語法的限制由 Groovy 本身決定,是一種命令式的程式設計模型。一般來說 jenkinsfile 會被放在程式碼庫的根目錄下。當然也可以在 Web 頁面定義。
宣告式的 Pipeline 有嚴格的預定義格式結構, 最外層必須是 pipeline{},緊接著是 agent 指示 Jenkins 分配一個執行器和工作空間來執行下面的 Pipeline,stages 和 steps 是申明式 Jenkinsfile 必須的,所有的 stage 必須要定義在 stages 裡,stage 的名稱不能重複,每一個 stage 下的 step (具體的執行步驟)要定義在一個 steps 裡
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building..'
}
}
stage('Test') {
steps {
echo 'Testing..'
}
}
stage('Deploy') {
steps {
echo 'Deploying....'
}
}
}
}
在指令碼式 jenkinsfile 裡,你可以定義一個 node 或者多個 node 塊,然後在 node 塊裡定義你的 stage,在 stage 裡定義你的 step 即可。
node {
stage('Build') {
//
}
stage('Test') {
//
}
stage('Deploy') {
//
}
}
測試效果
在 gitlab 上的 monitor 倉庫的根目錄下建立一個 Jenkinsfile(名字儘量固定是這個)檔案
pipeline {
agent any
stages {
stage('Stage 1') {
steps {
echo 'Hello world!'
}
}
}
}
在 Jenkins 新建一個 pipeline job
測試設定是否成功
在終端檢視檔案
ll /var/lib/jenkins/workspace/My-pipeline-job01
修改 gitlab 中 Jenkinsfile 檔案
此 Jenkinsfile 包括五個 stage,分為 replace file、unit test、package、deploy、test,對於非編譯專案,一般包括這五個階段。
pipeline {
agent any
stages {
stage('replace file') {
steps {
echo "replace config file use cp "
}
}
stage('unit test') {
steps {
echo "unit test "
}
}
stage('package') {
steps {
sh 'tar czf /opt/web-${BUILD_ID}.tar.gz ./* --exclude=./git --exclude=Jenkinsfile'
}
}
stage('deploy') {
steps {
sh 'ssh 10.0.0.11 "cd /var/www && mkdir web-${BUILD_ID}"'
sh 'scp /opt/web-${BUILD_ID}.tar.gz 10.0.0.11:/var/www/web-${BUILD_ID}'
sh 'ssh 10.0.0.11 "cd /var/www/web-${BUILD_ID} && tar xf web-${BUILD_ID}.tar.gz && rm -f web-${BUILD_ID}.tar.gz"'
sh 'ssh 10.0.0.11 "cd /var/www && rm -rf html && ln -s /var/www/web-${BUILD_ID}" /var/www/html'
}
}
stage('test') {
steps {
echo "deploy after test "
}
}
}
}
在 jenkins 中點選「立即構建」,檢視效果
在瀏覽器中存取 10.0.0.11:10001,檢視效果
systemctl start httpd # 若存取瀏覽器打不開,先檢查服務是否啟動