javascript
travis-ci_使用Travis-CI的SpringBoot应用程序的CI / CD
travis-ci
在本文中,我們將學習如何將Travis CI用于SpringBoot應用程序的持續(xù)集成和持續(xù)部署(CI / CD)。 我們將學習如何運行Maven構建目標,使用JaCoCo插件,使用SonarCloud代碼質量檢查,建立泊塢窗圖像進行測試覆蓋率驗證并推DockerHub并最終將其部署到Heroku的 。
本文的源代碼位于https://github.com/sivaprasadreddy/freelancer-kit
上周,我和我的朋友談論了使用SpringBoot構建Java應用程序并對其進行部署變得多么容易。 在討論中,有一點關于構建Java應用程序并將其部署到某個地方(云)需要花費多少。 因此,我想探索更多有關免費服務的信息,我們可以使用這些免費服務以最小的成本或根本沒有成本使所有項目開發(fā)活動自動化。
幾年前,我使用CloudBees和CloudFoundry構建和部署了提供免費托管服務的寵物項目,但它們不再提供免費服務。
過去,我將Travis CI用于我的Java項目只是為了進行初步測試,但查看它們的文檔后,我意識到它們提供了很多功能。
因此,我想檢查一下是否可以將Travis CI用于我的項目,以執(zhí)行所有常規(guī)任務,例如:
- 簽出最新代碼
- 編譯并運行單元和集成測試
- 運行JaCoCo代碼覆蓋率,如果未達到所需的百分比,則構建失敗
- 運行SonarQube代碼質量檢查
- (可選)構建Docker映像并將其發(fā)布到Docker Hub
- 在一些免費的云托管服務(如Heroku或OpenShift)上部署應用程序
在閱讀了他們的文檔之后,我意識到我們可以通過使用一些免費的在線服務以及與Travis-CI的集成來完成所有這些任務。
- GitHub代碼存儲庫
- SonarCloud免費的SonarQube服務
- 用于發(fā)布Docker映像的Docker Hub
- Heroku用于部署應用程序
讓我們看看如何使用Travis-CI對SpringBoot項目執(zhí)行上述所有任務。
步驟1:創(chuàng)建SpringBoot項目
使用http://start.spring.io或從您的IDE創(chuàng)建一個SpringBoot項目。 我正在使用Maven構建工具,也可以根據(jù)需要使用Gradle。 現(xiàn)在將項目提交到您的github存儲庫中。
步驟2:建立.travis.yml檔案
為了啟用Travis-CI集成,我們需要在項目根文件夾中創(chuàng)建.travis.yml文件。
在創(chuàng)建基于Maven的Java項目時,請創(chuàng)建具有以下內容的.travis.yml文件:
.travis.yml
language: java jdk: oraclejdk8這種最小的配置足以使Travis-CI識別并構建基于Maven的Java項目。 如果項目的根文件夾中有一個build.gradle文件,Travis會將其視為Gradle項目,或者如果存在pom.xml則將其視為Maven項目。 如果同時存在build.gradle和pom.xml,則Gradle構建腳本將具有優(yōu)先權。
默認情況下,Travis將運行mvn test -B來構建項目。 如果Travis找到了mvnw包裝器,則它將像./mvnw test -B一樣使用。
但是,如果您要運行其他命令或要運行多個命令,則可以使用腳本塊對其進行自定義。
現(xiàn)在,提交.travis.yml文件并將其推送到GitHub。
步驟3:為GitHub儲存庫啟用Travis-CI
轉到https://travis-ci.org/并使用GitHub登錄 。
現(xiàn)在單擊添加新存儲庫 (+符號)。
為存儲庫啟用Travis。 啟用Travis后,單擊該存儲庫,然后可以通過選擇More Options-> Trigger build來觸發(fā)構建 。
現(xiàn)在,您可以看到構建正在運行并且測試已執(zhí)行,并且有關構建狀態(tài)的電子郵件通知將發(fā)送到您的電子郵件中。
步驟4:添加JaCoCo代碼覆蓋率檢查
將Maven JaCoCo插件添加到pom.xml中,并使用諸如所需的代碼覆蓋率百分比,要忽略的包/類等選項。
<plugin><groupId>org.jacoco</groupId><artifactId>jacoco-maven-plugin</artifactId><version>0.7.9</version><configuration><excludes><exclude>in/sivalabs/freelancerkit/entities/*</exclude><exclude>in/sivalabs/freelancerkit/*Application</exclude></excludes></configuration><executions><execution><id>default-prepare-agent</id><goals><goal>prepare-agent</goal></goals></execution><execution><id>default-prepare-agent-integration</id><goals><goal>prepare-agent-integration</goal></goals></execution><execution><id>default-report</id><phase>verify</phase><goals><goal>report</goal></goals></execution><execution><id>default-report-integration</id><goals><goal>report-integration</goal></goals></execution><execution><id>default-check</id><goals><goal>check</goal></goals><configuration><rules><!-- implementation is needed only for Maven 2 --><rule implementation="org.jacoco.maven.RuleConfiguration"><element>BUNDLE</element><limits><!-- implementation is needed only for Maven 2 --><limit implementation="org.jacoco.report.check.Limit"><counter>COMPLEXITY</counter><value>COVEREDRATIO</value><minimum>0.60</minimum></limit></limits></rule></rules></configuration></execution></executions> </plugin>步驟5:運行單元和集成測試
如前所述,默認情況下,Travis運行mvn test -B ,它將僅運行Unit tests 。
我們希望使用maven-failsafe-plugin分別運行單元測試和集成測試。 我們將遵循慣例,將單元測試命名為* Test.java / * Tests.java , 將集成測試命名為* IT.java 。
如下所述添加maven-failsafe-plugin :
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-failsafe-plugin</artifactId><configuration><includes><include>**/*IT.java</include></includes></configuration><executions><execution><id>failsafe-integration-tests</id><phase>integration-test</phase><goals><goal>integration-test</goal></goals></execution></executions> </plugin> 在為SpringBoot項目配置maven-failsafe-plugin時,我遇到了這個問題https://github.com/spring-projects/spring-boot/issues/6254 。
為了解決這個問題,我將分類器配置添加到spring-boot-maven-plugin,如下所示:
現(xiàn)在,我們將使用腳本塊來指定要運行的自定義Maven目標,而不是默認目標。
.travis.yml
language: java jdk: oraclejdk8script: - ./mvnw clean install -B步驟6:使用SonarCloud進行SonarQube代碼質量檢查
基于SonarQube構建的SonarCloud ,可為開源項目提供免費的代碼質量檢查。
使用GitHub登錄并轉到“ 我的帳戶”->“安全性”,并為您的項目生成一個新令牌并將其保存在某處。 現(xiàn)在,單擊“ 組織”選項卡,并使用一些唯一的密鑰創(chuàng)建組織。
Travis-CI提供了對敏感數(shù)據(jù)進行加密的功能( https://docs.travis-ci.com/user/encryption-keys/ ),以便我們可以加密任何密鑰,密碼并在.travis.yml文件中進行配置。
> sudo gem安裝travis
在項目根文件夾中,運行以下命令來加密數(shù)據(jù):
travis加密SOMEVAR =“ secretvalue”
這將生成類似
安全:“…。 加密的數(shù)據(jù)……?!?/strong>
我們可以將所有機密添加為全局環(huán)境變量,如下所示:
env:global:- secure: "....encrypted data....."現(xiàn)在,讓我們如下加密SonarCloud令牌:
travis加密SONAR_TOKEN =“我的聲納令牌在這里”
最后,讓我們將SonarCloud支持添加為插件( https://docs.travis-ci.com/user/sonarcloud/ ),如下所示:
language: java jdk: oraclejdk8env:global:- secure: "....encrypted sonar token here....."addons:sonarcloud:organization: "sivaprasadreddy-github"token:secure: $SONAR_TOKENscript: - ./mvnw clean install -B - ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonar請注意,我們使用$ SONAR_TOKEN引用加密的令牌變量,并添加了另一個命令在腳本塊中運行以運行sonar:sonar目標。
步驟7:構建Docker映像并發(fā)布到DockerHub
Travis CI構建可以運行和構建Docker映像,也可以將映像推送到Docker存儲庫。 有關更多信息,請閱讀https://docs.travis-ci.com/user/docker/
在項目根文件夾中為我們的SpringBoot應用程序創(chuàng)建Dockerfile ,如下所示:
FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD target/freelancer-kit-0.0.1-SNAPSHOT.jar app.jar RUN sh -c 'touch /app.jar' ENV JAVA_OPTS="-Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8787,suspend=n" EXPOSE 8080 8787 ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -Dspring.profiles.active=docker -jar /app.jar" ]要使用Docker,請將以下設置添加到.travis.yml:
sudo: requiredservices:- docker現(xiàn)在我們可以在構建中運行Docker命令。
構建成功后,我們可能要構建Docker映像并將其推送到Docker Hub。 我們可以利用after_success部分來執(zhí)行此操作。
在推送映像之前,我們需要登錄DockerHub ,我們將通過對其進行加密來配置DockerHub憑據(jù)。
travis加密DOCKER_USER =” dockerhub-username”
travis加密DOCKER_PASS =“ dockerhub-password”
將這兩個秘密添加到.travis.yml的env.global部分。
現(xiàn)在,我們可以在after_success部分中添加docker命令來構建映像并發(fā)布到dockerhub,如下所示:
after_success: - docker login -u $DOCKER_USER -p $DOCKER_PASS - export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH; fi` - export IMAGE_NAME=sivaprasadreddy/freelancerkit - docker build -t $IMAGE_NAME:$COMMIT . - docker tag $IMAGE_NAME:$COMMIT $IMAGE_NAME:$TAG - docker push $IMAGE_NAME步驟8:部署到Heroku
Travis CI提供了在廣泛的平臺上進行部署的選項,包括Heroku,OpenShift,AWS,Azure等。TravisCI可以在成功構建后自動部署您的Heroku應用程序。
我們將使用Travis https://docs.travis-ci.com/user/deployment/heroku/在Heroku上部署SpringBoot應用程序。 在將我們的應用程序部署到Heroku之前,我們需要登錄到https://www.heroku.com/并從Dashboard創(chuàng)建一個應用程序。
現(xiàn)在,在項目的根文件夾中創(chuàng)建Procfile ,如下所示:
web java -Dserver.port=$PORT -Dspring.profiles.active=heroku $JAVA_OPTS -jar target/freelancer-kit-0.0.1-SNAPSHOT-exec.jar首先,我們需要獲取Heroku API密鑰并將其添加為加密密鑰。
travis加密HEROKU_API_KEY =“此處為您的Heroku-api-key-”
我們可以通過添加以下部署部分來從Travis部署到Heroku:
deploy:provider: herokuapi_key: $HEROKU_API_KEYapp: freelancerkit現(xiàn)在,完整的.travis.yml文件將如下所示:
sudo: required language: java jdk: oraclejdk8services: - dockerenv:global:- secure: "encrypted-sonar-token"- secure: "encrypted-dockerhub-username"- secure: "encrypted-dockerhub-password"- secure: "encrypted-heroku-api-key"- COMMIT=${TRAVIS_COMMIT::7}addons:sonarcloud:organization: "sivaprasadreddy-github"token:secure: $SONAR_TOKENscript: - ./mvnw clean install -B - ./mvnw clean org.jacoco:jacoco-maven-plugin:prepare-agent package sonar:sonarafter_success: - docker login -u $DOCKER_USER -p $DOCKER_PASS - export TAG=`if [ "$TRAVIS_BRANCH" == "master" ]; then echo "latest"; else echo $TRAVIS_BRANCH&amp;amp;amp;amp;amp;lt;span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"&amp;amp;amp;amp;amp;gt;&amp;amp;amp;amp;amp;lt;/span&amp;amp;amp;amp;amp;gt;; fi` - export IMAGE_NAME=sivaprasadreddy/freelancer-kit - docker build -t $IMAGE_NAME:$COMMIT . - docker tag $IMAGE_NAME:$COMMIT $IMAGE_NAME:$TAG - docker push $IMAGE_NAMEdeploy:provider: herokuapi_key: $HEROKU_API_KEYapp: freelancer-kit一旦構建成功并將其部署在Heroku上,您應該可以通過https:// <app> .herokuapp.com /訪問該應用程序。
我僅介紹了Java應用程序中最常執(zhí)行的任務,但是Travis-CI可以執(zhí)行更多任務。 在https://docs.travis-ci.com/上查看TravisCI文檔。
翻譯自: https://www.javacodegeeks.com/2018/01/ci-cd-springboot-applications-using-travis-ci.html
travis-ci
總結
以上是生活随笔為你收集整理的travis-ci_使用Travis-CI的SpringBoot应用程序的CI / CD的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是绿色建筑什么是绿色建筑的定义
- 下一篇: spring-junit4_基于Spri