iT邦幫忙

2022 iThome 鐵人賽

DAY 15
1
DevOps

不想吃土嗎?就利用開源軟體打造CICD Pipeline吧!系列 第 15

Day 15: 封裝上傳自動化!Jenkins到Nexus的輸送鏈!

  • 分享至 

  • xImage
  •  

昨天我們成功安裝好Nexus,亦成功把封裝好的NodeJS程序上傳到Nexus中。今天就讓我們一起把整個流程自動化運作起來吧!

加入Credential

為了讓Jenkins連接Nexus,我們需要為Nexus加入一個Credential作為認證。首先到Jenkins的設定頁面,然後按下Manage Credentials
https://ithelp.ithome.com.tw/upload/images/20220927/201520120sZt1RuCM7.png

然後在Stores scoped to Jenkins下面的列表中,按下Jenkins那一行Domains列的(global)連結。
https://ithelp.ithome.com.tw/upload/images/20220927/20152012NsdXZvwYzY.png

然後在左邊的選單中按下Add Credentials
https://ithelp.ithome.com.tw/upload/images/20220927/20152012QKdz15PPZP.png

然後輸入Nexus的登入帳號及密碼,然後在ID一欄填入nexus-user方便辨認。然後按Create
https://ithelp.ithome.com.tw/upload/images/20220927/20152012HJSWeC3yL1.png

完成後會看見列表中增加了一個新的Credential
https://ithelp.ithome.com.tw/upload/images/20220927/201520121jeXsWPK4W.png

更新Jenkinsfile

設定好Nexus的連接後,我們可以開始利用Jenkins去自動化封裝及上傳流程了。

首先,我們先為這個封裝上傳加入一個新的Stage。在上一個章節的Dependency Track的Stage的Block下方加入以下內容。

       stage('Nexus Publisher') {
            steps {

            }
        }

正常情況下,當我們要推送套件到Nexus中,我們要先運行npm adduser去登入服務。但當我們進行自動化流程時,這個步驟就會阻礙我們進行自動化。因此我們需要以另外一種方式為NPM加入認證設定。

為了幫NPM加入認證。在steps{…}的Block中引用上一部份加入的Credential,變為以下的內容。

       stage('Nexus Publisher') {
            steps {
                    withCredentials([usernamePassword(credentialsId: 'nexus-user', usernameVariable: 'NEXUS_USER', passwordVariable: 'NEXUS_PSWD')]) {
                }
            }
        }
  • credentialsID: 使用我們新增的Credential nexus-user
  • usernameVariable: 利用NEXUS_USER作為變數儲存Nexus的用戶名稱
  • passwordVariable: 利用NEXUS_PSWD作為變數儲存Nexus的用戶密碼

然後,我們使用認證的資料儲存為.npmrc去讓NPM存取Nexus。為withCredentails(…){…}加入以下內容。

                        script{
                            def nexusAuth = sh(returnStdout: true, script: "echo -n '${NEXUS_USER}:${NEXUS_PSWD}' | openssl base64").trim()
                            echo "nexusAuth =  ${nexusAuth}"
                            sh "echo 'always-auth=true\n_auth=${nexusAuth}\n' > .npmrc"
                        }

這裡我們使用了openssl base64把登入資料轉化為一條認證Token。然後把認證資料輸出到.npmrc的檔案中。

最後,在這裡下方加入以下內容,去把NodeJS的套件推送到我們的Nexus中。

                            echo "Publish Artifact"
                            sh "npm publish --registry=http://host.docker.internal:8083/repository/ironman-npm-repo"

要留意的是,由於我們的Jenkins是使用Docker,當要從Container內部連接本地服務(localhost)時,要使用host.docker.internal作為Domain。然後repository/ironman-npm-repo代表我們昨天設定的NPM Repository。

最後,完整的Block應該會如下。

        stage('Nexus Publisher') {
            steps {
                nodejs(nodeJSInstallationName: 'NodeJS'){
                    withCredentials([usernamePassword(credentialsId: 'nexus-user', usernameVariable: 'NEXUS_USER', passwordVariable: 'NEXUS_PSWD')]) {
                        script{
                            def nexusAuth = sh(returnStdout: true, script: "echo -n '${NEXUS_USER}:${NEXUS_PSWD}' | openssl base64").trim()
                            echo "nexusAuth =  ${nexusAuth}"
                            sh "echo 'always-auth=true\n_auth=${nexusAuth}\n' > .npmrc"
                            echo "Publish Artifact"
                            sh "npm publish --registry=http://host.docker.internal:8083/repository/ironman-npm-repo"
                        }
                    }
                }
            }
        }

修改完成後,我們進行Commit、Push,然後在Jenkins中按下Build Now
https://ithelp.ithome.com.tw/upload/images/20220927/20152012pyB8M0WFsf.png

發現運行不成功。不用怕,我們先來查看運作日誌。
https://ithelp.ithome.com.tw/upload/images/20220927/20152012K1TPH3Hjgv.png

原來是Repository設定中不允許重新Deploy同一個套件。這裡一般正常我們都是用來避免相同的套件被覆蓋。處理方法可以為更新版本編號。但今天我們先用最簡單的方法去修改Repository的設定。

先到Nexus的設定中,進入ironman-npm-repo的設定。

找到Deployment policy,然後修改為Allow redeploy,然後Save

回到Jenkins,重新運行一次Build Now,發現今次成功推送到Nexus了。https://ithelp.ithome.com.tw/upload/images/20220927/2015201207y1sjqsFk.png

小結

終於,我們有了方法去儲存我們的套件了。這樣,當我們有需要的時候,就可以不用重新封裝一次所有套件,而是可以隨時從Nexus中取得任何版本的程序。

在此系列的教學中,由於篇幅的關係,有很多軟體的管理及安全性設定都没有仔細給大家說明。因此是此系列中有不少地方的設定方面,可能還需要各位加強當中的安全性。這個系列暫時只能以最簡單的設定去為大家進行講解,以提供一些使用上的思路。希望大家在設計自己的CICD Pipeline時,要注意這方面的考慮哦。

在此,Nexus的部份亦告一段落了。但我們成品倉庫的部份還未完結,明天,我們會開始講解一點點Docker的應用,然後再為Docker Image找一個儲存倉庫。

題外話

終於到了鐵人賽的半途了!這次鐵人賽讓我有機會重新建構一條新的CICD Pipeline,整個過程十分有趣,亦重新踩了不少的坑才能完成一篇又一篇的文章。希望各位小伙伴看完我的以後,能夠對各位有所幫助,避開我曾經遇過的陷阱吧!如果你喜歡我的文章,請給我一個讚吧!你的支持就是我最大的鼓勵啊!


上一篇
Day 14: 興建我的成品倉庫!Nexus OSS!
下一篇
Day 16: 使用Docker進行虛擬化!
系列文
不想吃土嗎?就利用開源軟體打造CICD Pipeline吧!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言