Jenkins–從入門到入土
文章目錄
- Jenkins--從入門到入土
- 〇、概念提要--什么是CI/DI?
- 1、CI(Continuous Integration,持續集成)
- 2、DI(DevOps Integration,DevOps 集成)
- 3、解決的問題
- 一、Jenkins安裝部署
- 1、什么是Jenkins?
- 2、Jenkins在開發過程中所屬位置
- 3、安裝硬件環境和知識儲備
- 4、安裝
- 4.1、下載war啟動
- 4.2、Docker啟動
- 4.3、windows使用驅動安裝
- 5、使用插件自定義 Jenkins
- 6、創建第一個管理員用戶
- 二、Jenkins配置
- 1、環境配置
- 1.1、更換站點鏡像
- 1.2、全局工具的配置
- 2、用戶權限配置
- 3、插件介紹
- 三、配置自動化任務--自由風格
- 1、兩種執行方法
- 2、安裝插件
- 3、搭建GitLab
- 3.1、從docker compose快速搭建GitLab
- 3.2、上傳到服務器
- 4、github整合Jenkins
- 4.1、關聯github
- 4.2、Jenkins中的github的配置
- 4.3、新建任務
- 4.4、立即構建
- 4.5、Github代碼更新之后觸發構建
- 四、配置自動化任務--Pipeline
- 1、安裝Blue Ocean插件
- 2、新建Github測試項目
- 3、編寫Jenkinsfile文件
- 4、推送到github項目中
- 5、操作流水線Blue Ocean
- 6、選擇倉庫創建流水線
溫馨提示:由于本文檔寫的比較雜,基本講了很多東西,所以自己根據目錄篩選自己需要的部分。
〇、概念提要–什么是CI/DI?
1、CI(Continuous Integration,持續集成)
- 定義:持續集成是一種軟件開發實踐,開發人員頻繁地將代碼更改集成到共享代碼庫中。每次集成都觸發自動構建和測試,以盡早發現錯誤并提高軟件質量。
- 關鍵特點
- 頻繁集成:開發人員每天多次將代碼提交到版本控制系統。
- 自動化構建和測試:每次提交代碼后,系統會自動構建項目并運行自動化測試。
- 快速反饋:開發人員可以迅速知道他們的代碼是否引入了錯誤。
- 集成工具:常用工具包括Jenkins、Travis CI、CircleCI等。
2、DI(DevOps Integration,DevOps 集成)
- 定義:DevOps集成是一種將開發和運維團隊的工作流程、工具和文化相結合的實踐,旨在提高軟件開發和交付的速度和質量。
- 關鍵特點
- 自動化:通過自動化的構建、測試、部署和監控,減少手動干預,降低錯誤率。
- 持續交付(CD):實現代碼從開發到生產環境的自動化部署。
- 協作:開發和運維團隊緊密合作,共享責任,共同優化流程。
- 常用工具:包括Docker、Kubernetes、Ansible、Puppet、Chef等。
3、解決的問題
CI和DI在計算機領域分別強調持續集成和DevOps實踐中的集成部分,通過自動化和協作提高軟件開發和交付的效率和質量。
持續的集成部署解決了很多問題,使得工作變成一種流程的形式,我們就負責編碼(code)的內容,其他環節都是自動化的部署完成。
“You build it , you run it !”
一、Jenkins安裝部署
1、什么是Jenkins?
Build great things at any scale,The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.
Jenkins官方 ,Jenkins是開源CI&CD軟件領導者, 提供超過1000個插件來支持構建、部署、自動化, 滿足任何項目的需要。
Jenkins文檔下載
2、Jenkins在開發過程中所屬位置
主流軟件開發流程:
3、安裝硬件環境和知識儲備
機器要求:
-
256 MB 內存,建議大于 512 MB
-
10 GB 的硬盤空間(用于 Jenkins 和 Docker 鏡像)
環境要求:
- Java8(由于Jenkins是由Java語言編寫,所以需要 JRE 或者 JDK環境)
- Docker (導航到網站頂部的Get Docker鏈接以訪問適合您平臺的Docker下載
4、安裝
4.1、下載war啟動
-
下載War包:http://mirrors.jenkins.io/war-stable/latest/jenkins.war
mkdir -p /opt/jenkins wget -O /opt/jenkins/jenkins.war http://mirrors.jenkins.io/war-stable/latest/jenkins.war
-
打開終端進入到下載目錄.
cd /opt/jenkins
-
運行命令
java -jar jenkins.war --httpPort=8080
.java -jar jenkins.war --httpPort=8080
-
打開瀏覽器進入鏈接
http://localhost:8080
. -
按照說明完成安裝.
參考鏈接https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/
4.2、Docker啟動
docker安裝文檔:在CentOS中安裝Docker
-
搜索Docker鏡像:
版本選擇:
Jenkins: https://hub.docker.com/r/jenkins/jenkins/
Jenkins with Blue Ocean: https://hub.docker.com/r/jenkinsci/blueocean
使用命令:
docker pull jenkins/jenkins#24版本的docker鏡像,因為我發現存在問題,當安裝依賴的時候,換個版本可以。 docker pull jenkins/jenkins:2.459-jdk17
-
在Docker中設置橋接網絡
docker network create jenkins
-
啟動(三組命令,自行甄別)
# 官方給出的命令 docker run \--name jenkins-docker \--rm \--detach \--privileged \--network jenkins \--network-alias docker \--env DOCKER_TLS_CERTDIR=/certs \--volume jenkins-docker-certs:/certs/client \--volume jenkins-data:/var/jenkins_home \--publish 2376:2376 \docker:dind \--storage-driver overlay2# Jenkins docker run \-itd \-u root \-p 8080:8080 \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkins/jenkins#Jenkins blueoceandocker run \-itd \-u root \-p 8080:8079 \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkinsci/blueocean# Jenkins 2.459 版本docker run \-itd \-u root \-p 8080:8080 \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkins/jenkins:2.459-jdk17
-
查看啟動狀態:
docker ps
-
查看日志
docker logs jenkins-master
后面的參數是容器的參數,重點看下面這個:
-
訪問:http://192.168.200.128:2376/
參考文檔:https://www.jenkins.io/doc/book/installing/docker/
4.3、windows使用驅動安裝
-
首先下載鏡像:官網
-
確保安裝了Java環境,并且安裝環境變量,我這里使用JDK 21演示
-
Jenkins啟動
安裝完成!
-
打開安裝目錄,我的在
E:\Software\Jenkins
,安裝中有涉及,請留意。 -
打開
jenkins.xml
配置文件,設置Jenkins環境變量和Java環境變量換成:
但是我發現配置不修改應該也是可以運行的,只是官方這樣操作的,我只換了
JAVA_HOME
。 -
搜索service,打開Jenkins服務。
-
瀏覽器訪問預先設置好的端口http://localhost:8079/:
-
查看管理員密碼
5、使用插件自定義 Jenkins
解鎖 Jenkins后,會出現**“自定義 Jenkins”**頁面。在這里,您可以安裝任意數量的有用插件作為初始設置的一部分。
單擊顯示的兩個選項之一:
- 安裝建議的插件- 安裝推薦的插件集,這些插件基于最常見的用例。
- 選擇要安裝的插件- 選擇最初安裝的插件集。當您第一次訪問插件選擇頁面時,默認選擇建議的插件。
設置向導顯示 Jenkins 的配置進度以及您選擇的 Jenkins 插件安裝集。此過程可能需要幾分鐘。
如果不確定需要什么插件,請選擇安裝建議的插件。您可以稍后通過 Jenkins 中的管理 Jenkins > 插件頁面安裝(或刪除)其他 Jenkins 插件。
6、創建第一個管理員用戶
最后,在使用插件自定義 Jenkins后,Jenkins 會要求您創建第一個管理員用戶。
- 當**“創建第一個管理員用戶”**頁面出現時,在相應字段中指定管理員用戶的詳細信息,然后單擊“保存并完成”。
- 當Jenkins 就緒頁面出現時,單擊Start using Jenkins。
- 如果需要,請使用您剛剛創建的用戶憑據登錄 Jenkins,然后就可以開始使用 Jenkins 了!
二、Jenkins配置
1、環境配置
1.1、更換站點鏡像
具體流程:
將升級站點的URL更換成清華鏡像:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json
這樣插件下載就會從鏡像進行下載,相對來說下載更快。
1.2、全局工具的配置
-
JDK:
-
Git:
還有其他環境中的工具配置。
2、用戶權限配置
-
矩陣權限的配置
-
添加管理員用戶所有的權限
-
添加Authorize Project | Jenkins plugin)插件,并且在系統管理中進行配置。配置邏輯,就給用戶當前項目的矩陣權限!
示例:
3、插件介紹
-
Publish over SSH
這個是一個遠程Shell工具,可以遠程去執行一些shell命令
-
HTTP Request Plugin
跨平臺調用,在構建前后可以通過該插件以http形式調用各種api接口實現和內部系統的聯動
-
Publish Over FTP
用于遠程使用FTP發布,比較合適于靜態資源的發布。
-
Performance Plugin
? 該插件可以讀取和解析測試框架輸出的報告,并且在 Jenkins 上繪制性能和穩定性相關的圖表。Performance Plugin 支持的測試框架有 JUnit、JMeter, Twitter 的 Lago 和 Taurus。
? https://plugins.jenkins.io/performance
- Gitlab Merge Request Builder Plugin
? Gitlab Merge Request Builder Plugin 可以方便的自動發起代碼審查,它在創建 pull request 的時候,會自動帶上關聯任務的運行結果,以方便代碼審查著確認改動的正確性。
? 同時,這款插件還支持自動合并,既在代碼審查通過后自動合并該 pull request 內容。
? https://github.com/timols/jenkins-gitlab-merge-request-builder-plugin
- JIRA Plugin
? JIRA Plugin 可以讓 Jenkins 任務和 JIRA 集成起來,這樣項目管理者可以通過 JIRA 了解項目進度,開發者也可以通過該插件直接更改 JIRA 上的 issue 狀態。
? https://plugins.jenkins.io/jira
- Kubernetes Plugin
? 和最近大熱的容器編排框架 Kubernetes 集成當然不能落下了。另外,Jenkins 對執行機的管理一直比較弱,無法做到快速的擴容和縮容。Kubernetes Plugin 通過引入 Kubernetes 的容器編排能力,讓 Jenkins 執行機運行在 Kubernetes 環境中。
? https://github.com/jenkinsci/kubernetes-plugin
-
Build Pipeline plugin
https://github.com/jenkinsci/build-pipeline-plugin
? 對一個系統的持續集成會包含很多個方面,如果將它們都雜糅在一個 Jenkins 任務中,會提高排查成本,也不利于整個持續集成的運作。Build Pipeline plugin 可以讓項目管理員針對系統持續集成步驟設置一系列關聯的任務,任務之間可以設置不同的觸發條件,以確認何時需要人工介入。該插件可以讓整個持續集成流程變得非常直觀:
上述內容部分參考于鏈接:https://www.jianshu.com/p/6bcb2853fae2
三、配置自動化任務–自由風格
1、兩種執行方法
- 配置自由風格的項目
- 配置Pipeline使用Jenkinsfile
2、安裝插件
-
版本控制
- github
- gitlab
-
SSH
- SSH
- Publish Over SSH
- SSH Agent
- SSH Pipeline Steps
3、搭建GitLab
3.1、從docker compose快速搭建GitLab
這里我們使用GitLab來測試。
使用docker compose在docker環境下快速部署:
搭建docker compose環境參考文章:docker compose快速安裝
學習docker compose參考文章(本篇博客不需要,只是推薦學習)DockerCompose(初識、安裝、部署) Docker Compose 命令說明文檔
docker-compose.yaml
文件鏈接:https://github.com/sameersbn/docker-gitlab/blob/master/docker-compose.yml
可以點擊下載,也可以新建docker-compose.yaml
文件,將內容復制粘貼。
也可以直接復制(但是建議從官網下載,可能版本會更新之類的):
version: '2.3'services:redis:restart: alwaysimage: redis:6.2command:- --loglevel warningvolumes:- redis-data:/data:Zpostgresql:restart: alwaysimage: sameersbn/postgresql:14-20230628volumes:- postgresql-data:/var/lib/postgresql:Zenvironment:- DB_USER=gitlab- DB_PASS=password- DB_NAME=gitlabhq_production- DB_EXTENSION=pg_trgm,btree_gistgitlab:restart: alwaysimage: sameersbn/gitlab:17.0.0depends_on:- redis- postgresqlports:- "10080:80"- "10022:22"volumes:- gitlab-data:/home/git/data:Zhealthcheck:test: ["CMD", "/usr/local/sbin/healthcheck"]interval: 5mtimeout: 10sretries: 3start_period: 5menvironment:- DEBUG=false- DB_ADAPTER=postgresql- DB_HOST=postgresql- DB_PORT=5432- DB_USER=gitlab- DB_PASS=password- DB_NAME=gitlabhq_production- REDIS_HOST=redis- REDIS_PORT=6379- TZ=Asia/Kolkata- GITLAB_TIMEZONE=Kolkata- GITLAB_HTTPS=false- SSL_SELF_SIGNED=false- GITLAB_HOST=- GITLAB_PORT=10080- GITLAB_SSH_PORT=10022- GITLAB_RELATIVE_URL_ROOT=- GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_ROOT_PASSWORD=- GITLAB_ROOT_EMAIL=- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true- GITLAB_NOTIFY_PUSHER=false- GITLAB_EMAIL=notifications@example.com- GITLAB_EMAIL_REPLY_TO=noreply@example.com- GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com- GITLAB_BACKUP_SCHEDULE=daily- GITLAB_BACKUP_TIME=01:00- SMTP_ENABLED=false- SMTP_DOMAIN=www.example.com- SMTP_HOST=smtp.gmail.com- SMTP_PORT=587- SMTP_USER=mailer@example.com- SMTP_PASS=password- SMTP_STARTTLS=true- SMTP_AUTHENTICATION=login- IMAP_ENABLED=false- IMAP_HOST=imap.gmail.com- IMAP_PORT=993- IMAP_USER=mailer@example.com- IMAP_PASS=password- IMAP_SSL=true- IMAP_STARTTLS=false- OAUTH_ENABLED=false- OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=- OAUTH_ALLOW_SSO=- OAUTH_BLOCK_AUTO_CREATED_USERS=true- OAUTH_AUTO_LINK_LDAP_USER=false- OAUTH_AUTO_LINK_SAML_USER=false- OAUTH_EXTERNAL_PROVIDERS=- OAUTH_CAS3_LABEL=cas3- OAUTH_CAS3_SERVER=- OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false- OAUTH_CAS3_LOGIN_URL=/cas/login- OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate- OAUTH_CAS3_LOGOUT_URL=/cas/logout- OAUTH_GOOGLE_API_KEY=- OAUTH_GOOGLE_APP_SECRET=- OAUTH_GOOGLE_RESTRICT_DOMAIN=- OAUTH_FACEBOOK_API_KEY=- OAUTH_FACEBOOK_APP_SECRET=- OAUTH_TWITTER_API_KEY=- OAUTH_TWITTER_APP_SECRET=- OAUTH_GITHUB_API_KEY=- OAUTH_GITHUB_APP_SECRET=- OAUTH_GITHUB_URL=- OAUTH_GITHUB_VERIFY_SSL=- OAUTH_GITLAB_API_KEY=- OAUTH_GITLAB_APP_SECRET=- OAUTH_BITBUCKET_API_KEY=- OAUTH_BITBUCKET_APP_SECRET=- OAUTH_BITBUCKET_URL=- OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=- OAUTH_SAML_IDP_CERT_FINGERPRINT=- OAUTH_SAML_IDP_SSO_TARGET_URL=- OAUTH_SAML_ISSUER=- OAUTH_SAML_LABEL="Our SAML Provider"- OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient- OAUTH_SAML_GROUPS_ATTRIBUTE=- OAUTH_SAML_EXTERNAL_GROUPS=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_USERNAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=- OAUTH_CROWD_SERVER_URL=- OAUTH_CROWD_APP_NAME=- OAUTH_CROWD_APP_PASSWORD=- OAUTH_AUTH0_CLIENT_ID=- OAUTH_AUTH0_CLIENT_SECRET=- OAUTH_AUTH0_DOMAIN=- OAUTH_AUTH0_SCOPE=- OAUTH_AZURE_API_KEY=- OAUTH_AZURE_API_SECRET=- OAUTH_AZURE_TENANT_ID=volumes:redis-data:postgresql-data:gitlab-data:
打開編輯文件內容:
3.2、上傳到服務器
-
新建文件夾:
mkdir /home/gitlab
-
上傳文件
docker-compose.yaml
,也可以新建文件,將內容粘貼過去。 -
啟動docker compose
docker-compose up -d
- -d參數:后臺啟動。
-
使用docker ps命令可以看見新增的三個docker容器:
-
瀏覽器訪問:192.168.200.128:80即可進入GitLab的頁面。
本來我想用GitLab來整合Jenkins,但是服務器資源受限,沒有配置成功,我換成了github來演示。
4、github整合Jenkins
4.1、關聯github
-
打開github,找到Settings,找到Developer Settings,打開Psonal access tokens中的Tokens (classic),點擊Generate a personal access token生成新的token。
-
填寫Note,勾選下面的兩個選項。
-
點擊生成
-
確保復制你的token,請確保立即復制您的個人訪問令牌。你再也看不到了!
-
選擇你的項目,創建webhook
4.2、Jenkins中的github的配置
打開設置:
在設置中找到github的選項(往下劃),按照如下操作,添加Github服務器:
上述第4步添加憑據,注意:必須是具有操作權限的github的賬戶!!
添加并保存退出即可!
4.3、新建任務
-
新建Item
-
General
- 添加描述:
- 添加Github項目地址:
-
源碼管理:
-
-
添加Credentials:本篇博客的4.2中的第四步講到,操作相同,不再贅述。
-
設置分支
-
-
構建觸發器:
-
構建環境
憑據沒有的話直接添加就行:
-
Build Steps:構建步驟:
-
Set build status to “pending” on GitHub commit
-
執行 shell
-
-
構建后操作
-
最后設置完畢保存即可。
來自曼諾爾雷迪亞茲的提示:上述的配置項只是為了了解并熟悉Jenkins,并且進行快速入門,具體的配置詳情可以根據業務需求和個人喜好來具體設置不同的參數。
4.4、立即構建
查看控制臺輸出:
4.5、Github代碼更新之后觸發構建
-
對代碼進行更新并推送
Github代碼:
-
自動構建:
-
構建成功
四、配置自動化任務–Pipeline
1、安裝Blue Ocean插件
返回控制臺就可以看見:
2、新建Github測試項目
我克隆在本地了,因為我要添加一個文件,也可以在Github中添加文件:
本地:
github:
3、編寫Jenkinsfile文件
Jenkins流水線官方中文文檔 學習Jenkins流水線。
在項目中新建文件Jenkinsfile,文件內容如下:
pipeline {agent {docker{images 'node:10'args '-p 20000:8080'}} stages {stage('Build') { steps {sh 'node -v'sh 'echo "hello world !!"'}}// stage('Test') { // steps {// // // }// }// stage('Deploy') { // steps {// // // }// }}
}
這個 Jenkins Pipeline 使用 Docker 作為代理,在一個包含 Node.js 的 Docker 容器中執行構建步驟。
4、推送到github項目中
5、操作流水線Blue Ocean
-
打開Blue Ocean
-
創建流水線
需要注意的是,這里的token權限必須要有repo和user:emil才可以,沒有的話重新創建token,參照本博客4.1.
6、選擇倉庫創建流水線
創建中: