功能:用戶開發完maven構建的web項目后,從本地提交代碼到gogs遠程倉庫中,在執行 git commit 命令之前會先執行 maven配置的 findbugs插件,來檢測項目是否有明顯bug,如果有就讓項目構建失敗,git commit 失敗。 如果沒有明顯bug,則提交成功。 gogs配置web鈎子,對 push 命令有效。 當用戶從本地成功push代碼到gogs倉庫中時,會觸發jenkins項目的構建,jenkins中也會使用findbugs(checkstyle,pmd)再檢測一次,設置容錯bug數目,如果小於配置bug數則構建成功,自動完成部署。 用戶在本地push代碼后,可以直接在瀏覽器中訪問項目。
主要工具以及技術: eclipse ,java,maven,Git,gogs,jenkins,Git鈎子,web鈎子
maven的pom.xml中的主要插件: findbugs plugin
(1)、新建maven項目,寫個簡單的類,然后寫出該類對應的測試類
編寫jsp頁面(用於訪問部署后的項目,直接使用index.jsp也行)
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>cn.demo</groupId> <artifactId>jenkins_webtest</artifactId> <!--這是我的項目名--> <packaging>war</packaging> <!--web項目的打包方式--> <version>0.0.1-SNAPSHOT</version> <name>jenkins_webtest Maven Webapp</name> <url>http://maven.apache.org</url> <build> <finalName>jenkins_webtest</finalName> <plugins> <plugin> <inherited>true</inherited> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${compiler.source}</source> <target>${compiler.target}</target> <encoding>${project.build.sourceEncoding}</encoding> <compilerArguments> <extdirs>${project.basedir}/src/main/webapp/WEB-INF/lib</extdirs> </compilerArguments> </configuration> </plugin> <!-- findbugs插件 :靜態檢查代碼的錯誤--> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>findbugs-maven-plugin</artifactId> <version>3.0.4</version> <configuration> <!-- 設置分析工作的等級,可以為Min、Default和Max --> <effort>Low</effort> <!-- Low、Medium和High (Low最嚴格) --> <threshold>Medium</threshold> <failOnError>true</failOnError> <includeTests>true</includeTests> <!--findbugs需要忽略的錯誤的配置文件--> <!-- <excludeFilterFile>compile.bat</excludeFilterFile> --> </configuration> <executions> <execution> <id>run-findbugs</id> <!-- 在install 階段觸發執行findbugs檢查,比如執行 mvn clean package--> <phase>install</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> <!--將腳本文件件放在項目war包以外一起打包的插件 這個配置主要用戶java項目執行時打包腳本的,web項目可以不用配置此插件--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.4.1</version> <executions> <execution> <id>${project.version}</id><!--名字任意 --> <phase>package</phase> <!-- 綁定到package生命周期階段上 --> <goals> <goal>single</goal> <!-- 只運行一次 --> </goals> <configuration> <descriptors> <!--描述文件路徑--> <descriptor>script.xml</descriptor> </descriptors> <!--這樣配置后,mvn deploy不會把assembly打的zip包上傳到nexus--> <attach>false</attach> </configuration> </execution> </executions> </plugin> </plugins> </build> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <compiler.source>1.7</compiler.source> <compiler.target>1.7</compiler.target> <!-- servlet/jsp/EL (2.4/2.0/?)(2.5/2.1/2.1),(3.0/2.2/2.2),(3.1/2.3/3.0) --> <servlet.version>3.1.0</servlet.version> <jsp.version>2.3.1</jsp.version> <jstl.version>1.2</jstl.version> <junit.version>4.12</junit.version> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>${servlet.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>${jsp.version}</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>${jstl.version}</version> </dependency> </dependencies> </project>
(2)、新建gogs倉庫,倉庫名為 jenkins_webtest ,然后進入git bush here ,通過 git clone http://localhost:3000/test/jenkins_webtest.git 命令,將倉庫克隆到本地
使用 cd 命令 ,進入克隆下來的項目 $ cd jenkins_webtest
里面有個 .git文件夾 ,打開.git文件夾后 里面有個文件名為 hooks的文件夾 在hooks目錄下新建 pre-commit 文件 (這個文件沒有后綴名,在用戶使用 git commit 命令時會自動先調用該文件 ,腳本命令就寫在該文件(pre-commit)中) $ cd .git/hooks $ touch pre-commit 然后編輯該文件 $ vi pre-commit
將這段內容復制進去: (整個腳本的返回值為0時,才能commit 成功;當腳本返回值為非0時,git commit 失敗)
#!/bin/sh #execute shell before commit,check the code mvn clean install #這里執行install命令時,根據前面pom.xml的配置,會執行findbugs:findbugs命令 #recieve the execute result 接收執行結果 result=$? #output the result ,if the result more than or equal 0 ,it proves this project has bugs,otherwise don't.
#如果執行結果為0 ,表示沒有bug,maven項目build成功
#如果執行結果為非0,表示有bug,maven項目 build 失敗 echo $result if [ $result -ne 0 ] #判斷執行結果是否等於0 (-ne : 不等於) then mvn findbugs:gui #彈出findbugs的gui,里面會顯示bug的具體位置以及原因 echo "REGRETFUL! BUILD FAILURE" exit 1 #有bug時,讓Git commit失敗,無法提交上去 else echo "CONGRATURATION! BUILD SUCCESS" exit 0 #沒有bug時,以 0 退出,是的commit成功,可以繼續push fi
(3)在gogs倉庫中配置 web鈎子
進入項目倉庫 --》 點擊倉庫設置 --》 管理web鈎子 --》 添加web鈎子 --》gogs --》 推送地址:http://172.150.16.53:8080/gogs-webhook/?job=jenkins_webtest
(4)在jenkins上構建maven風格的項目,參照jenkins項目的基本配置就行了
主要配置 源碼管理 : Git
構建觸發器: 觸發遠程構建
Build: pom.xml ,后面那行寫 clean package findbugs:findbugs checkstyle:checkstyle (前提:在可選插件中下載好了 findbugs,checkstyle插件)
在Post Step 下面 選擇 --》 add post-build step : 選擇 --》send files or execute command over SSH (前提已經下載了 Publish over SSH插件,並且測試連接主機)
在這里的配置
Name:是在系統設置里面配置的
Source Files: 這里填寫你需要傳輸的文件 jenkins工作區間中的文件
Remove prefix: 傳輸到遠程主機后 需要移除的文件前綴 ,這里寫了 target
Remote directory:傳輸過去到遠程主機的什么位置
Exec Command :這里的命令很簡單 只要將war包移到 遠程主機的 Tomcat的webapps目錄下就行了

在往下的配置就是 構建設置
在 Publish Checkstyle analysis results 和 Publish findbugs analysis results 打鈎,就是選中就行了。。點擊高級配置 具體看關於靜態檢測的那篇博文
然后就可以構建了
(web部署到本機的Tomcat中,不需要 在Post Step 下面 選擇 --》 add post-build step : 選擇 --》send files or execute command over SSH 這一步,直接在構建后操作中 選中 Deploy war/ear to a container 進行簡單配置就行了 )
