關於CD(Continuous Delivery or Deployment)我們有更多需要注意的地方。
之前的章節我們提及如何透過Jenkins中的plugin-Docker Pipeline,去連接雲端私有的Docker Image Registry。
這些除了透過從git到Jenkins pipeline的觸發,取得的event push和tag外,我們還可以自己手動去執行build code與docker image的程序。
這裡我說明我們是如何去做到docker image的版本控制。
之前章節提到plugin-Generic Webhook Trigger,藉由這個工具可以我們可以取得,用戶從gitlab所下的tag的number版號。
triggers {
GenericTrigger(
genericVariables: [
[
key: 'version',
value: '$.ref',
expressionType: 'JSONPath'
]
],
causeString: 'ref_tag pushed ref $version',
token: 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
printContributedVariables: true,
printPostContent: true
)
}
這個值會儲存在變數version。但同樣我們也需要能夠手動去執行pipeline,所以會在介面上設定一個string parameter,
然後選擇build with parametes,就會看到以下的介面。
這樣變數version就同時擁有手動與自動從gitlab trigger的兩種可能設定。
在pipeline中以${version}這樣的方式使用即可。(在shell script以$version方式使用)docker build --tag image-name:$version .
確定build好版本,將image upload到雲端的私有registry後,才能手動執行正式區的build code與deployment。
接著說明Jenkins如何連接到Kubernetes,這邊以AWS的EKS(Amazon Elastic Kubernetes Service)為例。看一下以下pipeline script:
withAWS(credentials:'eks-admin-credential') {
sh 'curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"'
sh 'unzip -o awscliv2.zip'
sh './aws/install --update'
sh 'aws eks --region xxxx-xxx update-kubeconfig --name XXXXX'
sh 'kubectl config set-context --current --namespace=default'
sh "kubectl set image deployment image-name registry-name=${registry}/registry-name:${version} --record"
sh 'kubectl rollout status deployment mlgame-desktop'
}
其中withAWS是使用Pipeline: AWS Steps這個plugin,來做AWS用戶的認證。
然後因為Jenkins提供多個主機串連起來,協助執行pipeline的機制。因此要在pipeline中設定下載awscli的程式,確保指定的node(主機)可以順利執行aws cli的commands。
接著透過aws eks指令aws eks --region xxxx-xxx update-kubeconfig --name XXXXX
將主機的環境設定成可以透過kubectl控制其kubernetes中的任何元件。
比如設定預設namespace為defaultkubectl config set-context --current --namespace=default
取得namespace default中的pods listkubectl get pods
更換已經部署上的deployment中的imagekubectl set image deployment image-name registry-name=${registry}/registry-name:${version} --record
如果是第一次部署則使用apply,並給予初始的yaml檔案kubectl apply -f image-name-deployment.yaml
後來理解到應該使用像ArgoCD的deployment工具,來間接操作Kubernetes Cluster會比較安全,而不是讓Jenkins直接使用kubectl操作K8S。