iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0

昨天我們建立好了 Pipeline,並且以手動的方式觸發構建,讓 Jenkins 可以拉取程式碼,並打包為 Image 傳送到 Harbor 內部,完成了 Integration & Delivery;今天,讓我們完成最後的部署,以及設定 Webhook,讓 Gitlab Repository 更新時自動通知 Jenkins 來執行 Pipeline 吧!

Publish Over SSH

Day19 的時候,我們完成了 Image 推送到 Harbor,並且以 Putty 遠端連線到 192.168.1.188 的 SIT 機器,手動拉取 Image 並啟動 Container;而現在我們要交由 Jenkins 為我們完成這些步驟。

首先,我們要到 管理 Jenkins 的 Plugin Manager 搜尋並安裝 Publish Over SSH 這個 Plugin

使用 Publish Over SSH 能夠用兩種方法,第一種是創建與配置公鑰與私鑰,第二種則是將 SIT 機器的 User 帳號密碼存在 Jenkins 內在要遠端登入時使用。本次將會以第二種方法展示,若有網域與憑證的話也能夠使用第一種方式。

我們到 管理 JenkinsSystem Configuration 中,在最下方的設置可以看到 Publish over SSH,點選新增後,我們來逐一填上需要的配置:

  • SSH Server Name: 為要連線的 Server 命名,這裡命名為 SIT188
  • Hostname: 為要連線的 Server 的 IP 地址,這裡輸入 192.168.1.188
  • Username: Server 的使用者名稱
  • Check box 勾選 Use password authentication, or use a different key
  • Passphrase / Password: Server 的使用者之密碼

配置好後,可以點選 Test Configuration 來連線測試,記得 192.168.1.188 那台要先開機...不然就會和我一樣尷尬了 10 幾分鐘。

再來,我們就可以遠端連線過去執行指令了,然而指令我們其實會先寫好,並放置在 SIT188 機器內,在執行 Pipeline 時僅遠端過去執行腳本,這裡我們為 cct-java 的 Jenkinsfile 多增加一個 Stage:

stage('遠端連線與部署') {
	steps {		
		sshPublisher(
			publishers: [
				sshPublisherDesc(
					configName: 'SIT188',
					transfers: [
						sshTransfer(
							cleanRemote: false, 
							excludes: '', 
							execCommand: '/opt/jenkins_shell/deploy_cct_java.sh', 
							execTimeout: 120000, 
							flatten: false, 
							makeEmptyDirs: false, 
							noDefaultExcludes: false, 
							patternSeparator: '[, ]+', 
							remoteDirectory: '/opt/jenkins_shell', 
							remoteDirectorySDF: false, removePrefix: '', 
							sourceFiles: 'deploy_cct_java.sh'
							)
			            ], 
			         usePromotionTimestamp: false, 
			         useWorkspaceInPromotion: false, verbose: true
				)
			]
		)
	}
}

上面指定了 SIT188 機器,並且在 execCommand 內說明要到 /opt/jenkins_shell 內執行 deploy_cct_java.sh 腳本。

而腳本概念上要完成幾個內容:

  1. 先關閉部署中的 container,並刪除 conatiner 與 Image
  2. 登入 Harbor
  3. 下載 Image
  4. 啟動 container

而 Shell 腳本內部由於會寫入 Harbor 的帳號密碼,因此我們在寫完後會將它加密。

deploy_cct_java.sh

#!/bin/sh

#關閉部署中的 container 並刪除 conatiner 與 Image

containerId=`sudo docker ps -a | grep -w 192.168.1.120:9001/cct-java/cct-back:0.0.2 | awk '{print$1}'`

echo '$containerId'

if [ "$containerId" != "" ] ; then
	sudo docker stop $containerId
	sudo docker rm $containerId
fi

imageId=`sudo docker images | grep -w 192.168.1.120:9001/cct-java/cct-back | awk '{print $3}'`

echo '$imageId'
	
if [ "$imageId" != "" ] ; then
	sudo docker rmi $imageId
fi	

#登入並下載新的 Image 與 部署 Container
sudo docker login -u user -p password http://192.168.1.120:9001
sudo docker pull 192.168.1.120:9001/cct-java/cct-back:0.0.2
sudo docker run -p 8081:8081 -d 192.168.1.120:9001/cct-java/cct-back:0.0.2

下一步,我們利用 shc 加密 shell 腳本,在 Ubuntu 上需要先安裝:

sudo add-apt-repository ppa:neurobin/ppa
sudo apt-get update
sudo apt-get install shc
sudo apt-get install gcc

deploy_cct_java.sh 加密

sudo mv deploy_cct_java.sh temp.sh
sudo shc -f temp.sh -o deploy_cct_java.sh

完成後,可以將有明文的 temp.sh 刪除,而 deploy_cct_java.sh 則是加密的檔案,可輸入 ./deploy_cct_java.sh 測試是否執行。

接著,我們再到 Jenkins 內手動觸發建置,即可看到被遠端觸發了。

https://ithelp.ithome.com.tw/upload/images/20221010/201328782bJxVPfDcv.png

今日結語

今天,我們完成了遠端的部署,也將開發用的電腦、DevOps 機與 SIT 機串聯再一起了,明天,我們就來建置 Webhook,讓推送原始碼時自動觸發,並且也將前端做完相同的配置,最後為 CI/CD 的建構下一個總結。


上一篇
Day23: Jenkins Pipeline 構建,Gitlab & Harbor 串接
下一篇
Day25: Gitlab 搭建 & Webhook 設置,CI/CD 總結
系列文
一個人也能 DevOps ? 用 Angular + Spring Boot 演示專案由開發到部署30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言