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
jenkins 自己做爲容器在 docker 集羣環境下運行,如何訪問外部 docker 環境
volumes:docker
部署服務的數據掛載,如何掛載宿主機
volumes:json
完整代碼參考:https://github.com/hpifu/docker-jenkins網絡
執行 make build 完成鏡像的製做(我把 Dockerfile 中的端口映射註釋掉了,是由於個人環境裏面全部的服務都統一用 nginx 做反向代理對外了)
執行 make deploy 便可完成 Jenkins 的部署架構
建立第一個流水線項目,部署 Jenkins 服務自己
部署完成以後,訪問 http://127.0.0.1:8080,按照提示很容易就能夠完成初始化,初始化完成以後,/var/jenkins_home 裏面會產生不少數據,這些數據是 Jenkins 的狀態,前面咱們已把這個目錄映射到了宿主機的 /var/docker/jenkins/data,這樣重啓 Jenkins 數據也不會丟失併發
初始化完成以後終於能夠建立任務了,相比之下,這個過程多是最簡單的
【新建任務】→【流水線】(名稱填 docker-jenkins)→【肯定】
General
✔️ github 項目: git@github.com:hpifu/docker-jenkins.git
✔️ 不容許併發構建
構建觸發器
✔️ GitHub hook trigger for GITScm polling
流水線
✔️ Pipeline script
pipeline { agent any stages { stage('image') { steps { sh 'make build' } } stage('deploy') { steps { sh 'make deploy' } } } }
點保存以後點當即構建便可
github webhook
要實現 github push 以後自動觸發,須要在 github 設置 webhook(須要 owner 權限),另外須要 Jenkins 有對外網可見的地址
進入項目主頁,如本項目主頁:https://github.com/hpifu/docker-jenkins
點擊【Settings】→【Webhooks】→【Add webhook】
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 的邏輯變得很是簡單,甚至能夠是通用的,下面是一些示例:
go 項目: https://github.com/hpifu/go-tech/blob/master/Jenkinsfile
vue 項目: https://github.com/hpifu/vue-tech/blob/master/Jenkinsfile
經過這些示例能夠看到,複雜的構建過程都被 Makefile 屏蔽了,而經過 Makefile,不一樣類型,不一樣語言的項目的構建過程也對 Jenkins 屏蔽了,達到了統一
連接
參考代碼: https://github.com/hpifu/docker-jenkins
docker hub: https://hub.docker.com/_/jenkins
轉載請註明出處
本文連接:https://tech.hatlonely.com/article/57Golang 課程火熱招生資料找WeChat:17812796384