前端之路: 如何用 jenkins 構建部署項目

Jenkins(Build great things at any scale)

what is Jenkins ?

Jenkins是開源 CI(Continuous Integration:持續集成)&CD(Continuous Delivery:持續交付) 軟件領導者, 提供超過1000個插件來支持構建、部署、自動化, 知足任何項目的須要,支持各類運行方式,可經過系統包, Docker 或者經過一個獨立的 Java 程序。前端

原理: 看圖(畫圖工具node

img

why use Jenkins ?

  • 持續集成和持續交付:做爲一個可擴展的自動化服務器,Jenkins能夠用做簡單的CI服務器,或者變成任何項目的連續交付中心。
  • 簡易安裝:Jenkins是一個獨立的基於Java的程序,能夠當即運行,包含Windows,Mac OS X和其餘類Unix操做系統。
  • 配置簡單:Jenkins能夠經過其網頁界面輕鬆設置和配置,其中包括即時錯誤檢查和內置幫助。
  • 插件:經過更新中心中的1000多個插件,Jenkins集成了持續集成和持續交付工具鏈中幾乎全部的工具。
  • 擴展:Jenkins 能夠經過其插件架構進行擴展,從而爲 Jenkins 能夠作的事提供幾乎無限的可能性。
  • 分佈式:Jenkins能夠輕鬆地在多臺機器上分配工做,幫助更快速地跨多個平臺推進構建,測試和部署。

Install

環境:ubuntu、docker、gitgit

$ cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
複製代碼

基於docker,不熟悉的能夠先看看個人上一篇前端之路:緊跟潮流,docker簡單應用github

  • 拉去鏡像docker

    • $ docker pull jenkinsci/blueocean
  • 根據拉取的Jenkins鏡像啓動一個容器shell

     $ docker run \
      -d \
      --name jenkins \
      -u root \
      -p 49001:8080 \
      -v /var/jenkins_home:/var/jenkins_home \
      -v /var/jenkins_ssh:/root/.ssh \
      -v /var/run/docker.sock:/var/run/docker.sock \
      jenkinsci/blueocean
    
    複製代碼

    解釋:ubuntu

    • -d:守護模式,在後臺運行。
    • -p:端口映射,49001是服務器端口(可根據本身狀況更改,別忘記安全組開放端口),8080是容器端口(jenkins程序默認端口)。
    • -v:掛載數據卷,/var/jenkins_home:/var/jenkins_home:將Jenkins目錄掛載到宿主機;/var/jenkins_ssh:/root/.ssh:將Jenkins的ssh掛載到宿主機,備份用,防止重啓後丟失找不到。
  • 查看容器運行狀況:瀏覽器

     $ docker ps
      CONTAINER ID      IMAGE                COMMAND                  CREATED        STATUS           PORTS                                NAMES
      08a54d4a804a      jenkinsci/blueocean  "/sbin/tini -- /usr/…"   7 days ago     Up 7 days        50000/tcp, 0.0.0.0:49001->8080/tcp   jenkins
    複製代碼

    附圖:安全

    img

    以上說明已成功,若容器意外退出,去掉-d 參數執行,查看log來排錯。bash

  • 如今開始設置Jenkins,在瀏覽器訪問 你的服務器ip:49001,會出現如下界面:

    img

    • 想進入要先解鎖,密碼就在 /var/jenkins_home/secrets/initialAdminPassword 文件裏,怎麼查看呢?兩種方案:

      1. 首先要進入剛剛啓動的jenkins容器裏面,執行 $ docker exec -it jenkins bash,而後 $ cat /var/jenkins_home/secrets/initialAdminPassword
      2. 因爲運行容器時,已經將Jenkins目錄掛載到了宿主機,因此能夠不用進入容器,直接在宿主機執行 $ sudo cat /var/jenkins_home/secrets/initialAdminPassword
    • 將上一步的密碼複製到瀏覽器,點擊continue按鈕進行下一步。 附圖:

      img

    • 安裝插件,選擇推薦安裝便可。

=================================================

上面是基本的安裝,我用的是時候官方文檔仍是英文的,目前支持中文,想了解更詳細內容,請去官網,下面開始教你們新建一個 自由構建的任務(鑑於目前網上大都是多機教程,即項目和jenkins不在一臺服務器上,又考慮到小夥伴們手中可能只有一臺本身的機器,因此我下面要講的是 單機運行項目和Jenkins

=================================================

  • 打開 ip:49001進入首頁,點擊系統管理:

    img

  • 首先點擊插件管理,搜索並安裝一下插件(若已安裝列表已存在可忽略):

    • Build Name Setter
    • Dingding[釘釘] Plugin
    • Build Timestamp Plugin
    • Git Parameter Plug-In
    • Publish Over SSH
    • SSH Slaves plugin
    • Timestamper
  • 而後點擊系統設置:

    • 找到 Build Timestamp (上面的插件提供的),進行以下設置:

      • Asia/Shanghai
      • yyyy-MM-dd-HH-mm-ss-SSS

      img

    • 找到 Publish over SSH,這個相對麻煩些,進行以下設置:

      img

      說明:

      • Passphrase:SSH的password。有兩種狀況:1. 使用username/password登陸時爲username的password;2. 使用私鑰登陸時爲私鑰的password。
      • Path to key:SSH私鑰的文件路徑。能夠是絕對路徑,也能夠是相對$JENKINS_HOME的相對路徑。
      • Key:私鑰,私鑰導出後的文本內容,假設「Key」和「Path to key」都設置,則「Key」的優先級較高,此時「Passphrase」中設置的內容應該是私鑰的password。
      • Disable exec:禁止在目標機上運行命令,勾選後將會忽略在Job配置中「Exec command」選項中設置的命令。

      補充:因爲Jenkins是在docker容器中運行的,因此上面的配置應該是容器的ssh配置,而不是宿主機的。如上圖,我是經過ssh私鑰進行的登錄。

      步驟:

      • $ docker exec -it jenkins sh,進入容器。
      • $ ssh-keygen -m PEM -t rsa -b 4096,生成ssh私鑰及公鑰(默認在 ~/.ssh/root/.ssh 目錄中),能夠一路回車,若設密碼的話,需在「Passphrase」中填寫。
      • $ cat ~/.ssh/id_rsa,查看私鑰,把私鑰copy到上圖的「key」設置中。
      • $ cat ~/.ssh/id_rsa.pub,查看公鑰,把公鑰copy到宿主機的 ~/.ssh/authorized_keys 中。

      至此,Jenkins的ssh配置就完成了,接下來要配置遠程機(我們是單機,因此宿主機就當成遠程機來配置)的SSH Servers了:

      img

      說明:

      • Name:SSH節點配置的名稱,可隨意設置,他將在job配置的「SSH Server」的下拉列表中,如圖:
        img
      • Hostname:經過SSH鏈接到的機器的主機名或IP。
      • Username:SSH服務使用的username,使用key進行鏈接時爲key指定的username。
      • Remote Derictory:運程機器上真實存在的文件夾,並且「Username」指定的用戶要有訪問此文件夾的權限。插件將把文件傳送到此文件夾下。通常是存放項目的目錄。
  • 測試,點擊「Test Configuration」按鈕,如success,這配置成功,進行下一步,新建任務。

下面開始新建任務:

  • 在首頁點擊「新建任務」,輸入名稱(建議和github的項目名稱保持一致),選擇第一個「構建一個自由風格的軟件項目」,而後點擊肯定:

    img

  • 返回首頁,能夠列表中看到剛剛新建的任務,點擊名稱,進入任務詳情:

    img

  • 在任務詳情頁,點擊配置,進行項目配置:

    img
    配置:
    img
    img
    img
    img
    img
    補充:(shell腳本都在項目的deploy目錄下)

    • Exec command:

      #!/usr/bin/env bash
      echo '************************************** 發送至服務器成功 **********************************************'
       # 項目名,取自環境變量
      projectName="${JOB_NAME}"
      dockerImageName=${projectName}-${BUILD_TIMESTAMP}
       # step1 解壓源代碼
      echo " ************************************* 解壓源代碼${dockerImageName}.tar.gz start *************************************"
      
      projectPath='/var/nodejs/' # 須要單獨給用戶賦目錄/var/nodejs/的權限 sudo chown ubuntu /var/nodejs/
      sudo mkdir -p ${projectPath}${projectName} || true \
      && cd ${projectPath}${projectName} \
      && sudo rm -rf *  # 刪除裏面的數據
      
      sudo tar -zxf ../${dockerImageName}.tar.gz -C ./ \
      && sudo rm  ../${dockerImageName}.tar.gz   # 刪除發佈過來的包
      
      echo " ************************************* 解壓源代碼${dockerImageName}.tar.gz finish *************************************"
       # step2 構建docker鏡像
      echo " ************************************* 構建docker鏡像${dockerImageName} start *************************************"
      sudo docker build -t ${dockerImageName} --force-rm .
      echo ' ************************************* 構建docker鏡像 finish *************************************'
       # step3 重啓容器
      echo "************************************* 使用鏡像${dockerImageName}啓動容器${projectName}  start *************************************"
      # 錯誤日誌統一存放在/var/nodejs/logs/${projectName}
      sudo mkdir -p /var/nodejs/logs/${projectName} || true \
      && sudo docker stop ${projectName} || true \
      && sudo docker rm ${projectName} || true \
      && sudo docker run -d --net=host --name ${projectName} -v /var/nodejs/logs/${projectName}:/var/nodejs/${projectName}/logs ${dockerImageName}
      
      echo "************************************* 使用鏡像${dockerImageName}啓動容器${projectName}  finish *************************************"
      
      echo '************************************************ 查看docker容器狀況: ************************************************ '
      sudo docker ps -a
      echo '************************************************ 查看docker容器狀況: ************************************************ '
      複製代碼
    • 若是項目須要在容器裏構建,一般初次構建時間相對較長,因此能夠把高級設置中的「Exec timeout」設的稍微大一些。

    • 構建-執行shell-命令:

      #!/usr/bin/env sh
      projectName="${JOB_NAME}"
      dockerImageName=${projectName}-${BUILD_TIMESTAMP}
      
      echo '*********************************** 準備打包從Github倉庫拉取的代碼...*********************************************'
      echo "**********${WORKSPACE}**********"
      tar --exclude=node_modules --exclude=.git --exclude='*.tar.gz'  -vzcf /tmp/${dockerImageName}.tar.gz -C  ${WORKSPACE} .  \
      && mv /tmp/${dockerImageName}.tar.gz  ${WORKSPACE} \
      && echo '*********************************** 打包成功 *********************************************' \
      && echo '************************************** 準備發送至服務器... **********************************************'
      複製代碼
    • 構建後操做,釘釘通知配置教程

  • 完成項目的任務配置,點擊保存。

  • 返回任務詳情也,點擊「Build with Parameters」,選擇分支,點擊「開始構建」:

    img

  • 在構建歷史列表中,點擊最新的一條構建記錄,再點「擊控制檯輸出」,可查看構建的log:

    img
    最終log輸出:Finished: SUCCESS,則成功。v 構建後,釘釘會收到通知。

若是有問題,須要版本回滾怎麼辦呢?

咱們能夠新建一個任務用於版本回滾:

  • 回到首頁,點擊新建,起個名字如:newblog-rollback。

  • 在列表點擊newblog-rollback,進入任務詳情,點擊配置,進入配置頁:

    img
    img
    img
    補充:(shell腳本都在項目的deploy目錄下)

    • Exec command:

      #!/usr/bin/env sh
      
      trim()
      {
          trimmed=$1
          trimmed=${trimmed%% }
          trimmed=${trimmed## }
          echo "$trimmed"
      }
       # projectName=$(trim "${container_name}")
      projectName="newblog"
      
      dockerImageName=$(trim "${image_name}")
      
      echo "******************************************* 回退到鏡像${image_name} ,並啓動容器${container_name} **************** *******************************"
      sudo mkdir -p /var/nodejs/logs/${projectName} || true \
      && sudo docker stop ${projectName} || true \
      && sudo docker rm ${projectName} || true \
      && sudo docker run -d --net=host --name ${projectName} -v /var/nodejs/logs/${projectName}:/var/nodejs/${projectName}/logs ${dockerImageName}
      echo "************************************* 使用鏡像${dockerImageName}啓動容器${projectName}  finish *************************************"
      複製代碼
  • 測試版本回滾,首先,你要知道要回退到哪一個版本,在newblog任務列表中copy你要回退的鏡像名:

    img
    img
    img
    img
    最終log輸出:Finished: SUCCESS,則成功。

最終成果:http://140.143.0.171:8080

【參考】:

  1. jenkins.io/
  2. N-blog

===🧐🧐 文中不足,歡迎指正 🤪🤪===

===內容有點多,自我感受寫的很差,但不知怎麼優化,有好的建議歡迎提===

相關文章
相關標籤/搜索