Jenkins 搭建與集羣發佈環境構建

圖文無關
圖文無關java

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

目前持續集成(CI)已成爲當前許多軟件開發團隊在整個軟件開發生命週期內側重於保證代碼質量的常見作法。它是一種實踐,旨在緩和和穩固軟件的構建過程。
Jenkins 做爲一款軟件開發的神器,能幫團隊很優雅地解決編譯和發佈等工做。支持超多的第三方系統軟件,自定義 Shell 腳本,豐富的插件,可讓你遊刃有餘地完成不少自動化的工做。git

Jenkins 能解決如下幾類問題:docker

  1. 自動化構建軟件
  2. 自動化檢查
  3. 構建可持續的自動化測試
  4. 自動化打包和分發部署

安裝 Jenkins

提供兩種安裝方式。shell

  1. 下載 Jenkins
  2. 解壓 war 文件,運行 java -jar jenkins.war
  3. 訪問 http://localhost:8080 根據頁面指導完成安裝

docker

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

  1. docker pull jenkins
  2. 掛載目錄到宿主機,例如使用/var/jenkins_home,須要給目錄設置訪問權限segmentfault

    chown 1000 /var/jenkins_home
  3. 啓動。 使用 root 帳號進行登陸,暴露端口 8080,tcp 端口50000api

    docker run -u root -itd --name jenkins -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/jenkins_home jenkins
  4. 根據指導完成註冊
  5. 安裝插件。必定要安裝插件: Publish Over SSH

使用 Jenkins 作集羣部署流程

clipboard.png

  1. client 發送編譯指令到 Jenkins Server.
  2. Jenkins Server 從 Git repo 拉取代碼
  3. 編譯,打包
  4. 把編譯後的結果經過 ssh push 到業務服務器 server一、server二、server3

配置業務服務器

  1. 安裝插件 Publish Over SSH
  2. 進入到 /configure 頁面。配置 jenknis 的私鑰,和遠程服務地址和端口等等。

    clipboard.png

  3. 特別留意Remote Directory,jenkins 推送過去的文件都會出如今這個目錄,設置遠程服務器的絕對路徑有可能無效。使用相對路徑便可。
  4. 若是有多臺機器,都在這裏進行配置。另外,須要把 Jenkins 的公鑰,添加到 server1-3 的 ~/.ssh/authorized_keysbash

    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`生成
  5. 測試機器的鏈接。

配置發佈任務。

測試環境和產品環境應該使用不一樣的任務,由於服務會部署到不一樣的機器。執行流程也可能有差別。服務器

1.新建 FreeStyle 項目

clipboard.png

2. 配置倉庫

  1. 配置代碼倉庫,git,svn 等等都 ok
  2. Repositories 使用 ssh 的模式。
  3. 須要把 /var/jenkins_home/.ssh/id_rsa.pub 添加到倉庫的 access_key 裏面。保證 jenkins 能夠免密獲取到代碼,這個是最簡單那的配置

clipboard.png

3. 配置任務

以 node 項目爲例,Jenkins shell 默認使用 非交互+非登錄式,因此獲取不到環境變量。解決辦法第一行須要寫成 #!/bin/bash -l

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

clipboard.png

4. 發佈到遠程服務器

  1. 添加一個構建後的操做,Send build artifacts over SSH
  2. 推送文件到遠程機器,在遠程機器執行備份和重啓
    clipboard.png
  3. 注意sources files是基於當前項目的工做目錄,絕對路徑是無效的,
  4. Remote directory 也是基於遠程服務器的工做目錄,在配置Publish Over SSH的時候指定的。
  5. Exec command 意思就是在文件所有發送到遠程機器,執行如下的腳本。建議先備份以前的工做目錄,方便回滾代碼
  6. 你能夠配置多臺機器完成部署工做

5. 其餘問題

  1. SSH: Transferred 0 file(s)。 文件發送爲空。Source files 配置不對,應該是基於固然項目的相對路徑
  2. Shell command not found. #!/bin/bash -l
  3. Jenkins 安裝部署的問題見他的官方文檔。https://hub.docker.com/_/jenk...
  4. 實踐的過程當中遇到了不少問題,都一一解決了,有問題能夠留言。

使用 docker 部署

  1. DockerFile
FROM node:8

MAINTAINER 123 <123@123.me>

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"
  1. 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}
  1. 發佈
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}

其餘資料

  1. Jenkins Github 持續集成
  2. Jenkins執行shell讀不到環境變量問題
  3. Jenkins 文檔
相關文章
相關標籤/搜索