Jenkins 基礎設定

2023-08-31 18:01:22

部落格地址:https://www.cnblogs.com/zylyehuo/

參考連結
解決:Jenkins: signature verification failed in update site ‘default‘ (show details)

jenkins 下一切皆檔案

虛擬機器器基本設定

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

Jenkins 初始化設定

通過瀏覽器存取 10.0.0.12:8080(ip + 8080 埠)

查詢本機 ip 的方式

ip addr

獲取初始化密碼

cat /var/lib/jenkins/secrets/initialAdminPassword

輸入初始化密碼後點選 Continue,出現如下介面

點選 ×,不選擇提供的安裝選項

點選 Start using Jenkins

由於預設 jenkins 的密碼較複雜,所以首先更改 admin 使用者的密碼

Jenkins 外掛管理

通過安裝包載入外掛

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

回到瀏覽器中會發現已載入外掛(注:非必要不更新)

Jenkins 目錄介紹

通過命令檢視目錄

cd /var/lib/jenkins/plugins/

rpm -ql jenkins

Jenkins 構建一個自由風格的軟體專案

執行建立的構建任務

修改 jenkins 使用者為 root 使用者(方便後續認證管理)

vim /etc/sysconfig/jenkins

重啟 jenkins 服務

systemctl restart jenkins

獲取 gitlab 原始碼

前提準備

安裝 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

使用拉取的原始碼部署 html 網站

在 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

/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"

/server/scripts/deploy.sh(無註釋版)

#!/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

在 Jenkins 中設定執行 deploy.sh 部署指令碼

# 在 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/

Jenkins 設定 gitlab 自動觸發構建(普通公司不建議使用,除非測試非常全面)

將 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

Jenkins 設定返回構建狀態到 gitlab

獲取 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

Jenkins 安裝、設定 maven(用於 Java 倉庫)(Centos 7)

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

mvn 命令

位於有 pom.xml 檔案的路徑下

構建/打包

mvn package  # 第一次執行時間會比較久

清除上一次構建的結果

mvn clean

測試

mvn test

將打包好的 jar/war 檔案複製到 .m2 本地倉庫中,供其他模組使用

mvn install

命令組合使用

mvn clean package  # 按照順序執行,先清除上一次構建的結果,再構建/打包

Jenkins 安裝、設定 nexus(搭建 Maven 私服)

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

nexus 命令

啟動 nexus(帶輸出)

/usr/local/nexus/bin/nexus run

瀏覽器存取 10.0.0.13:8081,測試是否啟動成功

啟動 nexus(不帶輸出)

/usr/local/nexus/bin/nexus start

停止 nexus

/usr/local/nexus/bin/nexus stop

檢視 nexus 狀態

/usr/local/nexus/bin/nexus status

使用 admin 預設賬戶登入 nexus

Maven 全域性(整個專案)設定

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

此時可以發現,存取的遠端倉庫地址以及發生改變,代表私服已經設定成功

Jenkins 構建一個 maven 專案

在 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 pipeline 是 Jenkins 2.0 的精髓, ,是幫助 Jenkins 實現 CI 到 CD 轉變的重要角色。簡單來說,就是一套執行於 Jenkins 上的工作流框架,將原本獨立執行於單個或者多個節點的任務連線起來,實現單個任務難以完成的複雜釋出流程。Pipeline 的實現方式是一套 Groovy DSL,任何釋出流程都可以表述為一段 Groovy 指令碼,並且 Jenkins 支援從程式碼庫直接讀取指令碼,從而實現了Pipeline as Code 的理念。

Pipeline 的基本概念

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 各種外掛提供。

Jenkinsfile 語法

Jenkins Pipeline 支援兩種語法, 一種 Declarative Pipeline(宣告式), 一種 Scripted Pipeline(指令碼式)。 宣告式的 Pipeline 限制使用者使用嚴格的預選定義的結構,是一種宣告式的程式設計模型, 對比指令碼式的 Pipeline 學習起來更加簡單;指令碼式的 Pipeline 限制比較少,結構和語法的限制由 Groovy 本身決定,是一種命令式的程式設計模型。一般來說 jenkinsfile 會被放在程式碼庫的根目錄下。當然也可以在 Web 頁面定義。

Declarative Pipeline(宣告式)(嚴格但簡單)

宣告式的 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....'
      }
    }
  }
}

Scripted Pipeline(指令碼式)(需要學習 Groovy 指令碼語言)

在指令碼式 jenkinsfile 裡,你可以定義一個 node 或者多個 node 塊,然後在 node 塊裡定義你的 stage,在 stage 裡定義你的 step 即可。

node {
  stage('Build') {
    //
  }
  stage('Test') {
    //
  }
  stage('Deploy') {
    //
  }
}

通過 Web 頁面建立 Pipeline 專案

測試效果

通過 SCM 獲取 Jenkinsfile,建立 Pipeline 專案

在 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

部署到 httpd 服務下

修改 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  # 若存取瀏覽器打不開,先檢查服務是否啟動

Pipeline 語法生成器(Pipeline Syntax)