昨天我們成功安裝好Nexus,亦成功把封裝好的NodeJS程序上傳到Nexus中。今天就讓我們一起把整個流程自動化運作起來吧!
為了讓Jenkins連接Nexus,我們需要為Nexus加入一個Credential作為認證。首先到Jenkins的設定頁面,然後按下Manage Credentials
。
然後在Stores scoped to Jenkins
下面的列表中,按下Jenkins
那一行Domains
列的(global)
連結。
然後在左邊的選單中按下Add Credentials
。
然後輸入Nexus的登入帳號及密碼,然後在ID
一欄填入nexus-user
方便辨認。然後按Create
。
完成後會看見列表中增加了一個新的Credential
。
設定好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
。
發現運行不成功。不用怕,我們先來查看運作日誌。
原來是Repository設定中不允許重新Deploy同一個套件。這裡一般正常我們都是用來避免相同的套件被覆蓋。處理方法可以為更新版本編號。但今天我們先用最簡單的方法去修改Repository的設定。
先到Nexus的設定中,進入ironman-npm-repo
的設定。
找到Deployment policy
,然後修改為Allow redeploy
,然後Save
。
回到Jenkins,重新運行一次Build Now
,發現今次成功推送到Nexus了。
終於,我們有了方法去儲存我們的套件了。這樣,當我們有需要的時候,就可以不用重新封裝一次所有套件,而是可以隨時從Nexus中取得任何版本的程序。
在此系列的教學中,由於篇幅的關係,有很多軟體的管理及安全性設定都没有仔細給大家說明。因此是此系列中有不少地方的設定方面,可能還需要各位加強當中的安全性。這個系列暫時只能以最簡單的設定去為大家進行講解,以提供一些使用上的思路。希望大家在設計自己的CICD Pipeline時,要注意這方面的考慮哦。
在此,Nexus的部份亦告一段落了。但我們成品倉庫的部份還未完結,明天,我們會開始講解一點點Docker的應用,然後再為Docker Image找一個儲存倉庫。
終於到了鐵人賽的半途了!這次鐵人賽讓我有機會重新建構一條新的CICD Pipeline,整個過程十分有趣,亦重新踩了不少的坑才能完成一篇又一篇的文章。希望各位小伙伴看完我的以後,能夠對各位有所幫助,避開我曾經遇過的陷阱吧!如果你喜歡我的文章,請給我一個讚吧!你的支持就是我最大的鼓勵啊!