工做中遇到項目搭建CI/CD基於Gtilab-runner + Docker ,同時部署了shipyard對Docker進行管理,開啓CI/CD的項目能夠實現,代碼提交後自動build docker鏡像,並生成相應的容器進行部署,能夠有效減小本地開發環境到測試環境的工做量。同時後期生產環境能夠直接採用容器部署,方便之後的運維。html
開啓CI/CD須要如下4步前端
1. 項目關聯gitlab-runnervue
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的運行
同時還能夠在這個網址管理本身的docker鏡像
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