轉載請註明原創出處,謝謝!
在開發過程中,如果每次交付給測試時都需要手動的對代碼進行構建和部署,這無疑是一件較爲繁瑣的過程,如果能夠讓其一鍵完成,無疑可以節省人力勞動並降低時間開銷。這就是我們通常說的自動化部署。
最近接手了公司的一個新項目,所幸有機會自己獨立搭建這樣一套自動化部署環境。雖然有些地方不那麼完美,但是已經能夠一鍵部署了,也還是不錯的。
下面就是搭建的大致步驟、搭建過程中遇到的問題及解決辦法。
注意:本文基於 `Red Hat` 環境,初始狀態爲:一個 `root` 用戶,存在 `yum` 命令可以調用,`Red Hat` 版本信息如下:
Linux iZ9ni05eeu3wg5xwyjnt5gZ 3.10.0-514.6.2.el7.x86_64 #1 SMP Thu Feb 23 03:04:39 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
一、新建用戶和用戶組(參考博文:Linux學習-給普通用戶加sudo權限)
首先需要添加一個新用戶 HappyFeet
,所有操作應該基於新用戶來進行,而不是 root
用戶,因爲 root
權限太高,稍有不慎就可能出大問題。
1、添加用戶組
groupadd HappyFeet
2、添加用戶,並指定用戶組
useradd -g HappyFeet HappyFeet
3、給用戶設置密碼(輸入密碼2次)
passwd HappyFeet
4、給新用戶添加 sudo
權限
切換至 root
帳號,執行 visudo
,找到 root ALL=(ALL) ALL
,在其後面新增一行:HappyFeet ALL=(ALL) ALL
即可。
二、zsh 配置
1、安裝 git
sudo yum install git
2、安裝 zsh
(參考文檔:Installing zsh – the easy way)
sudo yum install zsh
3、安裝 on my zsh
(參考官方文檔:Install oh-my-zsh now)
4、安裝提示工具 zsh-autosuggestions
(參考官方文檔:zsh-autosuggestions,可裝可不裝,一款提示工具)
5、通過 ssh-keygen
生成 ssh key
,然後將自己的 public key 加至 authorized_keys
文件中,後面即可通過 ssh username@host
登錄服務器,方便快捷。(這也是個可選項,如果不這樣配置的話每次 ssh
時都需要輸密碼,就會很麻煩)
參考鏈接:How to ssh to remote server using a private key?
6、.zshrc 添加別名(僅是別名配置,可以忽略不管)
在 ~/.zshrc
文件中新增一行:alias ll="ls -alh"
三、安裝 Docker(參考官方文檔:Get Docker CE for CentOS,服務器爲 Red Hat
版本,按照 centos
版安裝 docker ce
社區版本)
1、Install required packages.
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
2、Use the following command to set up the stable repository.
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
3、Install the latest version of Docker CE.
sudo yum install docker-ce
4、啓動.
sudo systemctl start docker
5、使用 docker ps
報如下錯誤
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied
解決方案爲:將當前用戶加入 docker
用戶組(參考鏈接:docker.sock permission denied)
➜ ~ echo $USER
HappyFeet
➜ ~ sudo usermod -aG docker $USER
四、安裝 openjdk(參考官方文檔:How to download and install prebuilt OpenJDK packages)
1、安裝 openjdk
su -c "yum install java-1.8.0-openjdk-devel"
需要注意的是,需要安裝 develop 版的,不帶 devel 後綴的是 jre 環境。
2、添加 JAVA_HOME、JRE_HOME
環境變量(gradle 會用到)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=$PATH:${JAVA_HOME}/bin
五、安裝 gradle
1、下載 bin.zip(個人喜歡用.zip安裝,知道安裝在哪,所有都是由自己掌控,下載鏈接:download gradle)
2、解壓至指定路徑
$ mkdir ~/tools/gradle
$ unzip -d ~/tools/gradle gradle-4.6-bin.zip
$ ls ~/tools/gradle/gradle-4.6
LICENSE NOTICE bin getting-started.html init.d lib media
3、添加 GRADLE_HOME 至 .zshrc
export GRADLE_HOME=/home/HappyFeet/tools/gradle/gradle-4.6
export PATH=$PATH:${GRADLE_HOME}/bin
4、gradle -v
驗證,輸出如下:
➜ ~ gradle -v
------------------------------------------------------------
Gradle 4.6
------------------------------------------------------------
Build time: 2018-02-28 13:36:36 UTC
Revision: 8fa6ce7945b640e6168488e4417f9bb96e4ab46c
Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM: 1.8.0_191 (Oracle Corporation 25.191-b12)
OS: Linux 3.10.0-514.6.2.el7.x86_64 amd64
六、安裝 jenkins
1、下載war包(Getting started with Jenkins,Generic Java package (.war)版本)
2、編寫 start_jenkins.sh 腳本
#!/bin/sh
export JENKINS_HOME=/home/HappyFeet/tools/jenkins
export COPY_REFERENCE_FILE_LOG=$HOME/copy_reference_file.log
java -jar $JENKINS_HOME/jenkins.war --httpPort=8899 --logfile=$JENKINS_HOME/jenkins.log
3、啓動 jenkins
執行 nohup /home/HappyFeet/scripts/start_jenkins.sh &
,使用 nohup
的原因是爲了讓它在後臺一直運行
啓動完之後可以打開 http://serverHost:8899 即可進入 jenkins 頁面進入後續操作
七、安裝 htop,監控系統狀態
sudo yum install htop
八、安裝 nodejs 最新版本(參考鏈接:How To Install Latest Nodejs on CentOS/RHEL 7/6、Installing nodejs on Red Hat)
curl -sL https://rpm.nodesource.com/setup | bash -
yum install -y nodejs
九、登錄 daocloud.io
docker login daocloud.io
Username: HappyFeet(daocloud.io 的 username)
Password:
十、在 jenkins 上添加自動化腳本
jenkins 集成了 git、gradle、nodejs 及 docker。
後端服務原本的部署步驟爲:
(1)更新代碼(需要將 server 上的 ~/.ssh/id_rsa.pub
key 加在 github 上):git pull master
(2)將更新之後的代碼編譯,打成 jar 包:gradle clean build
(3)將更新的 jar 掛載在 docker 內部運行:docker run balabala...
前端服務也是類似。
通過 jenkins 工具,我們可以通過一個按鈕就完成上面的所有操作,即自動化。在這個自動化中,jenkins 所扮演的角色就是一個 operator,它可以按順序執行上面(1)、(2)、(3)的操作。而我們要做的就是將(1)、(2)、(3)腳本化。
至於如何編寫腳本和 jenkins 配置則需要參考 jenkins 文檔及 shell 腳本編寫相關的知識了…在此不做詳細講解了。下面給出我自己編寫的大致腳本僅作參考:
#!/bin/zsh
source /home/HappyFeet/.zshrc #使之可以調用 gradle、docker 命令
gradle clean build
cp build/libs/**.jar /opt/jars/**.jar #將jar包複製到掛載目錄
docker stop svc_name
docker rm svc_name
docker run --name svc_name -v /opt/jars/:/app/ ....
搭建自動化部署環境所涉及的知識點還是比較多的,雖然我也想將搭建過程詳盡道來,但其中細節頗多,很難將其全面覆蓋到,所以很多地方我都將參考鏈接附上,有一些則是官方文檔,通過這些鏈接基本可以完成,但不一定很輕鬆。當然,如果在搭建過程中遇到問題,可以在 stackoverflow 上搜尋答案,也歡迎大家提問!畢竟----我是一隻愛瞎折騰的程序猿_~