Jenkins 是一個很老的 ci/cd 服務了,可是至今並未過期,幾乎是各類公司的首選,足見其功能強大vue
最近用 docker 搭建了一個 Jenkins 服務,實現了代碼提交後自動觸發測試和部署,不再用手動發佈了,節省了大量的時間nginx
FROM jenkins/jenkins:2.191 COPY executors.groovy /usr/share/jenkins/ref/init.groovy.d/executors.groovy USER root RUN apt-get update RUN apt-get install -y build-essential
這裏我在基礎鏡像上安裝了 make 工具,由於我大部分項目都是用 make 構建git
我將 jenkins 服務自己也部署到了 docker 集羣中,compose 文件內容以下:github
version: "3.5" services: jenkins: image: hatlonely/jenkins:${version} hostname: jenkins user: root ports: - "8080:8080" - "50000:50000" deploy: replicas: 1 restart_policy: condition: on-failure volumes: - "/var/docker/jenkins/data:/var/jenkins_home" - "/var/docker:/var/docker" - "/var/run/docker.sock:/var/run/docker.sock" - "/bin/docker:/usr/bin/docker" networks: - jenkinsnet networks: jenkinsnet: name: jenkinsnet
這裏主要要解決兩個問題:web
volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "/bin/docker:/usr/bin/docker"
docker 是 c/s 架構,會在本地後臺啓動一個服務來管理和維護容器,客戶端經過套接字和服務通訊,將套接字映射到容器內部,可讓容器也能訪問宿主機的 docker,此外將 docker 命令自己映射到容器內部,就不須要在容器內部再安裝一個 docker 了docker
volumes: - "/var/docker/jenkins/data:/var/jenkins_home" - "/var/docker:/var/docker"
這裏我有個實踐的約定,會將全部 docker 容器的狀態映射到宿主機的 /var/docker/{service}
下面,Jenkins 的狀態保存在 /var/jenkins_home
下,這裏咱們把它直接映射到 /var/docker/jenkins/data
下,另外,其餘的服務須要經過容器內的 Jenkins 部署,volume 掛載的數據只能映射到 Jenkins 容器內部,而咱們約定,這些數據只能在 /var/docker
下,所以,只須要再掛載這個目錄,其餘服務的狀態就都能持久化到宿主機了json
完整代碼參考:https://github.com/hpifu/dock...網絡
執行 make build
完成鏡像的製做(我把 Dockerfile 中的端口映射註釋掉了,是由於個人環境裏面全部的服務都統一用 nginx 做反向代理對外了)
執行 make deploy
便可完成 Jenkins 的部署架構
部署完成以後,訪問 http://127.0.0.1:8080,按照提示很容易就能夠完成初始化,初始化完成以後,/var/jenkins_home
裏面會產生不少數據,這些數據是 Jenkins 的狀態,前面咱們已把這個目錄映射到了宿主機的 /var/docker/jenkins/data
,這樣重啓 Jenkins 數據也不會丟失併發
初始化完成以後終於能夠建立任務了,相比之下,這個過程多是最簡單的
【新建任務】→【流水線】(名稱填 docker-jenkins)→【肯定】
General
構建觸發器
流水線
pipeline { agent any stages { stage('image') { steps { sh 'make build' } } stage('deploy') { steps { sh 'make deploy' } } } }
點保存以後點當即構建便可
要實現 github push 以後自動觸發,須要在 github 設置 webhook(須要 owner 權限),另外須要 Jenkins 有對外網可見的地址
Payload URL: <https://<your jenkins server address>/github-webhook/> Content type:<application/json>
配置完成後,能夠提交下試試,在 webhooks 頁面能夠看到剛剛配置的 hook,拖到最下面有最近的 hook 觸發記錄
Jenkins 第一次構建須要手動觸發,以後的構建都會自動觸發,偶爾沒有觸發,多是 github 和你的服務之間的網絡問題,可去 github webhook 頁面檢查 hook 觸發記錄
對項目做一些簡單的規範,能大大地簡化整個部署流程,前面建立項目的時候咱們使用的是 Pipeline script
,能夠看到還有另外一個選項 Pipeline script from SCM
支持直接從一個 git 地址獲取這個腳本,通常名爲 Jenkinsfile,這也是我推薦的一種方式,Jenkinsfile 和代碼一塊兒維護起來,這樣不一樣的項目,不一樣的 Jenkins 環境,建立的 Jenkins 任務都是同樣的,大大簡化了建立任務的複雜度
另外一方面,項目的構建,編譯,運行,打包,部署,測試等都經過 Makefile 實現,這樣全部執行的動做都變成了一條 make 命令,Jenkinsfile 的邏輯變得很是簡單,甚至能夠是通用的,下面是一些示例:
經過這些示例能夠看到,複雜的構建過程都被 Makefile 屏蔽了,而經過 Makefile,不一樣類型,不一樣語言的項目的構建過程也對 Jenkins 屏蔽了,達到了統一
轉載請註明出處
本文連接: https://tech.hatlonely.com/article/57