与JBoss Fuse,Jenkins和Nexus的持续集成
最近,我正在整理一個快速啟動的Maven項目,以展示一種組織JBoss Fuse項目的可行方法。
該項目可在Github上找到: https : //github.com/paoloantinori/fuse_ci
這是我與朋友詹姆斯·羅林斯 ( James Rawlings)一起工作中學到的一點點進展
該項目提出了一種在Maven多模塊項目中組織代碼庫的方法。
由于我收到的反饋和建議,該項目正在不斷發展中; 但是關鍵是要顯示一種組織項目的所有工件,腳本和配置的方法。
在ci文件夾中,您將找到子文件夾(例如features或karaf_scripts ,這些子文件夾可能最終在每個項目中創建文件,并帶有內聯注釋,以幫助您根據特定需要進行調整和自定義 。
該項目還利用Fabric8來處理一組受管理的OSGi容器,并利用其所有功能來組織工作流,部署的配置和版本控制。
在這篇博文中,我將向您展示如何在一個非常典型的開發設置(包括JBoss Fuse , Maven , Git , Nexus和Jenkins)中部署該示例項目。
之所以決定涵蓋此主題,是因為我發現很多時候我遇到了優秀的開發人員,他們告訴我,即使他們意識到持續集成基礎架構的附加值,也沒有時間致力于這項活動 。 沒有多余的時間,他們只專注于發展。
我不希望您對此話題進行宣傳,也不要試圖告訴您他們應該做什么。 我喜歡相信他們,并相信他們知道他們的項目優先事項 ,并且他們接受了可用時間,積壓和每項活動帶來的總體收益之間的權衡。 同樣, 我喜歡相信所有人都同意,對于大型和長期項目,CI最佳實踐絕對是必須做的事情 ,而且沒有人需要爭論其價值。
考慮到所有這些,我想展示一種可能的設置和工作流程,以展示花費一小時的時間來獲得可以持續更長的利益的速度 。
我不會逐步介紹 。 但是為了證明所有這些工作正常,我創建了一個使用Docker的bash腳本,該腳本將演示如何足夠容易地編寫腳本 ,更重要的是, 它們確實有效!
如果您想直接跳到最后,可以在這里找到腳本:
https://github.com/paoloantinori/fuse_ci/blob/master/ci/deploy_scripts/remote_nexus.sh
它使用了一些我創建并作為Docker Index上的受信任版本發布的Docker映像:
https://index.docker.io/u/pantinor/fuse/
https://index.docker.io/u/pantinor/centos-jenkins/
https://index.docker.io/u/pantinor/centos-nexus/
因為它們顯示了執行的步驟,所以它們是一種方便且可重用的方式來運送可執行文件。 它們也可以看作是記錄安裝和配置過程的一種方式 。
如上所述, 您不一定需要它們 。 您可以自己手動安裝和配置服務。 它們只是一種經過驗證的開放方式,可以節省您一些時間或向您展示
我做的方式 。
讓我們開始描述示例持續集成設置的組件:
這是我們要部署到的運行時 。 它放在專用的盒子里。 它與Nexus交互,作為我們生成和發布的工件的來源。
這是我們用來存儲從代碼庫生成的二進制文件的軟件。 JBoss Fuse可以訪問它, JBoss Fuse可以從中下載工件,但Jenkins可以訪問它,并在其上發布二進制文件,這是成功構建工作的最后一步。
這是我們的構建作業調用程序 。 如果使用Git簽出的代碼成功構建,它將發布其輸出到Nexus ,并構建其輸出。
它是遠程代碼存儲庫持有人。 Jenkins可以訪問它以下載我們要構建的最新版本的代碼,并且當所有開發人員共享他們的代碼并希望在Continous Integration服務器上進行構建時,所有開發人員都將使用它。 在我們的例子中,git服務器只是通過ssh訪問的文件系統 。
| http://yuml.me/edit/7e75fab5 |
吉特
首先要做的是設置git充當我們的源代碼管理( SCM )。
您可能會猜到,從SVN到Mercurial,我們可能都曾使用過所有其他類似的軟件來完成這項工作,但我更喜歡git因為它是最受歡迎的選擇之一,并且因為它是與Fabric8配置直接交互的官方支持工具
我們對git要求不高。 我們只需要一個文件系統來存儲我們的共享代碼,以及一個允許訪問該代碼的傳輸服務 。 為了簡單起見,我決定使用SSH作為傳輸協議 。 這意味著在將要存儲代碼的盒子上,我們只需要啟動sshd守護程序,一些有效用戶以及他們可以訪問的文件夾。 就像是:
唯一的git特定步驟是使用初始化git存儲庫
git init --bare /home/fuse/fuse_scripts.git關系
Nexus OSS是一個存儲庫管理器,可用于存儲Maven工件。
它作為Java Web應用程序實現。 因此, 安裝Nexus非常簡單 。 多虧了Jetty的嵌入式實例為其提供了支持,所以只需提取分發存檔并啟動二進制文件即可:
Nexus一旦啟動,默認情況下將在以下端點上可用: http:// your_ip / 8081 / nexus,其中admin作為用戶, admin123作為密碼。
詹金斯
Jenkins是我們將用來構建項目的工作計劃程序 。 我們希望以這樣一種方式配置Jenkins,使其能夠直接連接到我們的git repo以下載項目源。 為此,我們需要一個附加插件Git Plugin 。 顯然,我們還需要在盒子上安裝java和maven 。 由于Jenkins配置由涉及與多個管理頁面的交互的各個步驟組成,因此,我僅對需要執行的重要步驟提供一些提示 。 因此, 我強烈建議您檢查我的全自動腳本 ,該腳本可以完全自動化地完成所有工作 。 就像Nexus一樣,Jenkins被實現為Java Web應用程序。 因為我喜歡使用Centos或Fedora之類的RHEL兼容發行版 ,所以我以簡化的方式安裝Jenkins。 與其像Nexus那樣手動提取存檔,不如定義一個新的yum repo ,然后讓yum為我處理安裝和配置即服務:
wget http://pkg.jenkins-ci.org/redhat/jenkins.repo -O /etc/yum.repos.d/jenkins.repo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key yum install jenkins service jenkins start Jenkins啟動后,您將在此處找到它的Web界面: http:// your_ip:8080 /
默認情況下,它是在單用戶模式下配置的,對于我們的演示來說就足夠了。 您可能需要驗證http:// your_ip:8080 / configure以檢查JDK,Maven和git的值是否看起來不錯。 如果您在Jenkins之前已經安裝了那些軟件,通??常會自動將它們拾取。 然后,您需要安裝Git插件 : http:// your_ip:8080 / pluginManager 配置完所有內容后,在重新啟動 Jenkins實例之后,我們將能夠看到表單中的新選項,該選項允許我們創建Maven構建作業。 在“ 源代碼管理 ”部分下,現在有了git選項。 只需提供SSH服務器的坐標即可,例如:
在“ 構建 ”部分的“ 目標和選項”下 ,我們需要明確告知Maven我們要調用deploy階段,并提供Nexus實例的IP地址:
clean deploy -DskipTests -Dip.nexus=172.17.0.3最后一個配置步驟是在高級maven屬性中指定一個不同的maven設置文件 ,該文件與源代碼一起存儲:
https://github.com/paoloantinori/fuse_ci/blob/master/my_settings.xml
當其中包含工件時,其中包含要顯示給Nexus的用戶和密碼。
配置已經完成,但是我們還需要其他步驟使Jenkins與Git一起工作 。
由于我們使用SSH作為傳輸協議,因此,在首次連接SSH服務器時 ,將要求我們確認要連接的服務器是安全的,并且其指紋是我們期望的指紋 。 該挑戰操作將阻止構建作業,因為是批處理作業,不會有任何人確認SSH憑據。
為了避免所有這些,一個竅門是通過SSH連接到Jenkins框,成為用于運行Jenkins進程(在我的情況下為jenkins的用戶,然后從那里手動連接到ssh git服務器,以執行標識操作以交互方式進行,因此將來不再需要:
ssh fuse@IP_GIT_SERVER The authenticity of host '[172.17.0.2]:22 ([172.17.0.2]:22)' can't be established. DSA key fingerprint is db:43:17:6b:11:be:0d:12:76:96:5c:8f:52:f9:8b:96. Are you sure you want to continue connecting (yes/no)?我使用Jenkins碼頭工人映像的另一種方法是完全禁用SSH指紋識別 ,這種方法對您來說可能不太安全 :
mkdir -p /var/lib/jenkins/.ssh ; printf "Host * \nUserKnownHostsFile /dev/null \nStrictHostKeyChecking no" >> /var/lib/jenkins/.ssh/config ; chown -R jenkins:jenkins /var/lib/jenkins/.ssh如果一切配置正確,Jenkins將能夠自動下載我們的項目,進行構建并將其發布到Nexus。
但…
在此之前,我們需要開發人員將代碼推送到git,否則將尚無任何源文件可以構建! 為此,您只需要克隆我的存儲庫,配置一個附加的遠程存儲庫(我們的私有git服務器)并推送:
git clone git@github.com:paoloantinori/fuse_ci.git git remote add upstream ssh://fuse@$IP_GIT/home/fuse/fuse_scripts.git git push upstream master 此時,您可以在Jenkins上觸發構建作業。 如果是第一次運行,則Maven將下載所有依賴項,因此可能需要一段時間 。 如果一切成功,您將收到確認您的工件已發布到Nexus的確認。
JBoss保險絲
現在,我們的Nexus服務器已填充了根據我們的代碼庫構建的Maven工件,我們只需要告訴我們的Fuse實例即可將Nexus用作Maven遠程存儲庫。 教我們如何做:在karaf殼中,我們需要更改屬性的值,
fabric:profile-edit --pid io.fabric8.agent/org.ops4j.pax.url.mvn.repositories=\"http://172.17.0.3:8081/nexus/content/repositories/snapshots/@snapshots@id=sample-snapshots\" default現在我們可以使用以下命令驗證集成是否完成:
cat mvn:sample/karaf_scripts/1.0.0-SNAPSHOT/karaf/create_containers如果一切正常,您將看到類似于以下的輸出:
# create broker profile fabric:mq-create --profile $BROKER_PROFILE_NAME $BROKER_PROFILE_NAME # create applicative profiles fabric:profile-create --parents feature-camel MyProfile# create broker fabric:container-create-child --jvm-opts "$BROKER_01_JVM" --resolver localip --profile $BROKER_PROFILE_NAME root broker# create worker fabric:container-create-child --jvm-opts "$CONTAINER_01_JVM" --resolver localip root worker1 # assign profiles fabric:container-add-profile worker1 MyProfile這意味著尋址提供Maven坐標的karaf腳本效果很好,現在您可以使用shell:source , osgi:install或任何其他需要在Nexus上發布工件的命令。
結論
如多次提到的那樣,這只是可能的工作流程 ,也是這些平臺之間交互的示例。
您的團隊可能遵循不同的程序或使用不同的工具。
也許您已經基于新的Fabric8 Maven插件實現了更高級的流程。 無論如何,我邀請對此主題感興趣的所有人發表評論或一些其他方法的鏈接,并幫助所有人分享我們的經驗 。
翻譯自: https://www.javacodegeeks.com/2014/05/continuous-integration-with-jboss-fuse-jenkins-and-nexus.html
總結
以上是生活随笔為你收集整理的与JBoss Fuse,Jenkins和Nexus的持续集成的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 早报:iPhone 15超大杯影像曝光
- 下一篇: Java中抽象类和接口之间的区别