iT邦幫忙

2022 iThome 鐵人賽

DAY 7
0
DevOps

IoT Cloud Computing on robotic vehicle系列 第 7

[前置]Jenkins connect with Docker Image

  • 分享至 

  • xImage
  •  

關於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,
https://ithelp.ithome.com.tw/upload/images/20220913/20005722nOfCKXl8w9.png
然後選擇build with parametes,就會看到以下的介面。
https://ithelp.ithome.com.tw/upload/images/20220913/200057220Jegd9HpTq.png
這樣變數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為default
kubectl config set-context --current --namespace=default

取得namespace default中的pods list
kubectl get pods

更換已經部署上的deployment中的image
kubectl 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。


上一篇
[前置]Gitlab+Jenkins for CI
下一篇
[前置]Jenkins with Kubernetes + ArgoCD for CD
系列文
IoT Cloud Computing on robotic vehicle30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言