微服務項目部署實踐:使用Gitlab Runner實現微服務項目的持續集成,持續交付和持續部署


概念

  • 服務治理遇到的問題
    • 在微服務項目中每個服務都是獨立運行的項目
    • 不可能對每個項目進行手動部署,涉及到自動化運維的問題

持續集成

  • 持續集成(Continues Integration,簡稱CI)
  • 持續集成指的是,頻繁(一天多次)地將代碼集成到主干,優點有兩個:
    • 快速發現錯誤: 每完成一點更新, 就集成到主干,可以快速發現錯誤,定位錯誤
    • 防止分支大幅偏離主題: 如果不是經常集成,主干又在不斷更新,會導致以后集成難度變大,甚至難以集成
  • 持續集成強調:開發人員提交了新的代碼之后,立即進行構建,(單元)測試,根據測試結果,確定新代碼和原有代碼能否集成到一起
  • 與集成相關的概念還有持續交付和持續部署
使用GitLab持續集成
  • 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 Runner

GitLab CI

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

GitLab Runner

  • 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 <topsale@vip.qq.com>
# 修改軟件源
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,進入持續集成設置界面在這里插入圖片描述
    • 在交互式終端中填入 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
    

    使用Runner

  • 在項目工程下編寫 .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

提交項目之后,就會執行Runner

  • 在項目工程下創建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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM