Jenkins 搭建與集群發布環境構建

  • 2019 年 12 月 11 日
  • 筆記

來源:http://www.51testing.com/

Jenkins是一個開源軟體項目,是基於Java開發的一種持續集成工具,用於監控持續重複的工作,旨在提供一個開放易用的軟體平台,使軟體的持續集成變成可能。

  目前持續集成(CI)已成為當前許多軟體開發團隊在整個軟體開發生命周期內側重於保證程式碼品質的常見做法。它是一種實踐,旨在緩和和穩固軟體的構建過程。

  Jenkins 作為一款軟體開發的神器,能幫團隊很優雅地解決編譯和發布等工作。支援超多的第三方系統軟體,自定義 Shell 腳本,豐富的插件,可以讓你遊刃有餘地完成很多自動化的工作。

  Jenkins 能解決以下幾類問題:

  自動化構建軟體

  自動化檢查

  構建可持續的自動化測試

  自動化打包和分發部署

 安裝 Jenkins

  提供兩種安裝方式。

  下載 Jenkins

  解壓 war 文件,運行 java -jar jenkins.war

  訪問 http://localhost:8080 根據頁面指導完成安裝

 docker

  我更加推薦這種方式。倉庫地址:https://hub.docker.com/_/jenk…

  docker pull jenkins

  掛載目錄到宿主機,例如使用/var/jenkins_home,需要給目錄設置訪問許可權

  chown 1000 /var/jenkins_home

  啟動。 使用 root 帳號進行登錄,暴露埠 8080,tcp 埠50000

  docker run -u root -itd –name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkins

  根據指導完成註冊

  安裝插件。一定要安裝插件: Publish Over SSH

 使用 Jenkins 做集群部署流程

  client 發送編譯指令到 Jenkins Server.

  Jenkins Server 從 Git repo 拉取程式碼

  編譯,打包

  把編譯後的結果通過 ssh push 到業務伺服器 server1、server2、server3

  配置業務伺服器

  安裝插件 Publish Over SSH

  進入到 /configure 頁面。配置 jenknis 的私鑰,和遠程服務地址和埠等等。

  特別留意Remote Directory,jenkins 推送過去的文件都會出現在這個目錄,設置遠程伺服器的絕對路徑有可能無效。使用相對路徑即可。

  如果有多台機器,都在這裡進行配置。另外,需要把 Jenkins 的公鑰,添加到 server1-3 的 ~/.ssh/authorized_keys。

  1. ssh jenkins 宿主機

  2. cat /var/jenkins_home/.ssh/id_rsa.pub

  3. 把公鑰存放到 server1-3 的`~/.ssh/authorized_keys`

  4. 這樣 jenkins 這台機器就可以免密登陸到 server1-3

  5. 如果 Jenkins 機器沒有 /var/jenkins_home/.ssh/,那麼就通過`ssh-keygen`生成

  測試機器的連接。

  配置發布任務。

  測試環境和產品環境應該使用不同的任務,因為服務會部署到不同的機器。執行流程也可能有差異。

1.新建 FreeStyle 項目

2. 配置倉庫

  配置程式碼倉庫,git,svn 等等都 ok

  Repositories 使用 ssh 的模式。

  需要把 /var/jenkins_home/.ssh/id_rsa.pub 添加到倉庫的 access_key 裡面。保證 jenkins 可以免密獲取到程式碼,這個是最簡單那的配置

 3. 配置任務

  以 node 項目為例,Jenkins shell 默認使用 非交互+非登陸式,所以獲取不到環境變數。解決辦法第一行需要寫成 #!/bin/bash -l

  編譯任務都在這裡完成了。

4. 發布到遠程伺服器

  添加一個構建後的操作,Send build artifacts over SSH

  推送文件到遠程機器,在遠程機器執行備份和重啟

  注意sources files是基於當前項目的工作目錄,絕對路徑是無效的,

  Remote directory 也是基於遠程伺服器的工作目錄,在配置Publish Over SSH的時候指定的。

  Exec command 意思就是在文件全部發送到遠程機器,執行以下的腳本。建議先備份之前的工作目錄,方便回滾程式碼

  你可以配置多台機器完成部署工作

 5. 其他問題

  SSH: Transferred 0 file(s)。 文件發送為空。Source files 配置不對,應該是基於當然項目的相對路徑

  Shell command not found. #!/bin/bash -l

  Jenkins 安裝部署的問題見他的官方文檔。https://hub.docker.com/_/jenk…

  實踐的過程中遇到了很多問題,都一一解決了,有問題可以留言。

  使用 docker 部署

DockerFile  FROM node:8  MAINTAINER 123 <[email protected]>  expose 7001  ENV LANG="C.UTF-8"   TZ="Asia/Shanghai"  WORKDIR /data/work/  #設置時區  RUN echo Asia/Chongqing > /etc/timezone   && ln -sfv /usr/share/zoneinfo/Asia/Chongqing /etc/localtime  RUN echo "deb http://mirrors.aliyun.com/debian/ jessie main non-free contrib n  deb http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib n  deb-src http://mirrors.aliyun.com/debian/ jessie main non-free contrib n  deb-src http://mirrors.aliyun.com/debian/ jessie-proposed-updates main non-free contrib"   > /etc/apt/sources.list   && apt-get update   && apt-get install -y libsasl2-dev libsasl2-modules-gssapi-heimdal   && rm -rf /var/lib/apt  #加入node程式並安裝npm包  ADD ./ ./  RUN set -ex   && npm install -g cnpm –registry=https://registry.npm.taobao.org   && cnpm install egg-development-proxyworker   && cnpm install –production   && cd clientapp   && cnpm install   && NODE_ENV="production" cnpm run build:prod  CMD /bin/bash -c "npm run prod && while pidof node; do sleep 60; done"  Build  #!/bin/bash -l  set -ex  docker build -t registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER} .  # docker image tag registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER} registry.cn-hangzhou.aliyuncs.com/123/minerdash:latest  docker push registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER}  發布  set -ex  docker pull registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER}  docker rm -f minerdash || true  docker run -d –name minerdash –network host registry.cn-hangzhou.aliyuncs.com/123/minerdash:${BUILD_NUMBER}

歡迎參加眾測:

https://wap.ztestin.com/site/register?usercode=FAAAQwMQGAAXAwQBA3QhExcDHAQDPjVaABMIQg%3D%3D