#項(xiàng)目發(fā)布方案
藍(lán)綠發(fā)布
灰度發(fā)布
滾動(dòng)發(fā)布
#k8s默認(rèn)發(fā)布策略
1個(gè)deployment
2個(gè) replicasset?
進(jìn)行一對(duì)一的更新 更新一個(gè) 刪除一個(gè) 直到pod更新完畢
server 通過標(biāo)簽去關(guān)聯(lián)replicasset
#發(fā)布流程設(shè)計(jì)
1. 項(xiàng)目文檔
2. 項(xiàng)目業(yè)務(wù)現(xiàn)狀
3. 項(xiàng)目的實(shí)施(測(cè)試環(huán)境 遷移到線上) (思考 遷移過去失敗了怎么辦 或者是遷移過去一段時(shí)間 失敗了怎么辦? 能不能快速定位問題 快速恢復(fù))
4. 應(yīng)急預(yù)案
sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && \
sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
jenkins創(chuàng)建的job需要發(fā)布一個(gè)java項(xiàng)目?
1. JDK
2. maven
3. git
4. tomcat
job: 代碼編譯(maven) 構(gòu)建鏡像(docker) 拉取代碼(git)
#部署項(xiàng)目到k8s中的參數(shù)構(gòu)建怎么配置?
1. 分支
2. 命名空間
3. pod分別數(shù)
#k8s-secret docker倉(cāng)庫(kù)認(rèn)證
kubectl create secret docker-registry? registry-pull-secret --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.10.23
============================================================
// 所需插件: Git Parameter/Git/Pipeline/kubernetes/Kubernetes Continuous Deploy
// 公共
def registry = "192.168.10.23"
// 項(xiàng)目
def project = "dev"
def app_name = "java-demo"
def image_name = "${registry}/${project}/${app_name}:${BUILD_NUMBER}"
def git_address = "http://106.13.186.245:5555/root/java-demo.git"
// 認(rèn)證
def secret_name = "registry-pull-secret"
def docker_registry_auth = "60946d6a-2259-4254-8f2c-108f7efdad8e"
def git_auth = "caf3e55d-0f12-4b03-a1bb-1b6ec2c2e189"
def k8s_auth = "de7eb761-d6d5-4692-b14f-c5ab13b10158"
pipeline {
? agent {
? ? kubernetes {
? ? ? ? label "jenkins-slave"
? ? ? ? yaml """
kind: Pod
metadata:
? name: jenkins-slave
spec:
? containers:
? - name: jnlp
? ? image: "${registry}/library/jenkins-slave-jdk:1.8"
? ? imagePullPolicy: Always
? ? volumeMounts:
? ? ? - name: docker-cmd
? ? ? ? mountPath: /usr/bin/docker
? ? ? - name: docker-sock
? ? ? ? mountPath: /var/run/docker.sock
? ? ? - name: maven-cache
? ? ? ? mountPath: /root/.m2
? volumes:
? ? - name: docker-cmd
? ? ? hostPath:
? ? ? ? path: /usr/bin/docker
? ? - name: docker-sock
? ? ? hostPath:
? ? ? ? path: /var/run/docker.sock
? ? - name: maven-cache
? ? ? hostPath:
? ? ? ? path: /tmp/m2
"""
? ? ? ? }
? ? ? }
? ? parameters {? ?
? ? ? ? gitParameter branch: '', branchFilter: '.*', defaultValue: 'master', description: '選擇發(fā)布的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
? ? ? ? choice (choices: ['1', '3', '5', '7'], description: '副本數(shù)', name: 'ReplicaCount')
? ? ? ? choice (choices: ['dev','test','prod'], description: '命名空間', name: 'Namespace')
? ? }
? ? stages {
? ? ? ? stage('拉取代碼'){
? ? ? ? ? ? steps {
? ? ? ? ? ? ? ? checkout([$class: 'GitSCM',
? ? ? ? ? ? ? ? branches: [[name: "${params.Branch}"]],
? ? ? ? ? ? ? ? doGenerateSubmoduleConfigurations: false,
? ? ? ? ? ? ? ? extensions: [], submoduleCfg: [],
? ? ? ? ? ? ? ? userRemoteConfigs: [[credentialsId: "${git_auth}", url: "${git_address}"]]
? ? ? ? ? ? ? ? ])
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? stage('代碼編譯'){
? ? ? ? ? steps {
? ? ? ? ? ? sh """
? ? ? ? ? ? ? ? mvn clean package -Dmaven.test.skip=true
? ? ? ? ? ? ? ? """
? ? ? ? ? }
? ? ? ? }
? ? ? ? stage('構(gòu)建鏡像'){
? ? ? ? ? steps {
? ? ? ? ? ? ? ? withCredentials([usernamePassword(credentialsId: "${docker_registry_auth}", passwordVariable: 'password', usernameVariable: 'username')]) {
? ? ? ? ? ? ? ? sh """
? ? ? ? ? ? ? ? ? echo '
? ? ? ? ? ? ? ? ? ? FROM ${registry}/library/tomcat:v1
? ? ? ? ? ? ? ? ? ? LABEL maitainer lizhenliang
? ? ? ? ? ? ? ? ? ? RUN rm -rf /usr/local/tomcat/webapps/*
? ? ? ? ? ? ? ? ? ? ADD target/*.war /usr/local/tomcat/webapps/ROOT.war
? ? ? ? ? ? ? ? ? ' > Dockerfile
? ? ? ? ? ? ? ? ? docker build -t ${image_name} .
? ? ? ? ? ? ? ? ? docker login -u ${username} -p '${password}' ${registry}
? ? ? ? ? ? ? ? ? docker push ${image_name}
? ? ? ? ? ? ? ? """
? ? ? ? ? ? ? ? }
? ? ? ? ? }
? ? ? ? }
? ? ? stage('部署到K8S平臺(tái)'){
? ? ? ? ? steps {
? ? ? ? ? ? sh """
? ? ? ? ? ? sed -i 's#IMAGE_NAME#${image_name}#' deploy.yaml
? ? ? ? ? ? sed -i 's#SECRET_NAME#${image_name}#' deploy.yaml
#sed -i 's#SECRET_NAME#${secret_name}#' deploy.yaml
sed -i 's#RSCOUNT#${ReplicaCount}#' deploy.yaml
sed -i 's#NS#${Namespace}#' deploy.yaml
? ? ? ? ? ? """
? ? ? ? ? ? kubernetesDeploy configs: 'deploy.yaml', kubeconfigId: "${k8s_auth}"
? ? ? ? ? }
? ? ? ? }
? ? }
}
======================================================================
1. 怎么讓持續(xù)部署插件讀到y(tǒng)aml文件
yaml進(jìn)行代碼統(tǒng)一版本管理
2. 怎么和參數(shù)化構(gòu)建集合
提供sed進(jìn)行修改yaml的值
#使用jenkins的插件
git
kubernetes
pipeline
kubernetes continuous deploy
#CI/CD環(huán)境特點(diǎn)
slave彈性
基于鏡像隔離構(gòu)建環(huán)境
流水線發(fā)布容易維護(hù)
jenkins參數(shù)化構(gòu)建可幫助完成更復(fù)雜的構(gòu)建
小結(jié):
0. 涉及的所以插件都需要安裝
1. 修改環(huán)境變量的值
2. 參數(shù)化構(gòu)建的名稱就是變量可以在任何地方使用
3. 拉取的代碼是提供git參數(shù)化構(gòu)建動(dòng)態(tài)獲取分支
4. 一些認(rèn)證信息都是保存到 jenkins認(rèn)證里面 pipeline通過憑據(jù)ID獲取
5. pipeline大多數(shù)代碼片段都可以動(dòng)態(tài)去生成
kuberctl rollback deployment 回滾方式