整個 CICD 流程大致如下:
這里 jenkins/gitlab/harbor 都是現成的哈,主要記錄一下集成過程和其中遇到的問題。
1、創建一個流水線任務
2、填寫項目描述
3、編寫 pipeline 腳本和其中調用的 shell 腳本
pipeline {
agent any
environment {
REPOSITORY="http://172.20.2.144/cloudpath/iam/cloudpath-iam.git"
MODULE="iam-admin"
ENVRMT="dev"
NAMESPACE="cloudpath-$ENVRMT"
KIND="deployment"
SCRIPT_PATH="/home/jenkins/scripts"
}
stages {
stage('拉取代碼') {
steps {
echo "start fetch code from git:${REPOSITORY}"
deleteDir()
script {
checkout([$class: 'GitSCM', branches: [[name: "$ENVRMT"]], userRemoteConfigs: [[credentialsId: '3f308c08-a313-415e-9eb9-0225ee07829e', url: "$REPOSITORY"]]])
}
}
}
stage('代碼靜態檢查') {
steps {
echo "start code check"
}
}
stage('編譯+單元測試') {
steps {
echo "start compile"
sh "source /etc/profile && cd $MODULE && mvn clean install package -U -Dmaven.test.skip=true"
}
}
stage('構建上傳鏡像') {
steps {
echo "start build image"
sh "${SCRIPT_PATH}/build_image.sh $MODULE $NAMESPACE"
}
}
stage('發布到K8S') {
steps {
echo "start deploy"
sh "${SCRIPT_PATH}/deploy.sh $NAMESPACE $KIND $MODULE $MODULE "
}
}
}
}
#!/usr/bin/env bash
MODULE=$1
PROJECT=$2
TIME=$(date +%Y%m%d%H%M)
GIT_VERISON=$(git log -1 --pretty=format:"%h")
IMAGE_NAME=172.20.31.131/${PROJECT}/${MODULE}:${TIME}_${GIT_VERISON}
docker login http://172.20.31.131 -u yunjing -p 123456Qq
cd ${MODULE}
docker build -t ${IMAGE_NAME} .
cd -
docker push ${IMAGE_NAME}
echo ${IMAGE_NAME} > IMAGE_NAME
#!/usr/bin/env bash
IMAGE=$(cat IMAGE_NAME)
NAMESPACE=$1
KIND=$2
NAME=$3
MODULE=$4
echo "update image to ${IMAGE}"
kubectl --kubeconfig /home/jenkins/scripts/config -n ${NAMESPACE} set image ${KIND} ${NAME} ${MODULE}=${IMAGE}
完成后效果如下:
以下是遇到的問題:
1、在 pipeline 中,拉取代碼時如何指定分支
2、拉取代碼時如何指定賬號登錄信息
3、編譯代碼時找不到 mvn/java/javac
添加 source /etc/profile
4、編譯時沒有權限創建拉取的 jar 包存放目錄
修改倉庫目錄權限
cd /home/.m2/
chown jenkins.jenkins -R repository
5、沒有權限訪問自定義的 shell 腳本
修改腳本目錄權限
cd /home/jenkins/
chown jenkins.jenkins -R scripts
6、沒有權限訪問 /var/run/docker.sock
修改 sock 文件的權限
chmod 777 /var/run/docker.sock
7、在腳本中區分項目和不同環境
8、在構建腳本中創建的鏡像名稱變量如何傳遞給另一個發布腳本
a. 在構建腳本中將鏡像名稱保存到一個文件
b. 在發布腳本中通過讀該文件來獲取鏡像名稱
9、需要在 jenkins 節點上安裝 kubectl
10、需要把 admin.conf 文件 copy 到 jenkins 節點上,通過 kubectl 遠程訪問 k8s 集群
參考:
https://www.cnblogs.com/hellxz/p/pipeline_pull_project.html
https://www.cnblogs.com/shengulong/p/11220410.html
https://www.cnblogs.com/Dev0ps/p/10502803.html
http://www.louzhutie.cn/?articles/754083
https://github.com/KeithTt/microservice