Gitlab+Jenkins+Docker+K8S實現CI/CD
使用Docker安裝GitLab及Jenkins
下載安裝gitlab鏡像
# 下載gitlab鏡像文件 $ docker pull gitlab/gitlab-ce:latest # 啟動gitlab $ docker run -d \ --hostname HOST_NAME \ -p 9443:443 -p 9080:80 -p 2222:22 \ --name gitlab \ -v PATH/config:/etc/gitlab \ -v PATH/logs:/var/log/gitlab \ -v PATH/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest # 修改PATH/config/gitlab.rb $ cat PATH/config/gitlab.rb gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 重啟gitlab容器 $ docker stop gitlab $ docker rm gitlab $ docker run -d \ --hostname HOST_NAME \ -p 9443:443 -p 9080:80 -p 2222:22 \ --name gitlab \ -v PATH/config:/etc/gitlab \ -v PATH/logs:/var/log/gitlab \ -v PATH/data:/var/opt/gitlab \ gitlab/gitlab-ce:latest
下載安裝Jenkins
# 下載jenkins鏡像 $ docker pull jenkins # 啟動jenkins $ docker run -d \ -p 8080:8080 \ -p 50000:50000 \ -v PATH/jenkins-data:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ --name jenkins \ jenkins:latest
Jenkins安全設置
1. 點擊“系統管理” - 進入“全局安全配置” 2. 在“訪問控制”-“授權策略”-“登錄用戶可以做任何事”中勾選上“匿名用戶具有可讀權限” 3. 去掉"CSRF Protection"中的"防止跨站點請求偽造"
gitlab添加jenkins服務器及git服務器SSH KEYS
jenkins編寫流水線腳本
# 構建流水線腳本 #!groovy pipeline { agent any environment { REPOSITORY="ssh://git@gitlab.hadeian.com:2222/hadeian/microservice.git" MODULE="user-edge-service" SCRIPT_PATH="~/scripts" } stages { stage('獲取代碼') { steps { echo "start fetch from git:${REPOSITORY}" deleteDir() git "${REPOSITORY}" } } stage('編譯+單元測試') { steps { echo "start compile" sh "mvn -U -pl ${MODULE} -am clean package" } } stage('構建鏡像') { steps { echo "start build image" sh "${SCRIPT_PATH}/build-image.sh ${MODULE}" } } stage('發布服務') { steps { echo "start deploy" sh "${SCRIPT_PATH}/deploy.sh user-edge-service ${MODULE}" } } } }
遠程執行編譯腳本 $ cat build-image.sh #!/bin/bash MODULE=$1 TIME=`date "+%Y%m%d%H%M"` GIT_VERSION=`git log -1 --pretty=format:"%h"` IMAGE_NAME=DOCKER_REGISTRY/PRODUCT_NAME/${MODULE}:${TIME}_${GIT_VERSION} cd ${MODULE} docker build -t ${IMAGE_NAME} . cd - docker push ${IMAGE_NAME} echo "${IMAGE_NAME}" > IMAGE_NAME # 編寫K8S更新服務腳本 $ cat deploy.sh #!/bin/bash IMAGE=`cat IMAGE_NAME` DEPLOYMENT=$1 MODULE=$2 kubectl set image deployment/${DEPLOYMENT} ${MODULE}=${IMAGE}