Gitlab CI/DI 使用

  工做中遇到項目搭建CI/CD基於Gtilab-runner + Docker ,同時部署了shipyard對Docker進行管理,開啓CI/CD的項目能夠實現,代碼提交後自動build docker鏡像,並生成相應的容器進行部署,能夠有效減小本地開發環境到測試環境的工做量。同時後期生產環境能夠直接採用容器部署,方便之後的運維。html

  開啓CI/CD須要如下4步前端

1. 項目關聯gitlab-runnervue

image.png

2. 項目根目錄中編寫Dockerfile文件java

  如下代碼以本項目爲例做爲說明,基本思路是先用docker mvn鏡像進行打包,而後在用打包好的jar組裝一個可執行springboot的鏡像node

#從本身構建的阿里雲mavenDocker中拉取maven鏡像
#避免重複下載依賴性包
FROM registry.cn-hangzhou.aliyuncs.com/wangpengyao/maven as mvn-stage
MAINTAINER wangpengyao
WORKDIR /app
COPY . .
#須要指定docker中setting文件的位置
RUN mvn clean package --settings /usr/share/maven/ref/settings.xml -Dmaven.test.skip=true

FROM java:8 as production-stage
MAINTAINER wangpengyao
VOLUME /tmp
COPY --from=mvn-stage /app/target/dataforsea_bg-0.0.1-SNAPSHOT.jar /mvn-app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/mvn-app.jar"]
若是您的項目是vue前端程序,能夠參考下面的Dockfile文件
基本流程是先用一個node鏡像對項目進行編譯,而後在用編譯好dist生成一個nigix鏡像
FROM node as build-stage
MAINTAINER wangpengyao
WORKDIR /app
COPY package*.json ./
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org
RUN cnpm install
COPY . .
RUN npm run build

# production stage
FROM nginx as production-stage
MAINTAINER wangpengyao
COPY --from=build-stage /app/dist /usr/share/nginx/html/

3. 項目根目錄構建.gitlab-ci.yml文件(注意該文件是以.開頭)nginx

  這個yml文件是對gitlab-runner運行步驟的指揮腳本,也就是說,當咱們的代碼上傳到git後,會觸發runner根據這個yml文件進行打包和部署。
若是您的工程是springboot撰寫的後臺程序,其內容能夠參照一下內容構建本身的.gitlab-ci.ymlgit

#共3個步驟 
#step1 從git倉庫clone到/data/wwwroot工做目錄
#step2 根據上一步定義的Dockfile生成鏡像
#step3 根據鏡像構建部署業務的容器
stages:
  - clone
  - build
  - run

clone-web_job:
  stage: clone
  only:
    - master
  script:
    #deploy是自定義的腳本位置在 gitlab-runner用戶目錄下
    #做用是將 param1分組下的param2項目的param3分支 clone到/data/wwwroot下
    - bash deploy wangpengyao dataforsea_bg master

docker-web_job:
  stage: build
  only:
    - master
  script:
    #source環境
    - source /etc/profile
    #切換到clone步驟的目錄
    - cd /data/wwwroot/master/wangpengyao/dataforsea_bg
    #中止並刪除目前正在運行的docker容器
    # && true=0 || false=1 用來防止 退出碼 致使 pipeline 終止
    - docker stop data-for-sea-bg && true=0 || false=1
    - docker rm data-for-sea-bg && true=0 || false=1
    #建立新的docker鏡像
    - docker build -t data-for-sea-bg .
    #刪除build鏡像過程當中可能產生的none鏡像
    - docker rmi $(docker images | grep "none" | awk '{print $3}') && true=0 || false=1

ops-web1_job:
  stage: run
  only:
    - master
  script:
    #運行鏡像
    #鏡像中的springboot服務端口和項目路徑在application.yml中定義
    #log輸出也能夠在application.yml指定到容器的/logs文件夾下 而後經過 -v綁定到宿主機便於查看
    #-p 宿主機端口:容器端口 -v 宿主機目錄:容器目錄 -d 後臺運行 --name 容器名稱 鏡像名稱
    # 提醒 :若是您的應用須要不少的文件交互 請注意合理使用-v綁定宿主機目錄
    - docker run -p 7071:7071 -v /data/wwwroot/logs/dataforsea_bg:/logs -d --name data-for-sea-bg data-for-sea-bg

  若是項目是Vue前端 可參照如下內容web

stages:
  - clone
  - build
  - run

clone-web_job:
  stage: clone
  only:
    - master
  script:
    - bash deploy wangpengyao dataforsea_vue master

docker-web_job:
  stage: build
  only:
    - master
  script:
    - source /etc/profile
    - cd /data/wwwroot/master/wangpengyao/dataforsea_vue
    - docker stop data-for-sea-vue && true=0 || false=1
    - docker rm data-for-sea-vue && true=0 || false=1
    - docker build -t data-for-sea-vue .
    - docker rmi $(docker images | grep "none" | awk '{print $3}') && true=0 || false=1

run-web_job:
  stage: run
  only:
    - master
  script:
    - docker run -p 3000:80 -d --name data-for-sea-vue data-for-sea-vue

4. 提交你的項目到到master分支,或者提交到本身的分支而後merge到masterspring

  系統配置的runner觸發條件是,當監聽到push或者merge到主分支版本時,進行pipline工做,只要你的代碼在本地mvn後能夠jar包運行,或者npm build 以後能夠正確的運行,那麼您的應用也就能在服務器上正確的部署運行。docker

您能夠從gitlab的下面的界面監管pipline的運行

image.png

  同時還能夠在這個網址管理本身的docker鏡像

  • 若是您的應用pipline失敗 或者部署後沒法從外網訪問,請經過pipline點擊具體流程查詢報錯,覈實是不是端口衝突
  • 部署後若是須要外網訪問 請聯繫wangpengyao@cnic.cn 進行端口開放
  • shipyard 提供鏡像下載功能,同時你們也能夠嘗試https://cr.console.aliyun.com/ 關聯gitlab的項目來構建本身的docker倉庫
  • 下面是第三步中使用的runner clone階段調用的deploy腳本內容,有興趣的同事能夠參考一下之後構建本身的git-runner時使用
if [ $# -ne 3 ]
then
      echo "arguments error!"
      exit 1
else
      deploy_path="/data/wwroot/$3/$1/$2"
      if [ ! -d "$deploy_path" ]
      then
          git clone "git@188.131.222.102:${1}/${2}.git" $deploy_path
          cd $deploy_path
          git checkout $3
      else
          cd $deploy_path
          git pull
      fi
fi
相關文章
相關標籤/搜索