Docker系列之Jenkins自動化部署

tbzhang 7年前發布 | 72K 次閱讀 Docker Hudson

Devops的概念已經火了很久了,我一直想對這方面進行一定的了解;再加上實驗室項目環境依賴比較復雜,希望使用Docker來解決,所以最近就好好研究了一波Docker的相關實踐和原理。這里整理一下,希望組成一個系列,從實踐到原理詳細講解一下Docker的使用。

第一篇就講一下Jenkins+Docker的自動化部署實踐。大致的流程如下:目前我有兩個服務器,分別是阿里云和bandwagon,代碼存儲在github上,每次push都會觸發阿里云上的jenkins的構建任務,jenkins將github上的代碼fetch到本地,編譯打包成war文件,生成docker image并上傳到docker registry上,然后通過ssh來登錄bandwagon服務器pull下來新生成的image并啟動。由于篇幅問題,本篇文章不會介紹有關docker image的build和docker registry的搭建,但是我會在后續文章中再做詳細講解。

學習Docker,我推薦先在網絡上找說明指南,一步一步自己嘗試的使用,然后如果覺得有必要可以看一下《Docker容器和容器云》這本書。

本文內容都是docker和jenkins的基礎知識,為了節約你的時間,本文的主要內容如下:

  • docker 基礎命令
  • jenkins docker版本的搭建,構建任務的配置
  • Pubish Over SSH 安裝和配置
  • 通過github的webhook來觸發jenkins構建任務

Docker運行jenkins

Docker如此火爆的一個原因是因為它形成了一個良好的生態圈,基本上主流的軟件應用都有相應的Docker image。如果大家不清楚Docker image的含義,建議大家看一下 Docker中文指南 ,我們可以通過 docker pull 命令來下載響應的image,然后運行。比如我們希望在阿里云服務器上部署一個jenkins應用,首先可以執行下列語句來獲取一個jenkins的image。

docker pull jenkinsci/jenkins:lts

這里我們使用pull從docker registry上拉取image,但是目前業界上有很多共有或在私有的docker registry,比如說docker hub和daoCloud。所以image的全稱就由三部分組成:域名或在ip + / + 軟件名稱 + : + 版本號,所以上邊的這條命令就是讓docker去jenkinsci這個Jenkins機構自己部署的registry上下載jenkins的lts版本的image.你也可以直接使用 docker pull jenkins 來下載image,但docker會默認的從docker hub上下載jenkins的laster版本。

下載成功之后,你可以使用 docker images 命令來查看當前下載的image信息

你可以通過 docker run 命令來運行docker容器,請注意我這里的用詞,在Docker中image和container是不同的概念,你可以將他們簡單的理解成Java中類和對象的關系。我們使用下面的命令來啟動這個jenkins容器。

sudo docker run -d --name jenkins -p 9090:8080 -v /var/jenkins_home:/var/jenkins_home jenkinsci/jenkins:lts

我們來依次講解一下run命令的幾個參數把:

  • -d 后臺運行docker容器并打印容器ID。如果不加 -d 參數,那么容器運行會和終端綁定,如果終端關閉,那么容器也會關閉,但是容器不會被刪除。但是如果你只是想試一試某個容器,運行后自動進入命令行,那么可以使用-it參數;如果你想容器關閉之后自動刪除,那么就使用-rm參數。

  • --name 給docker container起一個別名,后續可以通過別名來管理容器,否在會系統會默認分配一個隨機的別名。

  • -p docker容器和外側的端口映射,jenkins服務是運行在docker容器內部的,但是docker容器默認不對外暴露接口,所以通過這個參數將內部的8080端口映射到服務器本身的9090端口上。

  • -v 數據卷的掛載。這里涉及到docker container的一個特性,container如果停止運行了,那么再次啟動時,之前所有運行相關的數據和文件就都不存在了,就類似于設置了自動還原的電腦一般,無論你做了多少的操作,一旦關機重啟之后就又恢復到最初的狀態。數據卷就是來解決上述問題的,通過Docker container外部的文件夾的掛載,將可持久化的文件存儲到外部掛載的文件夾中。

然后你就可以根據你自己的ip地址來鍵入下列地址http:ip:9090來訪問jenkins的主頁了。

這里有一點需要注意的是,需要注意你阿里云服務器設置的網絡安全協議,是否禁用掉了9090這個端口。

Publish over SSH配置

Jenkins的初始化配置和SSH Over Publish的安裝請大家自行百度,這里我主要講解一下SSH Over Pushlish配置。

首先我們要在jenkins服務器上生成密鑰對,使用 ssh-keygen -t rsa 命令來生成秘密對,這樣的話,在~/.ssh/下就會有私鑰id_rsa和公鑰id_rsa.pub。

然后你需要上傳公鑰到目標服務器上,也就是我的bandwagon服務器上,可以使用 ssh-copy-id 來將文件上傳到服務器上,類似于 scp 命令的使用方式。

ssh-copy-id -i ~/.ssh/id_rsa.pub <username>@<host>

最后我們需要修改目標服務器的ssh配置文件,配置文件為/etc/ssh/sshd_config。設置ssh-server允許使用私鑰和公鑰對的方式登錄,然后使用 sudo /etc/init.d/ssh restart 命令重啟ssh服務。

RSAAuthentication yes
PubkeyAuthentication yes
#AuthorizedKeysFile     %h/.ssh/authorized_keys

上述步驟成功之后,大家在系統管理中配置Publish over SSH。相關的配置信息如下圖所示。

你還可以點擊下方的高級選項,來配置ssh服務器的端口,超時時間等信息,還可以點擊Test Configuration來檢測是否配置成功。

構建任務配置

我們先創建一個構建任務,該任務從github repo上將代碼拉取下來,然后執行構建任務,然后通過Publish Over SSH在目標服務器上進行部署。

我們首先配置源碼管理模塊,選擇Git選項,然后配置Repository URL 并添加認證信息。可以將自己的github帳號和密碼加入其中。

不同的項目的構建命令不同,但是我們可以在構建后操作模塊設置后續操作,通過ssh登錄目標服務器,讓目標服務器執行命令行操作來pull最新上傳的image并且執行,這樣就完成了部署。

Push觸發構建任務

完成上述配置,你就可以手動在jenkins上啟動構架任務了,但是要做到自動化部署,還必須設置Push操作自動觸發jenkins構建任務的機制。

我們先到首頁-用戶管理界面打開自己的用戶界面,然后點擊左側的設置按鈕,并點擊 show API token 按鈕來獲取API token.然后在構建任務設置頁面的構建觸發器模塊勾選觸發遠程構建選項,并將token填到里邊去。這是jenkins會提示你如何通過URL來觸發構建任務。

然后我們打開github上相應庫的設置頁面。點擊左側的Webhooks選項,然后添加hook.將上述的url填寫到Payload URL欄中,點擊添加。如果添加成功之后,每次你push一個新版本,那么jenkins就會自動進行部署了。

如果你發現webhooks發送請求失敗,那可能是因為你jenkins安全設置的問題,禁止掉了發送請求自動化構建。

后記

本篇講的都是十分基礎性的內容,后一篇文章講一下dockerfile的原理和注意事項與docker registry。

 

來自:http://remcarpediem.com/2017/07/02/Docker系列之Jenkins自動化部署/

 

 本文由用戶 tbzhang 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!