自動化部署Ruby on Rails應用(docker + jenkins)

docker安裝參考連接

docker官網

jenkins中文官網


個人博客網站已經遷移到了https://johnnyting.github.io/,若是有興趣的能夠關注下。
下面文章格式可能有點亂,能夠查看個人博客原文: https://johnnyting.github.io/posts/%E4%BD%BF%E7%94%A8jenkinsdocker%E8%87%AA%E5%8A%A8%E5%8C%96%E9%83%A8%E7%BD%B2rails%E5%BA%94%E7%94%A8/

服務器環境爲Ubuntu 16.04.2 LTS

1.卸載舊版本dockernode

sudo apt-get remove docker \
              docker-engine \
              docker.io

2.安裝docker,使用腳本自動安裝git

curl -fsSL get.docker.com -o get-docker.sh

sudo sh get-docker.sh --mirror Aliyun

3.啓動dockergithub

# 設置開啓自啓動
sudo systemctl enable docker

# 啓動docker
sudo systemctl start docker

# 查看版本
docker -v    # docker --version
Docker version 18.09.5, build e8ff056

4.安裝docker-composeweb

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加執行權限
sudo chmod +x /usr/local/bin/docker-compose

# 查看版本
docker-compose -v    # docker-compose --version

5.安裝compose bash補全命令sql

curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

6.若是須要卸載docker-compose,刪除可執行文件便可docker

sudo rm /usr/local/bin/docker-compose

7.配置docker鏡像加速shell

在/etc/docker/daemon.json 中寫入以下內容,若是沒有此文件新建便可:
{
"registry-mirrors": [
  "https://dockerhub.azk8s.cn",
  "https://reg-mirror.qiniu.com"
]
}


從新啓動服務:
sudo systemctl daemon-reload
sudo systemctl restart docker

檢查加速器是否生效:
docker info

若是出現下面內容則配置成功
Registry Mirrors:
https://dockerhub.azk8s.cn/
https://reg-mirror.qiniu.com/

8.安裝jenkins,使用blue ocean鏡像,來建立流水線項目npm

docker run \
   --name jenkins \
   -u root \
   -d \
   -p 8090:8080 \
   -v /home/oliver/jenkins_home:/var/jenkins_home \
   -v /home/oliver/.ssh:/root/.ssh \
   --restart=always \
  jenkinsci/blueocean
   
# 將jenkins的數據目錄掛載出來,防止數據丟失
# 這裏把.ssh目錄掛載出來的緣由是:
# 1.以後須要將rails應用部署到其餘服務器上,須要經過ssh認證來遠程部署應用,因此主機host須要保證和部署服務器連通。
# 2.須要將ssh公鑰傳入到git服務器上,保證能正常拉取代碼

9.查看jenkins日誌,獲取管理員密碼json

➜  ~ sudo docker ps
CONTAINER ID       IMAGE                 COMMAND                 CREATED             STATUS             PORTS                               NAMES
a210c6d643a3       jenkinsci/blueocean   "/sbin/tini -- /usr/…"   3 minutes ago       Up 3 minutes        50000/tcp, 0.0.0.0:8090->8080/tcp   jenkins

# 查看jenkins日誌
➜ ~ sudo docker logs -f --tail=50 a210c6d643a3

看到密碼後複製,或者進入容器內的/var/jenkins_home/secrets/initialAdminPassword 查看,由於jenkins容器目錄掛載到了/home/oliver/jenkins_home下,因此也能夠查看 sass

/home/oliver/jenkins_home/secrets/initialAdminPassword 文件中的內容。

 

10.選擇安裝推薦插件就行

 

11.而後等待安裝完成,若是安裝失敗就從新安裝。

 

12.而後下一步提示建立一個管理員帳號,填寫完就進入jenkins首頁。

 

13.配置憑據

 

添加全局憑據:

 

添加ssh私鑰,在/home/oliver/.ssh/id_rsa中

 

14.在本地rails項目中添加 Jenkinsfile:

pipeline {
   agent any
   stages {
      stage('start') {
         steps {
           echo 'jenkins構建開始...'
        }
      }
      stage('build') {
         steps {
           sh 'sh ssh.sh'
        }
      }
  }
  post {
      success {
           echo 'jenkins構建成功'
        }
      failure {
           echo 'jenkins構建失敗'
        }
  }
}

15.鏈接應用部署服務器ssh.sh(jenkins所在服務器與應用部署服務器區分開):

#! /bin/bash
branch=$(git symbolic-ref --short -q HEAD)
echo "分支: ${branch}"
ssh root@xxxx 'bash -s' < deploy.sh ${branch}

# 這裏獲取分支名稱是爲了在部署服務器上區分分支項目,也用來區分每一個分支的docker容器
# 後面的deploy.sh 是鏈接到部署服務器上後執行的腳本

 

16.根據部署腳本deploy.sh啓動容器:

#! /bin/bash
app=$1
cd /root/workspace/
if [ ! -d "${app}" ];then
   echo "克隆項目${app}"
   git clone -b $app git@xxxx/xxxx.git $app
   cd ${app}
else
   cd ${app}
   echo "拉取項目${app}"
   git pull origin $app
fi
branch=${app//-/}
echo ${branch}
web=$(docker-compose ps | grep $branch | awk '{print $1}')
if [ -z $web ];then
   echo "構建容器: ${web}"
  docker-compose up -d
else
   echo "重啓容器: ${web}"
  docker-compose restart
fi

# 上面shell主要的做用是:不存在某個分支的項目則克隆到指定目錄,存在則拉取最新代碼;而後根據分支名稱查看容器是否構建過,沒有則開始構建並啓動,以前構建過則重啓容器

 

17.構建所須要的Dockerfile:

FROM ruby:2.5.3
RUN apt-get update -qq && apt-get install -y curl netcat && \
   curl -sL https://deb.nodesource.com/setup_10.x |  bash - && \
  apt-get install -y nodejs postgresql-client openjdk-8-jdk && \
   npm install -g yarn --registry=https://registry.npm.taobao.org &&\
  yarn config set registry https://registry.npm.taobao.org -g &&\
  yarn config set sass_binary_site http://cdn.npm.taobao.org/dist/node-sass -g && \
  apt-get purge -y --auto-remove curl && apt-get clean && \
   rm -rf /var/lib/apt/lists/*
ENV LANG=C.UTF-8 RAILS_ROOT=/myapp
WORKDIR $RAILS_ROOT
VOLUME $RAILS_ROOT
COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000
# Start the main process.
CMD ["rails", "server", "-b", "0.0.0.0"]

 

18.入口點entrypoint.sh

#!/bin/bash
# Remove a potentially pre-existing server.pid for Rails.
rm -f /myapp/tmp/pids/server.pid
bundle install
rm -rf build/
./gradlew generateProto
nohup sh bin/rpcServer_development.sh >rpc.log 2>&1 &
echo $! > rpc.pid
while ! nc -z localhost 6600;
    do
     echo "wait for rpc...";
     sleep 2;
    done;
echo "rpc is ready!";
if [ -f "bin/downloadCenter_development.sh" ];then
  nohup sh bin/downloadCenter_development.sh >download.log 2>&1 &
  echo $! > download.pid
fi
yarn install
# Then exec the container's main process (what's set as CMD in the Dockerfile).
exec "$@"

# 注意:上面腳本須要根據本身項目的具體狀況來寫

19.docker-compose.yml

version: '3'
services:
web:
  build: .
  volumes:
     - .:/myapp
  ports:
     - "3000:3000"
   restart: always

 

20.而後建立jenkins項目,打開blue ocean

 

21.選擇git代碼倉庫,填入git地址

填入地址後根據提示須要將你的ssh公鑰key配置到git服務器上,而後建立流水線。建立後多分支項目根目錄有Jenkinsfile的自動構建。

 

22.在項目配置中,選擇掃描項目的時間間隔,分支有改動自動觸發構建

這裏設置每五分鐘掃描一次git倉庫

 

以後就是每次推送了代碼,jenkins發現代碼有改動就會觸發構建並使用docker部署到指定的服務器上,能夠在jenkins後臺查看構建過程,也能夠在部署服務器查看容器日誌。

 

整個自動化部署rails應用流程就結束了,你們能夠嘗試一下。

相關文章
相關標籤/搜索