自動化領域比較有影響力的開源框架jenkins,確實比較強大,易用。很多公司將其用來做持續即成CI(continuous integration)。為了拓展和強化自己的軟件設計生態系統,也將很久前使用過的jenkins再熟悉一下。在這里做下備忘。
首先就是下載jenkins安裝包,其實所謂的安裝,是習慣說法,這個直接從官網下載后,一個war包(jenkins.war, 60M大小左右),直接就可以啟動運行。我本地安裝的是最新版本1.644. 由於jenkins是java寫的,運行過程中需要有JDK,即java要先安裝且配置好JAVA_HOME。
查看下我的java home信息:
1 [root@CloudGame jenkins]# echo $JAVA_HOME 2 /usr/java/jdk1.8.0_65
這個基本要求具備后,就可以啟動jenkins了,這里演示,就直接java -jar jenkins.war來啟動,當然,jenkins也可以在任何servlet容器里面運行,比如Tomcat等。
1 [root@CloudGame jenkins]# java -jar jenkins.war 2 Running from: /home/webWps/jenkins/jenkins.war 3 webroot: $user.home/.jenkins 4 Jan 20, 2016 1:57:50 PM winstone.Logger logInternal 5 INFO: Beginning extraction from war file 6 Jan 20, 2016 1:57:50 PM org.eclipse.jetty.util.log.JavaUtilLog info 7 INFO: jetty-winstone-2.9 8 Jan 20, 2016 1:57:51 PM org.eclipse.jetty.util.log.JavaUtilLog info 9 INFO: NO JSP Support for , did not find org.apache.jasper.servlet.JspServlet 10 Jenkins home directory: /root/.jenkins found at: $user.home/.jenkins 11 Jan 20, 2016 1:57:52 PM org.eclipse.jetty.util.log.JavaUtilLog info 12 INFO: Started SelectChannelConnector@0.0.0.0:8080 13 Jan 20, 2016 1:57:52 PM winstone.Logger logInternal 14 INFO: Winstone Servlet Engine v2.0 running: controlPort=disabled 15 Jan 20, 2016 1:57:52 PM jenkins.InitReactorRunner$1 onAttained 16 INFO: Started initialization 17 Jan 20, 2016 1:57:52 PM jenkins.InitReactorRunner$1 onAttained 18 INFO: Listed all plugins 19 Jan 20, 2016 1:57:53 PM jenkins.InitReactorRunner$1 onAttained 20 INFO: Prepared all plugins 21 Jan 20, 2016 1:57:53 PM jenkins.InitReactorRunner$1 onAttained 22 INFO: Started all plugins 23 Jan 20, 2016 1:57:53 PM jenkins.InitReactorRunner$1 onAttained 24 INFO: Augmented all extensions 25 Jan 20, 2016 1:57:58 PM jenkins.InitReactorRunner$1 onAttained 26 INFO: Loaded all jobs 27 Jan 20, 2016 1:57:58 PM hudson.model.AsyncPeriodicWork$1 run 28 INFO: Started Download metadata 29 Jan 20, 2016 1:57:58 PM hudson.model.AsyncPeriodicWork$1 run 30 INFO: Finished Download metadata. 2 ms 31 Jan 20, 2016 1:57:59 PM org.jenkinsci.main.modules.sshd.SSHD start 32 INFO: Started SSHD at port 34811 33 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 34 INFO: Completed initialization 35 Jan 20, 2016 1:57:59 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh 36 INFO: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@6ddaa30c: display name [Root WebApplicationContext]; startup date [Wed Jan 20 13:57:59 CST 2016]; root of context hierarchy 37 Jan 20, 2016 1:57:59 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 38 INFO: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@6ddaa30c]: org.springframework.beans.factory.support.DefaultListableBeanFactory@17cfc9f4 39 Jan 20, 2016 1:57:59 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 40 INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@17cfc9f4: defining beans [authenticationManager]; root of factory hierarchy 41 Jan 20, 2016 1:57:59 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh 42 INFO: Refreshing org.springframework.web.context.support.StaticWebApplicationContext@574f6e10: display name [Root WebApplicationContext]; startup date [Wed Jan 20 13:57:59 CST 2016]; root of context hierarchy 43 Jan 20, 2016 1:57:59 PM org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory 44 INFO: Bean factory for application context [org.springframework.web.context.support.StaticWebApplicationContext@574f6e10]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1006f1b7 45 Jan 20, 2016 1:57:59 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons 46 INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1006f1b7: defining beans [filter,legacy]; root of factory hierarchy 47 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 48 INFO: Started initialization 49 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 50 INFO: Listed all plugins 51 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 52 INFO: Prepared all plugins 53 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 54 INFO: Started all plugins 55 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 56 INFO: Augmented all extensions 57 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 58 INFO: Loaded all jobs 59 Jan 20, 2016 1:57:59 PM jenkins.InitReactorRunner$1 onAttained 60 INFO: Completed initialization 61 Jan 20, 2016 1:57:59 PM hudson.WebAppMain$3 run 62 INFO: Jenkins is fully up and running
之所以可以直接java -jar jenkins.war運行,從這個啟動日志中可以看到,是因為jenkins內部集成了jetty這個web服務程序,正如spring-boot的框架,默認集成Tomcat服務程序一樣。
jenkins的啟動后,默認http://localhost:8080就可以打開查看web UI了,易用就體現在所有的相關配置都在web ui上完成。免除對命令行不習慣的用戶的煩惱,也不需要這里配置一點,哪里配置一點的腦裂痛苦。還有,也可以自己設置選定的端口號,這樣就可以: java -jar jenkins.war --httpPort=8081 , jenkins有很多啟動配置選項,可以通過--help查看:

1 [root@CloudGame jenkins]# java -jar jenkins.war --help 2 Running from: /home/webWps/jenkins/jenkins.war 3 webroot: $user.home/.jenkins 4 Jenkins Continuous Integration Engine 1.644 5 Usage: java -jar jenkins.war [--option=value] [--option=value] 6 7 Options: 8 --extractedFilesFolder = folder where extracted files are to be located. Default is the temp folder 9 --daemon = fork into background and run as daemon (Unix only) 10 --config = load configuration properties from here. Default is ./winstone.properties 11 --prefix = add this prefix to all URLs (eg http://localhost:8080/prefix/resource). Default is none 12 --commonLibFolder = folder for additional jar files. Default is ./lib 13 14 --logfile = redirect log messages to this file 15 --logThrowingLineNo = show the line no that logged the message (slow). Default is false 16 --logThrowingThread = show the thread that logged the message. Default is false 17 --debug = set the level of debug msgs (1-9). Default is 5 (INFO level) 18 19 --httpPort = set the http listening port. -1 to disable, Default is 8080 20 --httpListenAddress = set the http listening address. Default is all interfaces 21 --httpDoHostnameLookups = enable host name lookups on incoming http connections (true/false). Default is false 22 --httpKeepAliveTimeout = how long idle HTTP keep-alive connections are kept around (in ms; default 5000)? 23 --httpsPort = set the https listening port. -1 to disable, Default is disabled 24 if neither --httpsCertificate nor --httpsKeyStore are specified, 25 https is run with one-time self-signed certificate. 26 --httpsListenAddress = set the https listening address. Default is all interfaces 27 --httpsDoHostnameLookups = enable host name lookups on incoming https connections (true/false). Default is false 28 --httpsKeepAliveTimeout = how long idle HTTPS keep-alive connections are kept around (in ms; default 5000)? 29 --httpsKeyStore = the location of the SSL KeyStore file. 30 --httpsKeyStorePassword = the password for the SSL KeyStore file. Default is null 31 --httpsCertificate = the location of the PEM-encoded SSL certificate file. 32 (the one that starts with '-----BEGIN CERTIFICATE-----') 33 must be used with --httpsPrivateKey. 34 --httpsPrivateKey = the location of the PEM-encoded SSL private key. 35 (the one that starts with '-----BEGIN RSA PRIVATE KEY-----') 36 --httpsKeyManagerType = the SSL KeyManagerFactory type (eg SunX509, IbmX509). Default is SunX509 37 --spdy = Enable SPDY. See http://wiki.eclipse.org/Jetty/Feature/NPN 38 --ajp13Port = set the ajp13 listening port. -1 to disable, Default is disabled 39 --ajp13ListenAddress = set the ajp13 listening address. Default is all interfaces 40 --controlPort = set the shutdown/control port. -1 to disable, Default disabled 41 42 --handlerCountStartup = set the no of worker threads to spawn at startup. Default is 5 43 --handlerCountMax = set the max no of worker threads to allow. Default is 40 44 --handlerCountMaxIdle = set the max no of idle worker threads to allow. Default is 5 45 46 --sessionTimeout = set the http session timeout value in minutes. Default to what webapp specifies, and then to 60 minutes 47 --mimeTypes=ARG = define additional MIME type mappings. ARG would be EXT=MIMETYPE:EXT=MIMETYPE:... 48 (e.g., xls=application/vnd.ms-excel:wmf=application/x-msmetafile) 49 --maxParamCount=N = set the max number of parameters allowed in a form submission to protect 50 against hash DoS attack (oCERT #2011-003). Default is 10000. 51 --usage / --help = show this message 52 --version = show the version and quit 53 54 Security options: 55 --realmClassName = Set the realm class to use for user authentication. Defaults to ArgumentsRealm class 56 57 --argumentsRealm.passwd.<user> = Password for user <user>. Only valid for the ArgumentsRealm realm class 58 --argumentsRealm.roles.<user> = Roles for user <user> (comma separated). Only valid for the ArgumentsRealm realm class 59 60 --fileRealm.configFile = File containing users/passwds/roles. Only valid for the FileRealm realm class 61 62 Access logging: 63 --accessLoggerClassName = Set the access logger class to use for user authentication. Defaults to disabled 64 --simpleAccessLogger.format = The log format to use. Supports combined/common/resin/custom (SimpleAccessLogger only) 65 --simpleAccessLogger.file = The location pattern for the log file(SimpleAccessLogger only)
下面,打開瀏覽器看看效果吧:
這里,是我測試用的一個環境,里面有意個mueas的project,這個項目之前都是手動操作build,現在,希望用jenkins來定時操作build。
我會將這個項目刪除掉,然后新建一個,演示這個操作過程。刪除job,貌似web ui上沒有喲,這個其實也很簡單,在jenkins的默認運行環境路徑下,將其刪除即可(~/.jenkins/jobs),刪除后,需要重新啟動jenkins。不然web ui上還會有記錄,這個可能是緩存里面的數據吧。下面,將mueas job刪除,從0開始說說基本的配置,由於我這個mueas項目是基於maven的,所以,我就以這個為例子,做介紹。
1 [root@CloudGame .jenkins]# cd jobs/ 2 [root@CloudGame jobs]# ll 3 total 4 4 drwxr-xr-x 4 root root 4096 Jan 20 13:01 mueas 5 [root@CloudGame jobs]# rm -rf mueas/
現在說配置的事情。我的mueas項目,是用git這個SCM工具管理的,所以,在jenkins里面,需要安裝git的插件。jenkins的插件管理非常牛叉啊,現有的插件都有200多個,根據需要,自己選擇安裝,不需要的還可以uninstall。在jenkins>Manage Jenkins>Manage Plugins>Available下面搜索需要的插件,為了方便后續繼續使用,我將git, git-client,git-server都安裝了,還有一個GitHub的插件,這個也可以勾上。安裝完后,需要重啟喲,這個是jenkins的特點,是不是有點像windows安裝應用程序后要重啟os的感腳。。。由於我已經安裝了,我就將安裝了的tab頁相關信息截圖參考一下吧。
先說下,這個是刪除掉之前的mueas job后重啟完成的界面,由於一個job都沒有,提示是否創建job。這是后話。這里主要是說從如何找到plugin的安裝頁面。下圖展示我已經安裝了的插件,這里有些是jenkins默認就安裝的,紅色框的是我安裝的git相關的插件。完全可以根據自己項目需要選擇安裝。
除了上面紅色的框,發現沒,maven的集成插件也有,若沒有,也需要自己安裝maven插件的。再說說這個綠色的框,里面有的后面有Downgrade信息的按鈕,這個是針對插件更新用的,這個更新是向低版本更新喲。
需要的插件安裝完了,那么,就要說說系統環境配置了。如下圖所示,也很容易找到Jenkins>Manage jenkins>Configure System
這里說說,最基本的配置信息吧,其他的都采用jenkins默認的配置。需要配置的,如下圖,紅色框選部分,另外,JDK以及Maven安裝信息,要根據自己的系統環境進行配置。我的JDK以及Maven安裝路徑分別是:/usr/java/jdk1.8.0_65和/usr/local/apache-maven-3.3.3(其他部分的信息,是系統自動填上的,就讓其存在吧,有的是必要的,有的是沒有用的,對我這個項目來說):
上面顯示的就是主要要配置的,配置好后,點擊保存即可。
下面進入job的創建了,這里才進入主題喲,呵呵,其實,真正的項目開發中,很多設置環境或則平台搭建的這種不能直接體現出經濟效益的事情,更能反映出一個技術人員的功底。廢話哈!
然后進一步做配置,下面做詳細的配置,主要是git相關的配置。我選擇的源碼管理工具是git,配置URL,這個就是我們在linux下做clone用的那個url,一模一樣,因為jenkins運行的時候也是要從遠程repo上clone待build的project。另外一個很重要的配置,就是下面的credential了,這個估計很容易搞錯。
那么就說說這個credential的配置,看下圖,我在Kind下拉框中選擇的是SSH Username with private key,因為我們的git倉庫,采用的是SSH key訪問的。這里的username填什么呢?這個是要和下面的private key配合的,就是指當前訪問git repo遠程倉庫采用的認證屬主,我的demo中,在git遠程倉庫的根目錄下的.ssh里面那個authorized_keys文件里面追加的公鑰是root用戶的。在這里,也是用這個用戶來代理操作clone過程。所以,username是root,private key內容為/root/.ssh/id_rsa這個私鑰的內容。我選擇的private key的類型是Enter directly,所以,要將私鑰的內容完整的拷貝到這里喲。注意,-----BEGIN RSA PRIVATE KEY -----以及對應的結尾信息也一並拷貝過來喲。
接下來,需要配置build的策略了,就是build項目的那個分支,我這里選擇的是master,這個也是系統默認的配置。另外,就是build的觸發機制,我這里選擇的是周期觸發,這個配置有些類似linux的corn的規則。我這里配的是希望每天晚上11點半啟動build過程。
點擊schedule右邊的問號按鈕,有詳細的幫助信息。我這里貼一個簡單的規則描述,方便理解上面配置當中各個數字的含義以及可能都有什么配置。
This field follows the syntax of cron (with minor differences). Specifically, each line consists of 5 fields separated by TAB or whitespace:
MINUTE HOUR DOM MONTH DOW
MINUTE Minutes within the hour (0–59)
HOUR The hour of the day (0–23)
DOM The day of the month (1–31)
MONTH The month (1–12)
DOW The day of the week (0–7) where 0 and 7 are Sunday.
最后的配置,就是想做什么的事情。我希望讓其打包,並且不需要執行unit test工作,就是紅色框中的內容。注意,這里要填寫的是Goals (以及選項,當然選項可以沒有),不要帶上mvn指令,否則會出錯的喲。(錯誤信息主體為:You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id> 。。。。)
當然,這當中還有很多其他的配置,比如build前預處理做什么,以及build完成后的后處理做什么,這些都可以通過腳本定義要做的事情。我這里就什么也不做。至於郵件通知,公司屏蔽了SMTP端口,沒有辦法發郵件,因為發送的過程中,會報下面的錯誤:

1 Failed to send out e-mail 2 3 javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25; 4 nested exception is: 5 java.net.NoRouteToHostException: No route to host 6 at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934) 7 at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638) 8 at javax.mail.Service.connect(Service.java:295) 9 at javax.mail.Service.connect(Service.java:176) 10 at javax.mail.Service.connect(Service.java:125) 11 at javax.mail.Transport.send0(Transport.java:194) 12 at javax.mail.Transport.send(Transport.java:124) 13 at hudson.tasks.Mailer$DescriptorImpl.doSendTestMail(Mailer.java:566) 14 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 15 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 16 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 17 at java.lang.reflect.Method.invoke(Method.java:497) 18 at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:298) 19 at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:161) 20 at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:96) 21 at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:121) 22 at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53) 23 at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 24 at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 25 at org.kohsuke.stapler.MetaClass$6.doDispatch(MetaClass.java:249) 26 at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53) 27 at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746) 28 at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876) 29 at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649) 30 at org.kohsuke.stapler.Stapler.service(Stapler.java:238) 31 at javax.servlet.http.HttpServlet.service(HttpServlet.java:848) 32 at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:686) 33 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1494) 34 at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:132) 35 at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:123) 36 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) 37 at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:49) 38 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) 39 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84) 40 at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51) 41 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) 42 at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117) 43 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) 44 at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125) 45 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) 46 at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142) 47 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) 48 at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271) 49 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) 50 at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93) 51 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) 52 at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249) 53 at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67) 54 at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87) 55 at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76) 56 at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171) 57 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) 58 at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49) 59 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) 60 at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81) 61 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1482) 62 at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30) 63 at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1474) 64 at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:499) 65 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137) 66 at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:533) 67 at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231) 68 at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086) 69 at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:428) 70 at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193) 71 at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020) 72 at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135) 73 at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116) 74 at org.eclipse.jetty.server.Server.handle(Server.java:370) 75 at org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:489) 76 at org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:960) 77 at org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1021) 78 at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865) 79 at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240) 80 at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 81 at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:668) 82 at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 83 at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77) 84 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 85 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 86 at java.lang.Thread.run(Thread.java:745) 87 Caused by: java.net.NoRouteToHostException: No route to host 88 at java.net.PlainSocketImpl.socketConnect(Native Method) 89 at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 90 at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 91 at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 92 at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 93 at java.net.Socket.connect(Socket.java:589) 94 at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:286) 95 at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:231) 96 at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900) 97 ... 80 more
到此,一個基本的job就算配置完畢了,下面看看job配置完成后是什么樣子呢?
先看看1標記的紅框,S表示status,目前是一個新的job,狀態是灰色的,表示沒有執行過。2標記的信息,看看標題,對應信息可以看出。3標記的圖標,是一個按鈕,可以立即啟動job的執行。
那我這里就立即執行一下吧,看看最后的效果吧。鼠標點擊一下3的按鈕,執行完畢后,上面的圖所示狀態變為下面的狀態了(S反映的狀態變成藍色的了,若build失敗,會是紅色的。右邊紅色框里面,可以看到這個build所用的時間。#1表示第1次build。。。)。相應的日志也貼出了讓大家參考下吧。

1 Started by user anonymous 2 Building in workspace /root/.jenkins/workspace/mueas 3 Cloning the remote Git repository 4 Cloning repository git@109.105.5.108:/data/git/mueas.git 5 > git init /root/.jenkins/workspace/mueas # timeout=10 6 Fetching upstream changes from git@109.105.5.108:/data/git/mueas.git 7 > git --version # timeout=10 8 using GIT_SSH to set credentials mueas git authentication 9 > git -c core.askpass=true fetch --tags --progress git@109.105.5.108:/data/git/mueas.git +refs/heads/*:refs/remotes/origin/* 10 > git config remote.origin.url git@109.105.5.108:/data/git/mueas.git # timeout=10 11 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10 12 > git config remote.origin.url git@109.105.5.108:/data/git/mueas.git # timeout=10 13 Fetching upstream changes from git@109.105.5.108:/data/git/mueas.git 14 using GIT_SSH to set credentials mueas git authentication 15 > git -c core.askpass=true fetch --tags --progress git@109.105.5.108:/data/git/mueas.git +refs/heads/*:refs/remotes/origin/* 16 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10 17 > git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10 18 Checking out Revision e8c79c2becf145c173c1441876d8035fd58ef672 (refs/remotes/origin/master) 19 > git config core.sparsecheckout # timeout=10 20 > git checkout -f e8c79c2becf145c173c1441876d8035fd58ef672 21 First time build. Skipping changelog. 22 Parsing POMs 23 Discovered a new module com.tinguish:mueas mueas 24 Modules changed, recalculating dependency graph 25 [mueas] $ java -cp /root/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven31-agent-1.5.jar:/usr/local/apache-maven-3.3.3/boot/plexus-classworlds-2.5.2.jar:/usr/local/apache-maven-3.3.3/conf/logging jenkins.maven3.agent.Maven31Main /usr/local/apache-maven-3.3.3 /root/.jenkins/war/WEB-INF/lib/remoting-2.53.2.jar /root/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven31-interceptor-1.5.jar /root/.jenkins/plugins/maven-plugin/WEB-INF/lib/maven3-interceptor-commons-1.5.jar 60663 26 <===[JENKINS REMOTING CAPACITY]===>���channel started 27 Executing Maven: -B -f /root/.jenkins/workspace/mueas/pom.xml -s /root/.m2/settings.xml -gs /usr/local/apache-maven-3.3.3/conf/settings.xml package -Dmaven.test.skip=true 28 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - Scanning for projects... 29 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 30 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - ------------------------------------------------------------------------ 31 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - Building mueas 0.0.1-SNAPSHOT 32 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - ------------------------------------------------------------------------ 33 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 34 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - --- maven-resources-plugin:2.6:resources (default-resources) @ mueas --- 35 [pool-1-thread-1 for channel] INFO org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering - Using 'UTF-8' encoding to copy filtered resources. 36 [pool-1-thread-1 for channel] INFO org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering - Copying 0 resource 37 [pool-1-thread-1 for channel] INFO org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering - Copying 863 resources 38 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 39 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - --- maven-compiler-plugin:3.1:compile (default-compile) @ mueas --- 40 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.compiler.CompilerMojo - Changes detected - recompiling the module! 41 [pool-1-thread-1 for channel] INFO org.codehaus.plexus.compiler.javac.JavacCompiler - Compiling 40 source files to /root/.jenkins/workspace/mueas/target/classes 42 [pool-1-thread-1 for channel] WARN org.apache.maven.plugin.compiler.CompilerMojo - /root/.jenkins/workspace/mueas/src/main/java/com/tinguish/mueas/infra/security/MueasAuthenticationProvider.java: /root/.jenkins/workspace/mueas/src/main/java/com/tinguish/mueas/infra/security/MueasAuthenticationProvider.java uses or overrides a deprecated API. 43 [pool-1-thread-1 for channel] WARN org.apache.maven.plugin.compiler.CompilerMojo - /root/.jenkins/workspace/mueas/src/main/java/com/tinguish/mueas/infra/security/MueasAuthenticationProvider.java: Recompile with -Xlint:deprecation for details. 44 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 45 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - --- maven-resources-plugin:2.6:testResources (default-testResources) @ mueas --- 46 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.resources.TestResourcesMojo - Not copying test resources 47 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 48 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ mueas --- 49 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.compiler.TestCompilerMojo - Not compiling test sources 50 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 51 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - --- maven-surefire-plugin:2.17:test (default-test) @ mueas --- 52 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.surefire.SurefirePlugin - Tests are skipped. 53 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 54 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - --- maven-war-plugin:2.5:war (default-war) @ mueas --- 55 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.war.WarMojo - Packaging webapp 56 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.war.WarMojo - Assembling webapp [mueas] in [/root/.jenkins/workspace/mueas/target/mueas-0.0.1-SNAPSHOT] 57 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.war.WarMojo - Processing war project 58 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.war.WarMojo - Copying webapp resources [/root/.jenkins/workspace/mueas/src/main/webapp] 59 [pool-1-thread-1 for channel] INFO org.apache.maven.plugin.war.WarMojo - Webapp assembled in [515 msecs] 60 [pool-1-thread-1 for channel] INFO org.codehaus.plexus.archiver.war.WarArchiver - Building war: /root/.jenkins/workspace/mueas/target/mueas-0.0.1-SNAPSHOT.war 61 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - 62 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - --- spring-boot-maven-plugin:1.2.7.RELEASE:repackage (default) @ mueas --- 63 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - ------------------------------------------------------------------------ 64 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - BUILD SUCCESS 65 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - ------------------------------------------------------------------------ 66 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - Total time: 11.411 s 67 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - Finished at: 2016-01-20T15:54:01+08:00 68 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - Final Memory: 36M/263M 69 [pool-1-thread-1 for channel] INFO org.apache.maven.cli.event.ExecutionEventLogger - ------------------------------------------------------------------------ 70 [JENKINS] Archiving /root/.jenkins/workspace/mueas/pom.xml to com.tinguish/mueas/0.0.1-SNAPSHOT/mueas-0.0.1-SNAPSHOT.pom 71 [JENKINS] Archiving /root/.jenkins/workspace/mueas/target/mueas-0.0.1-SNAPSHOT.war to com.tinguish/mueas/0.0.1-SNAPSHOT/mueas-0.0.1-SNAPSHOT.war 72 channel stopped 73 Finished: SUCCESS
好了,基礎篇介紹到此吧,信息量已經比較大了,希望想入門jenkins的小伙伴能夠得到一點幫助!