#項目發布方案
藍綠發布
灰度發布
滾動發布
#k8s默認發布策略
1個deployment
2個 replicasset?
進行一對一的更新 更新一個 刪除一個 直到pod更新完畢
server 通過標簽去關聯replicasset
#發布流程設計
1. 項目文檔
2. 項目業務現狀
3. 項目的實施(測試環境 遷移到線上) (思考 遷移過去失敗了怎么辦 或者是遷移過去一段時間 失敗了怎么辦? 能不能快速定位問題 快速恢復)
4. 應急預案
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創建的job需要發布一個java項目?
1. JDK
2. maven
3. git
4. tomcat
job: 代碼編譯(maven) 構建鏡像(docker) 拉取代碼(git)
#部署項目到k8s中的參數構建怎么配置?
1. 分支
2. 命名空間
3. pod分別數
#k8s-secret docker倉庫認證
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"
// 項目
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"
// 認證
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: '選擇發布的分支', name: 'Branch', quickFilterEnabled: false, selectedValue: 'NONE', sortMode: 'NONE', tagFilter: '*', type: 'PT_BRANCH'
? ? ? ? choice (choices: ['1', '3', '5', '7'], description: '副本數', 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('構建鏡像'){
? ? ? ? ? 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平臺'){
? ? ? ? ? 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. 怎么讓持續部署插件讀到yaml文件
yaml進行代碼統一版本管理
2. 怎么和參數化構建集合
提供sed進行修改yaml的值
#使用jenkins的插件
git
kubernetes
pipeline
kubernetes continuous deploy
#CI/CD環境特點
slave彈性
基于鏡像隔離構建環境
流水線發布容易維護
jenkins參數化構建可幫助完成更復雜的構建
小結:
0. 涉及的所以插件都需要安裝
1. 修改環境變量的值
2. 參數化構建的名稱就是變量可以在任何地方使用
3. 拉取的代碼是提供git參數化構建動態獲取分支
4. 一些認證信息都是保存到 jenkins認證里面 pipeline通過憑據ID獲取
5. pipeline大多數代碼片段都可以動態去生成
kuberctl rollback deployment 回滾方式