天天看點

微服務架構Day31-Dubbo之持續內建

Dubbo之GitLab Runner部署持續內建

  • 概念
      • 持續內建
          • 使用GitLab持續內建
      • 持續傳遞
      • 持續部署
  • GitLab Runner
      • GitLab CI
      • 使用Runner
  • 服務治理遇到的問題
    • 在微服務項目中每個服務都是獨立運作的項目
    • 不可能對每個項目進行手動部署,涉及到自動化運維的問題

  • 持續內建(Continues Integration,簡稱CI)
  • 持續內建指的是,頻繁(一天多次)地将代碼內建到主幹,優點有兩個:
    • 快速發現錯誤: 每完成一點更新, 就內建到主幹,可以快速發現錯誤,定位錯誤
    • 防止分支大幅偏離主題: 如果不是經常內建,主幹又在不斷更新,會導緻以後內建難度變大,甚至難以內建
  • 持續內建強調:開發人員送出了新的代碼之後,立即進行建構,(單元)測試,根據測試結果,确定新代碼和原有代碼能否內建到一起
  • 與內建相關的概念還有持續傳遞和持續部署
  • GitLab8.0以後,GitLab CI就已經內建在GitL中,隻要在項目中添加一個 .gitlab-ci.yml檔案,然後添加一個Runner,就可以進行持續內建
  • Pipeline
    • Pipeline: 管道 ,一次Pipeline相當于一次建構任務,可以包含多個流程:安裝依賴,運作測試,編譯,部署測試伺服器,部署生産伺服器等流程
    • 任何送出或者Merge Request的合并都可以觸發Pipeline
  • Stages
    • Stages表示建構階段,也就是上面的流程,可以在一次Pipeline中建構多個Stages,這些Stages的特點:
      • 所有Stages會按照順序運作: 即當一個Stage完成後,下一個Stage才會開始
      • 隻有當所有Stages完成後,該建構任務(Pipeline)才會成功
      • 如果任何一個Stage失敗,那麼後續的Stages都不會執行,該建構任務(Pipeline)失敗
  • Jobs
    • Jobs表示建構工作,表示某個Stage裡面執行的工作,可以在Stages裡定義多個Jobs,這些Jobs特點:
      • 相同Stage中的Jobs會并行執行
      • 相同Stage中的Jobs都執行成功時,該Stage才會執行成功
      • 如果任何一個Job失敗,那麼該Stage失敗,即建構任務(Pipeline)失敗

  • 持續傳遞(Continuous Delivery):
    • 頻繁地将軟體的新版本,傳遞給品質團隊或使用者以供評審
    • 評審通過,代碼就進入生産階段
  • 持續傳遞是持續內建的下一步,強調的是:不管怎麼更新,軟體是随時随地可以傳遞的
  • 持續傳遞是在持續內建的基礎上,将內建後的代碼部署到更接近真實運作環境的類生産環境(production-like environment)中

  • 持續部署(Continuous Deployment)是持續傳遞的下一步,指的是代碼通過評審後,自動部署到生産環境
  • 持續部署的目标: 代碼在任何時刻都是可部署的,可進入生産階段
  • 持續部署的前提: 自動化完成測試,建構,部署等步驟

  • 一般來說,建構任務會占用很多的系統資源(編譯代碼時),由于GitLab CI是GitLab的一部分,由GitLab CI來運作建構任務的化,GitLab的性能會大大下降
  • GitLab CI最大的作用: 是管理各個項目的建構狀态

  • GitLab Runner可以安裝到不同的機器上,在建構任務運作期間不會影響GitL的性能
  • 基于Docker安裝GitLab Runner:
1.建立工作目錄: /usr/local/docker/runner
2.建立建構目錄: /usr/local/docker/runner/environment
3.下載下傳jdk-8u152-linux-x64.tar.gz複制到/usr/local/docker/runner/environment
4.下載下傳apache-maven-3.5.3-bin.tar.gz複制到/usr/local/docker/runner/environment


daemon.json
1.在/usr/local/docker/runner/environment目錄下建立daemon.json,用于配置加速器和倉庫位址
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
{
	"registry-mirrors":[
		"https://registry.docker-cn.com"
	],
	"insecure-registries":[
		"127.0.0.1:5000"
	]
}
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Dockerfile
1.在 /usr/local/docker/runner/environment目錄下建立Dockerfile
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FROM gitlab/gitlab-runner
MAINTAINER Lusifer <[email protected]>
# 修改軟體源
RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \
    echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \
    echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \
    echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \
    apt-get update -y && \
    apt-get clean
# 安裝 Docker
RUN apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \
    curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \
    add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && \
    apt-get update -y && \
    apt-get install -y docker-ce
COPY daemon.json /etc/docker/daemon.json
# 安裝 Docker Compose
WORKDIR /usr/local/bin
RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose
RUN chmod +x docker-compose
# 安裝 Java
RUN mkdir -p /usr/local/java
WORKDIR /usr/local/java
COPY jdk-8u152-linux-x64.tar.gz /usr/local/java
RUN tar -zxvf jdk-8u152-linux-x64.tar.gz && \
    rm -fr jdk-8u152-linux-x64.tar.gz
# 安裝 Maven
RUN mkdir -p /usr/local/maven
WORKDIR /usr/local/maven
# RUN wget https://raw.githubusercontent.com/topsale/resources/master/maven/apache-maven-3.5.3-bin.tar.gz
COPY apache-maven-3.5.3-bin.tar.gz /usr/local/maven
RUN tar -zxvf apache-maven-3.5.3-bin.tar.gz && \
    rm -fr apache-maven-3.5.3-bin.tar.gz
# COPY settings.xml /usr/local/maven/apache-maven-3.5.3/conf/settings.xml
# 配置環境變量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_152
ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3
ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

WORKDIR /
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

docker-compose.yml
在 /usr/local/docker/runner 目錄下建立 docker-compose.yml
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
# 表示從 environment 目錄下尋找 Dockerfile,即在Docker 裡裝 Docker
version: '3.1'
services:
  gitlab-runner:
    build: environment
    restart: always
    container_name: gitlab-runner
    privileged: true
    volumes:
      - ./config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
           
  • 建構鏡像并啟動
    • 在/usr/local/docker/runner目錄下執行:
    docker-compose build
               
  • 注冊 Runner
    • 啟動容器在/usr/local/docker/runner目錄下執行指令啟動:
    docker-compose up 
               
    • 進入容器自動執行注冊流程,在/usr/local/docker/runner目錄下執行(後面gitlab-runner register時腳本指令):
    docker exec -it gitlab-runner gitlab-runner register
               
    • 打開 GitLab,進入持續內建設定界面
      微服務架構Day31-Dubbo之持續內建
    • 在互動式終端中填入 Git Lab 提供的 URL 和 token
    Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
    http://192.168.1.21/
    Please enter the gitlab-ci token for this runner:
    kTx_PUnx_hhy63pNJtqM
    Please enter the gitlab-ci description for this runner:
    [c77b5e39a2a6]: 
    Please enter the gitlab-ci tags for this runner (comma separated):
    
    Registering runner... succeeded                     runner=kTx_PUnx
    Please enter the executor: docker, shell, ssh, docker-ssh+machine, docker+machine,     kubernetes, docker-windows, docker-ssh, parallels, virtualbox:
    shell
    Runner registered successfully. Feel free to start it, but if it's running already the config   should be automatically reloaded! 
               
    docker exec -it gitlab-runner gitlab-runner register
    
     # 互動式配置說明:
    
     # 輸入GitLab位址
     Please enter the gitlab-ci coordinator URL(e.g. https://gitlab.com/)
     http://192.168.32.255/
    
     # 輸入GitLab Token
     Please enter the gitlab-ci token for this runner:
     kTx_PUnx_hhy63pNJtqM
    
     # 輸入Runner的說明
     Please enter the gitlab-ci description for this runner:
     可以不填為空
    
     # 設定Tag,用于指定在建構規定的tag時觸發ci,如果不設定,預設每次都會觸發ci
     Please enter the gitlab-ci tags for this runner (comma separate):
     deploy
    
     # 這裡選擇true,用于代碼上傳後直接執行
     Whether to run utagged builds [true/false]:
     true
    
     # 這裡選擇false,可以直接回車,預設false
     Whether to lock Runner to current project [true/false]:
     false
    
     # 選擇runner執行器,這裡選擇shell
     Please enter the executor: virtualbox,docker+machine,parallels,shell,ssh,docker-ssh+machine,kubernetes,docker,docker-ssh:
     shell
               

  • 在項目工程下編寫 .gitlab-ci.yml檔案:
stages:
 - install_deps
 - test
 - build
 - deploy_test
 - deploy_production

cache:
 key: ${CI_BUILD_REF_NAME}
 paths:
  - node_modules/
  - dist/

# 安裝依賴
install_deps:
 stage: install_deps
 only:
  - develop
  - master
 script:
  - npm install

# 運作測試用例
test:
 stage: test
 only:
  - develop
  - master
 script:
  - npm run test

# 編譯
build:
 stage: build
 only:
  - develop
  - master
 script:
  - npm run clean
  - npm run build:client
  - npm run build:server

# 部署測試伺服器
deploy_test:
 stage: deploy_test
 only:
  - develop
 script:
  - pm2 delete app || true
  - pm2 start app.js --name app

# 部署生産伺服器
deploy_production:
 stage: deploy_production
 only:
  - master
 script:
  - bash scripts/deploy/deploy.sh
           
  • 在項目工程下建立docker檔案夾,建立Dockerfile
FROM openjdk:8-jre

MAINTAINER Chova

# 環境變量
ENV APP_VERSION 1.0.0-SNAPSHOT
# Docker插件,用來檢測依賴項,隻有依賴項啟動才會啟動
ENV DOCKERIZE_VERSION v0.6.1

RUN wget https://github.com/jwilder/dockerize/release/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
	&& tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \
	&& rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz 

RUN mkdir /app

COPY myshop-service-user-provider-$APP_VERSION.jar /app/app.jar
ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "tcp://192.168.32.255.131:3306", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]

EXPOSE 8501
           
  • Dockerfile:
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1.FROM: 這是引入一個父鏡像,在此基礎上進行添加隻讀層.鏡像可以了解成由一層層隻讀層組成,
		FORM下面的指令,可以了解就是在已有的隻讀層,添加隻讀層.FORM可以有多個,但最上面的一定是FROM指令

2.VOLUME: 配置一個具有持久化功能的目錄,主機 /var/lib/docker 目錄下建立了一個臨時檔案,并連結到容器的/tmp.該步驟是可以省略的
		  預設情況下,容器不使用任何 volume,此時,容器的資料被儲存在容器之内,它隻在容器的生命周期記憶體在,會随着容器的被删除而被删除
		  如果不想在容器删除後,容器的資料也被删除,那麼就可以指定持久化目錄.它被設計用來儲存資料,而不管容器的生命周期.是以,當你删除一個容器時,Docker不會自動地删除一個volume

3.ARG:設定編譯鏡像時加入的參數,可以省略

4.COPY:隻支援将本地檔案複制到容器,還有個ADD更強大但複雜點

5.ENTRYPOINT:容器啟動時執行的指令
           
  • 删除所有為的鏡像
docker rmi $(docker images -q -f dangling=true)
           
  • 在docker-compose.yml中配置預設使用已經存在的網絡
version: '3.1'
services:
  myshop-service-user-provider:
    image: 192.168.32.255:5000/myshop-service-user-provider:v1.0.0
    container_name: myshop-service-user-provider
    ports:
      - 8501:8501
      - 22222:22222
      - 20881:20881
    # 配置容器連接配接的網絡
networks:
  default:
    external:
      name: dubbo