概念
- 服務治理遇到的問題
- 在微服務項目中每個服務都是獨立運行的項目
- 不可能對每個項目進行手動部署,涉及到自動化運維的問題
持續集成
- 持續集成(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)失敗
- Stages表示構建階段,也就是上面的流程,可以在一次Pipeline中構建多個Stages,這些Stages的特點:
- Jobs
- Jobs表示構建工作,表示某個Stage里面執行的工作,可以在Stages里定義多個Jobs,這些Jobs特點:
- 相同Stage中的Jobs會並行執行
- 相同Stage中的Jobs都執行成功時,該Stage才會執行成功
- 如果任何一個Job失敗,那么該Stage失敗,即構建任務(Pipeline)失敗
- Jobs表示構建工作,表示某個Stage里面執行的工作,可以在Stages里定義多個Jobs,這些Jobs特點:
持續交付
- 持續交付(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