Jenkins 學(xué)習(xí)使用實(shí)踐

前言

Jenkins就不用做多余的介紹了,作為CI/CD首選的開源解決方案,持續(xù)集成 (Continous Intergration)/ 持續(xù)交付 (Continous Delievery),本文只是用于記錄使用Jenkins的一些基本操作,Jenkins官方文檔也率先支持中文,相信對(duì)大家的學(xué)習(xí)熱情會(huì)有積極地促進(jìn)作用。

Jenkins學(xué)習(xí)使用實(shí)踐

更新歷史

2019年02月12日 - 初稿

閱讀原文 - https://wsgzao.github.io/post/jenkins/

擴(kuò)展閱讀

Jenkins - https://jenkins.io/zh/


Jenkins簡介

構(gòu)建偉大,無所不能

Jenkins 是開源 CI&CD 軟件領(lǐng)導(dǎo)者, 提供超過 1000 個(gè)插件來支持構(gòu)建、部署、自動(dòng)化,滿足任何項(xiàng)目的需要。

Jenkins 用戶手冊(cè) - https://jenkins.io/zh/doc/

Jenkins 訓(xùn)練營之基礎(chǔ)篇 - https://ke.qq.com/course/265167
Jenkins 訓(xùn)練營之帶你玩轉(zhuǎn) Pipeline - https://ke.qq.com/course/252785

https://ke.qq.com/webcourse/index.html#cid=265167&term_id=100312699&taid=1794918372871119&vid=p1423f5tn3g

https://ke.qq.com/webcourse/index.html?cw_id=91852&ac_type=3#cid=252785&term_id=100298102&taid=1707945285114737&type=1024&vid=w1422iqh9q1

Jenkins安裝

Jenkins 項(xiàng)目產(chǎn)生兩個(gè)發(fā)行線,長期支持版本 (LTS) 和每周更新版本。 根據(jù)你的組織需求,一個(gè)可能比另一個(gè)更受歡迎。
兩個(gè)版本都以 .war 文件,原生包,安裝程序,和 Docker 容器的形式分發(fā)。
https://jenkins.io/zh/download/

這里推薦下載使用LTS長期支持版本,以 CentOS 7 作為演示環(huán)境

# Java 8
yum install java

# Jenkins stable version
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install jenkins

# start jenkins
service jenkins start

# 初始化配置向?qū)?http://192.168.56.103:8080/

cat /var/lib/jenkins/secrets/initialAdminPassword
5224fc83b6d84cc2be69a18c53309ea4

Install suggested plugins

是否創(chuàng)建管理員賬戶或者跳過

Jenkins入門

主要的Job類型

Freestyle project
自由風(fēng)格項(xiàng)目,Jenkins最主要的項(xiàng)目類型

Maven Project
Maven項(xiàng)目專用,類似 Freestyle,更簡單

Multi-configuration project
多配置項(xiàng)目,適合需要大量不同配置(環(huán)境,平臺(tái)等)構(gòu)建

Pipeline
流水線項(xiàng)目,適合使用pipeline(workflow)插件功能構(gòu)建流水線任務(wù),或者使用Freestyle project不容易實(shí)現(xiàn)的復(fù)雜任務(wù)

Multibranch Pipeline
多分支流水線項(xiàng)目,根據(jù)SCM倉庫中的分支創(chuàng)建多個(gè)Pipeline項(xiàng)目

Freestyle 項(xiàng)目

General
項(xiàng)目基本配置
項(xiàng)目名字,描述,參數(shù),禁用項(xiàng)目,并發(fā)構(gòu)建,限制構(gòu)建默認(rèn)node等等

Source code Management
代碼庫信息,支持Git,Subversion等

Build Triggers
構(gòu)建觸發(fā)方式
周期性構(gòu)建,Poll SCM,遠(yuǎn)程腳本觸發(fā)構(gòu)建,其他項(xiàng)目構(gòu)建結(jié)束后觸發(fā)等

Build Environment
構(gòu)建環(huán)境相關(guān)設(shè)置
構(gòu)建前刪除workspace,向Console 輸出添加時(shí)間戳,設(shè)置構(gòu)建名稱,插入環(huán)境變量等

Build
項(xiàng)目構(gòu)建任務(wù)
添加 1個(gè)或者多個(gè)構(gòu)建步驟

Post-build Actions
構(gòu)建后行為
Artifact 歸檔,郵件通知,發(fā)布單元測試報(bào)告,觸發(fā)下游項(xiàng)目等等

規(guī)范項(xiàng)目必要配置

本規(guī)范尤其適用于較多項(xiàng)目共用同一Jenkins的場景

  • 項(xiàng)目命名規(guī)范
  • 設(shè)置項(xiàng)目描述
  • 設(shè)置歷史構(gòu)建清理規(guī)則
  • 設(shè)置構(gòu)建節(jié)點(diǎn)Label
  • 郵件通知

常用插件

注意Jenkins備份策略,建議結(jié)合rsync備份遠(yuǎn)端

Jenkins定時(shí)的備份:ThinBackup
郵件發(fā)送插件: Email Extension Plugin
空間清理擴(kuò)展插件: Distributed Workspace Clean plugin

Jenkins常用插件 – https://vwin.github.io/2019/01/07/Jenkins%E9%AB%98%E6%95%88%E6%8F%92%E4%BB%B6%E6%95%B4%E7%90%86/

創(chuàng)建第一個(gè)Job

安裝Timestamper插件
系統(tǒng)管理-插件管理-可用插件,搜索到timestamper點(diǎn)擊Install without restart

新建一個(gè)Freestyle類型的Job

  • General 項(xiàng)目名稱: My-first-freestyle-demo
  • Build Environment 構(gòu)建環(huán)境:勾選 Add timestamps to the Console Output
  • Build 構(gòu)建:屏幕打印出 "這是我的第一個(gè)Jenkins Job, oops "
  • Post-build Actions 構(gòu)建后操作:無
  • 點(diǎn)擊立刻構(gòu)建
  • 找到控制臺(tái)輸出
Console Output
14:40:59 Started by user admin
14:40:59 Building in workspace /var/lib/jenkins/workspace/My-first-freestyle-demo
14:41:00 [My-first-freestyle-demo] $ /bin/sh -xe /tmp/jenkins3737737887278720679.sh
14:41:00 + echo '這是我的第一個(gè)Jenkins Job, oops '
14:41:00 這是我的第一個(gè)Jenkins Job, oops 
14:41:00 Finished: SUCCESS

Jenkins Pipeline介紹

Pipeline,簡而言之,就是一套運(yùn)行于Jenkins上的工作流框架,將原本獨(dú)立 運(yùn)行于單個(gè)或者多個(gè)節(jié)點(diǎn)的任務(wù)連接起來,實(shí)現(xiàn)單個(gè)任務(wù)難以完成的復(fù)雜流程編排與可視化。

Pipeline 是Jenkins2.X最核心的特性,幫助Jenkins實(shí)現(xiàn)從CI到CD與DevOps的轉(zhuǎn)變

什么是Jenkins Pipeline?

Jenkins Pipeline是一組插件,讓Jenkins可以實(shí)現(xiàn)持續(xù)交付管道的落地和實(shí)施。持續(xù)交付管道(CD Pipeline)是將軟件從版本控制階段到交付給用戶或客戶的完 整過程的自動(dòng)化表現(xiàn)。軟件的每一次更改(提交到源代碼管理系統(tǒng))都要經(jīng)過一個(gè)復(fù)雜的過程才能被發(fā)布。

Pipeline提供了一組可擴(kuò)展的工具,通過Pipeline Domain Specific Language(DSL) syntax可以達(dá)到Pipeline as Code的目的

Pipeline as Code:Jenkinsfile 存儲(chǔ)在項(xiàng)目的源代碼庫

Jenkins Pipeline核心概念

Stage
– 階段,一個(gè)Pipeline可以劃分為若干個(gè)Stage,每個(gè)Stage代表一組操作,例如: "Build", "Test", "Deploy" 。
– 注意,Stage是一個(gè)邏輯分組的概念,可以跨多個(gè)Node。

Node
– 節(jié)點(diǎn),一個(gè)Node就是一個(gè)Jenkins節(jié)點(diǎn),或者是Master,或者是Agent,是執(zhí)行Step的具體 運(yùn)行環(huán)境。

Step
– 步驟,Step是最基本的操作單元,小到創(chuàng)建一個(gè)目錄,大到構(gòu)建一個(gè)Docker鏡像,由各類 Jenkins Plugin提供,例如: sh 'make'

為什么要用Pipeline?

  • 代碼:Pipeline以代碼的形式實(shí)現(xiàn),通常被檢入源代碼控制,使團(tuán)隊(duì)能夠編輯,審查和迭代其CD流程。
  • 可持續(xù)性:Jenkins重啟或者中斷后都不會(huì)影響Pipeline Job。
  • 停頓:Pipeline可以選擇停止并等待人工輸入或批準(zhǔn),然后再繼續(xù)Pipeline運(yùn)行。
  • 多功能:Pipeline支持現(xiàn)實(shí)世界的復(fù)雜CD要求,包括fork/join子進(jìn)程,循環(huán)和 并行執(zhí)行工作的能力。
  • 可擴(kuò)展:Pipeline插件支持其DSL的自定義擴(kuò)展以及與其他插件集成的多個(gè)選項(xiàng)。

Pipeline和Freestyle的區(qū)別

Freestyle:
– 上游 / 下游Job調(diào)度,如 BuildJob ->TestJob -> DeployJob
– 在DSL Job里面調(diào)度多個(gè)子Job(利用Build Flow plugin)

Pipeline:
– 單個(gè)Job中完成所有的任務(wù)編排
– 全局視圖

Pipeline 會(huì)取代Freestyle么?

  • Pipeline一定會(huì)取代Build Flow插件
  • 會(huì),當(dāng)你希望做到Pipeline as code的時(shí)候
  • 會(huì),當(dāng)你獨(dú)立運(yùn)行一組Job沒有特殊價(jià)值或者意義的時(shí)候
  • 會(huì),當(dāng)你可以從Multibranch Pipeline受益的時(shí)候
  • 會(huì),當(dāng)你希望獲取類似于TravisCI風(fēng)格的工作流的時(shí)候

Jenkins Pipeline入門

Pipeline腳本是由Groovy語言實(shí)現(xiàn)
– 無需專門學(xué)習(xí)Groovy

Pipeline支持兩種語法
– Declarative 聲明式(在Pipeline plugin 2.5中引入)
– Scripted Pipeline 腳本式

如何創(chuàng)建基本的Pipeline
– 直接在Jenkins Web UI 網(wǎng)頁界面中輸入腳本
– 通過創(chuàng)建一個(gè)Jenkinsfile可以檢入項(xiàng)目的源代碼管理庫

最佳實(shí)踐
– 通常推薦在 Jenkins中直接從源代碼控制(SCM)中載入Jenkinsfile Pipeline

快速創(chuàng)建一個(gè)簡單的 Pipeline

  1. 新建Job: Jenkins -> 新建 -> 輸入 Job名稱: “My-first-pipeline-demo” -> 選擇 Pipeline -> 點(diǎn)擊 "OK"
  2. 配置: 在Pipeline -> Script 文本輸入框中輸入下列語句,點(diǎn)擊 ”保存”
  3. 立即構(gòu)建
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Build'
            }
        }
        stage('Test') {
            steps {
                echo 'Test'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploy'
            }
        }
    }
}

Jenkins忘記密碼怎么辦

如果權(quán)限設(shè)置錯(cuò)誤,或者忘記密碼,導(dǎo)致admin自己都無法登陸Jenkins怎么辦?

  • 命令行停止Jenkins;
  • 先備份$JENKINS_HOME中的config.xml;
  • 用編輯器打開$JENKINS_HOME中的config.xml;
  • 將<useSecurity>true</useSecurity>元素中的true改為false;
  • 將<authorizationStrategy>和<securityRealm>元素的內(nèi)容刪掉;
  • 命令行啟動(dòng)Jenkins。

Ansible Jenkins API Token 使用技巧

Jenkins REST API 提供了 API token,使得可以在程序中使用 API token 進(jìn)行認(rèn)證(而不是使用你真實(shí)的密碼)。

API token 可以在用戶個(gè)人設(shè)置界面查看
到用戶→用戶 id→設(shè)置頁面,在 API Token 區(qū)域點(diǎn)擊 Show API token 按鈕,便可查看 API token,同時(shí)還可以更改 API token
相應(yīng)的 URL 是
http://<JENKINS_URL>/user/<userid>/configure

Manage Jenkins jobs by using Jenkins REST API

jenkins_job_facts – Get facts about Jenkins jobs
https://docs.ansible.com/ansible/latest/modules/jenkins_job_facts_module.html

jenkins_job – Manage jenkins jobs
https://docs.ansible.com/ansible/latest/modules/jenkins_job_module.html

# python-jenkins package
pip install python-jenkins

# ansble playbook example
---
- hosts: all
  gather_facts: no

  tasks:
    - name: Get host info
      local_action:
        module: jenkins_job_facts
        url: https://xxx
        user: xxx
        token: xxx
        glob: '*mh_kg*'
      register: my_jenkins_job_facts

    - debug:
        msg: "{{my_jenkins_job_facts}}"

參考內(nèi)容

官方手冊(cè)永遠(yuǎn)是你的最佳參考內(nèi)容

Jenkins 用戶手冊(cè) - https://jenkins.io/zh/doc/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,196評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,456評(píng)論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,955評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,195評(píng)論 0 287
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,725評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,608評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,802評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,048評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評(píng)論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,424評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,762評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容