自動化流程
企業里常見的項目自動化流程應該構建機從代碼倉拉取代碼進行構建,構建完成后會將產物推送到制品庫中,比如鏡像倉, 然后中間會有測試環境,用于進行自動化測試或人工測試,最后進行遠程部署。
項目結構
這里我們用的 Go 的項目結構,它大概的結構應該是下面這樣的:
|-- my-app
|-- .gitignore
|-- README.md
|-- LICENSE
|-- go.mod
|-- go.sum
|-- main.go
|-- pkg
|-- ...
項目構建
因為這里構建的是 Go 的項目,如果用到私有庫,在 go mod tidy 時會要求提供 Git 憑證,我們可以現在 Jenkins 的憑證管理中創建 Username with password 類型的憑證,其中 Username 就是 GitHub 的用戶名,password 則是 GitHub 的 AccessToken,這里主要用到的是 AccessToken,Username 其實并不需要。
但在 Jenkins Pipeline 中使用 usernamePassword 時要求同時定義用戶名變量名 usernameVariable 和 密碼變量名 passwordVariable 。
stage('Build') {
steps {
withCredentials(bindings: [
usernamePassword(credentialsId: 'GITHUB_CREDENTIAL', usernameVariable: 'GITHUB_USER', passwordVariable: 'GITHUB_ACCESS_TOKEN'
)
]) {
sh '''
git config --global url."https://${GITHUB_ACCESS_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"
go mod tidy
go build -o bin/my-app main.go
'''
}
}
}
遠程部署
在構建完成后,我們會將構建產物推送到制品庫,然后我們可以從制品庫中拉取構建產物進行部署測試環境并進行測試,在驗證通過后,會從制品庫中拉取驗證通過的產物進行部署上線。
但在本文中,我們的應用相對簡單,可以忽略推送產物到制品庫以及中間的測試驗證環節,目標是實現構建后立即部署上線。
一般來說,線上環境和構建環境不會是同一臺機器,所以這個時候我們需要將構建產物復制到另一臺服務器上,然后在另一臺服務器上進行部署。
由于需要對另一臺服務器進行操作,所以我們需要在 Jenkins 上配置 DEPLOY_HOST、DEPLOY_PORT 和 SSH_CREDENTIAL 三個憑證,其中 DEPLOY_HOST 和 DEPLOY_PORT 是 Secret text 類型的憑證,SSH_CREDENTIAL 是 SSH Username with private key 類型的憑證。
stage('Deploy') {
environment {
DEPLOY_HOST = credentials('DEPLOY_HOST')
DEPLOY_PORT = credentials('DEPLOY_PORT')
}
steps {
withCredentials([
sshUserPrivateKey(credentialsId: 'SSH_CREDENTIAL', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USERNAME'),
]) {
sh """
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
cat {SSH_KEY}>~/.ssh/id_rsa && chmod 400 ~/.ssh/id_rsa
scp -P{DEPLOY_PORT} bin/my-app {SSH_USER}@{DEPLOY_HOST}:/data/my-app
ssh -p {DEPLOY_PORT}{SSH_USER}@${DEPLOY_HOST} \"nohup /data/my-app >> /data/my-app.log 2>&1 &\"
"""
}
}
}
部署的步驟主要包括:
- 復制構建產物到部署服務器
-
在部署服務器上執行部署命令,比如 nohup /data/my-app >> /data/my-app.log 2>&1 &
其中簡化了一些細節,比如在部署前,我們需要先備份數據。所以這里我們可以寫一個復雜的部署腳本 deploy.sh 放在項目中,然后在 Jenkins Pipeline 中使用 scp 將部署腳本文件復制到部署服務器,假設放在 /data/deploy.sh,最后只需 ssh -p ${DEPLOY_PORT} {DEPLOY_HOST} /bin/bash /data/deploy.sh 即可。
完整的 Jenkins Pipeline
pipeline {
agent {
docker {
image 'golang:1.15-alpine'
args '-v /data/my-app-cache:/go/.cache'
}
}
options {
timeout(time: 20, unit: 'MINUTES')
disableConcurrentBuilds()
}
stages {
stage('Build') {
steps {
withCredentials(bindings: [
usernamePassword(credentialsId: 'GITHUB_CREDENTIAL', usernameVariable: 'GITHUB_USER', passwordVariable: 'GITHUB_ACCESS_TOKEN'
)
]) {
sh '''
git config --global url."https://{GITHUB_ACCESS_TOKEN}:x-oauth-basic@github.com/".insteadOf "https://github.com/"
go mod tidy
go build -o bin/my-app main.go
'''
}
}
}
stage('Deploy') {
environment {
DEPLOY_HOST = credentials('DEPLOY_HOST')
DEPLOY_PORT = credentials('DEPLOY_PORT')
}
steps {
withCredentials([
sshUserPrivateKey(credentialsId: 'SSH_CREDENTIAL', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USERNAME'),
]) {
sh """
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo 'StrictHostKeyChecking no' >> /etc/ssh/ssh_config
cat{SSH_KEY} > ~/.ssh/id_rsa && chmod 400 ~/.ssh/id_rsa
scp -P {DEPLOY_PORT} bin/my-app{SSH_USER}@{DEPLOY_HOST}:/data/my-app
ssh -p{DEPLOY_PORT} {SSH_USER}@{DEPLOY_HOST} \"nohup /data/my-app >> /data/my-app.log 2>&1 &\"
"""
}
}
}
}
}
原文鏈接:https://juejin.cn/post/6969968007690846238
(版權歸原作者所有,侵刪)
本文鏈接:http://www.avtobanya.com/40156.html
網友評論comments