Dubbo之GitLab 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
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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