<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Jenkins 流水線自動(dòng)化部署 Go 項(xiàng)目

          共 4873字,需瀏覽 10分鐘

           ·

          2021-07-14 20:28

          原文鏈接:https://juejin.cn/post/6969968007690846238


          自動(dòng)化流程

          企業(yè)里常見的項(xiàng)目自動(dòng)化流程應(yīng)該構(gòu)建機(jī)從代碼倉(cāng)拉取代碼進(jìn)行構(gòu)建,構(gòu)建完成后會(huì)將產(chǎn)物推送到制品庫(kù)中,比如鏡像倉(cāng), 然后中間會(huì)有測(cè)試環(huán)境,用于進(jìn)行自動(dòng)化測(cè)試或人工測(cè)試,最后進(jìn)行遠(yuǎn)程部署。

          項(xiàng)目結(jié)構(gòu)

          這里我們用的 Go 的項(xiàng)目結(jié)構(gòu),它大概的結(jié)構(gòu)應(yīng)該是下面這樣的:
          |-- my-app    |-- .gitignore    |-- README.md    |-- LICENSE    |-- go.mod    |-- go.sum    |-- main.go    |-- pkg        |-- ...

          項(xiàng)目構(gòu)建

          因?yàn)檫@里構(gòu)建的是 Go 的項(xiàng)目,如果用到私有庫(kù),在 go mod tidy 時(shí)會(huì)要求提供 Git 憑證,我們可以現(xiàn)在 Jenkins 的憑證管理中創(chuàng)建 Username with password 類型的憑證,其中 Username 就是 GitHub 的用戶名,password 則是 GitHub 的 AccessToken,這里主要用到的是 AccessToken,Username 其實(shí)并不需要。
          但在 Jenkins Pipeline 中使用 usernamePassword 時(shí)要求同時(shí)定義用戶名變量名 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}:[email protected]/".insteadOf "https://github.com/"
          go mod tidy go build -o bin/my-app main.go ''' } }}

          遠(yuǎn)程部署

          在構(gòu)建完成后,我們會(huì)將構(gòu)建產(chǎn)物推送到制品庫(kù),然后我們可以從制品庫(kù)中拉取構(gòu)建產(chǎn)物進(jìn)行部署測(cè)試環(huán)境并進(jìn)行測(cè)試,在驗(yàn)證通過后,會(huì)從制品庫(kù)中拉取驗(yàn)證通過的產(chǎn)物進(jìn)行部署上線。
          但在本文中,我們的應(yīng)用相對(duì)簡(jiǎn)單,可以忽略推送產(chǎn)物到制品庫(kù)以及中間的測(cè)試驗(yàn)證環(huán)節(jié),目標(biāo)是實(shí)現(xiàn)構(gòu)建后立即部署上線。
          一般來(lái)說,線上環(huán)境和構(gòu)建環(huán)境不會(huì)是同一臺(tái)機(jī)器,所以這個(gè)時(shí)候我們需要將構(gòu)建產(chǎn)物復(fù)制到另一臺(tái)服務(wù)器上,然后在另一臺(tái)服務(wù)器上進(jìn)行部署。
          由于需要對(duì)另一臺(tái)服務(wù)器進(jìn)行操作,所以我們需要在 Jenkins 上配置 DEPLOY_HOST、DEPLOY_PORT 和 SSH_CREDENTIAL 三個(gè)憑證,其中 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 &\" """ } }}


          部署的步驟主要包括:
          1. 復(fù)制構(gòu)建產(chǎn)物到部署服務(wù)器
          2. 在部署服務(wù)器上執(zhí)行部署命令,比如 nohup /data/my-app >> /data/my-app.log 2>&1 &

          其中簡(jiǎn)化了一些細(xì)節(jié),比如在部署前,我們需要先備份數(shù)據(jù)。所以這里我們可以寫一個(gè)復(fù)雜的部署腳本 deploy.sh 放在項(xiàng)目中,然后在 Jenkins Pipeline 中使用 scp 將部署腳本文件復(fù)制到部署服務(wù)器,假設(shè)放在 /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}:[email protected]/".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 &\" """ } } } }}

          - END -

           推薦閱讀 

          最新Kubernetes實(shí)戰(zhàn)指南:從零到架構(gòu)師的進(jìn)階之路 
          互聯(lián)網(wǎng)公司招聘運(yùn)維工程師【內(nèi)推】,7月
          從18年公司基礎(chǔ)架構(gòu)開始轉(zhuǎn)向 Kubernetes
          使用Go語(yǔ)言,25秒讀取16GB文件
          企業(yè)級(jí)日志平臺(tái)新秀Graylog,比ELK輕量~
          下一代Docker鏡像構(gòu)建神器 BuildKit
          面試數(shù)十家Linux運(yùn)維工程師,總結(jié)了這些面試題(含答案)
          七年老運(yùn)維實(shí)戰(zhàn)中的 Shell 開發(fā)經(jīng)驗(yàn)總結(jié)
          運(yùn)維的工作邊界,這次真的搞明白了!
          搭建一套完整的企業(yè)級(jí) K8s 集群(v1.20,二進(jìn)制方式)
          12年資深運(yùn)維老司機(jī)的成長(zhǎng)感悟



          點(diǎn)亮,服務(wù)器三年不宕機(jī)

          瀏覽 55
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  www.豆花豆花视频网站 | www,污网站 | 日韩素人 的搜索结果 - 91n | 色中色天堂老色批视频 | 麻豆午夜成人无码电影 |