jenkins+weblogic/tomcat完全部署

記錄初衷:

由於每次項目部署非常痛苦,很麻煩,遂使用jenkins來部署項目,只需點擊即可,但是網上不論是百度還是google關於jenkins集成weblogic部署項目的資料非常少,至少通過我的搜索沒有找到一篇非常完整的,所以以次來記錄,給大家提供一點參考。(此次記錄包含了集成weblogic和tomcat)


整合過程:

Jenkins搭建環境

CentOS6.5(系統環境)

JDK6u45(由於系統用的是weblogic10.3.5只能用JDK6了,官方提供了升級JDK7的方法,先不折騰了)

SVN

Jenkins-1.596.3(貌似是JDK6u45能支持到的最高版本,有興趣的可以繼續升級試試)

Jenkins官網:https://jenkins.io/index.html

Jenkins資源地址(各個版本及插件):http://mirrors.jenkins.io

Tomcat7.x(隨便一個版本即可)

Weblogic10.3.5(坑爹的版本,跟weblogic集成各種坑)

       Maven3.2.5(JDK6u45最高支持到該版本,否則就得升級爲JDK7.x)

Ant1.9.7(這個好像沒啥要求,主要用來編譯打包非Maven項目,非Maven項目的Ant編譯也有問題,再此做記錄!!!)

Jenkins啓動

       將jenkins的war包部署到應用服務器(我用的是Tomcat7)啓動即可

jenkins啓動完成後會生成一個目錄:/用戶/.jenkins

.jenkins目錄中會有workspace這麼個目錄(執行構建後會從svn上down下來文件並根據項目類型執行具體的編譯打包如Ant或Maven [該目錄下也會按項目分目錄 如:ECP])

Jenkins基礎配置

       主界面(就這個熊樣子)

             

1.    系統設置

裏面的配置項非常多,截圖顯示不全,只需要配置我們關心的配置!!!

其他的都不管,直接找到這裏,全部配好!!!省的別的地方報錯!別管用不用得到,配上再說(一定要保證配對!!!)。

JDK配置

ANT配置(規則同上)

MAVEN配置(規則同上)

最後別忘了保存!!!

2.    權限配置

Jenkins1.596.3+Jdk6u45+Maven3.2.5+Tomcat7.x+SVN自動部署項目(很簡單隻要步驟對都能成功)

       在這之前,需要先在Jenkins裏新增一個插件(deploy-1.10.hpi)


       直接選<高級>即可,<可更新>和<可選插件>可能報錯,用不到不用管。

開始新建

配置svn地址(此處svn地址最後需要跟上@HEAD:https://10.2.254.79/svn/CCI/EBT1/02-Engineering_工程/04-Code_實現/ECP@HEAD否則jenkins同步svn代碼會有延遲!


設置svn用戶名密碼,設置完後回到項目配置頁面重新配置svn地址即可

構建後操作(只有當deploy-1.10.hpi插件安裝後纔會有該選項!!!)

選擇完tomcat後需要配置tomcat的用戶名密碼!!!

在tomcat目錄(此處的tomcat目錄一定是你要把項目發佈到的tomcat的目錄!!!)/conf/tomcat-users.xml中配置用戶名密碼,省事兒直接copy下面這段

<role rolename="tomcat"/>

  <role rolename="role1"/>

  <rolerolename="manager-gui"/>

  <rolerolename="manager-script"/>

  <rolerolename="manager-jmx"/>

  <role rolename="manager"/>

  <rolerolename="manager-status"/>

  <user username="tomcat"password="tomcat" roles="tomcat"/>

  <user username="both"password="tomcat" roles="tomcat,role1"/>

  <user username="role1"password="tomcat" roles="role1"/>

  <user username="admin"password="admin"roles="manager,manager-gui,manager-script,manager-jmx,manager-status"/>

執行構建 會在.jenkins/workspace目錄下生成一個文件夾ECP(jenkins中建的項目叫啥就生成啥)會把項目從svn上全down下來進行構建

Jenkins1.596.3+Jdk6u45+Ant+Weblogic10.3.5+SVN自動部署項目(巨TM費勁,weblogic需要單獨插件才能部署,並且插件的使用方法非常模糊,關於jenkins部署weblogic的文檔網上資源稀少,特此記錄)

在這之前,需要先在Jenkins裏新增一個插件(weblogic-deployer-plugin-3.6.hpi)

添加插件步驟跟之前一樣,不重複了

非Maven項目選這個吧

和之前一樣

非Maven項目需要用Ant編譯打包

Ant Version:只有在jenkins系統設置裏配過,這裏才能選擇!!!

Targets:ant構建時默認會執行 ant 命令,如果需要另外的參數寫到這裏就行

選這個(只有安裝了weblogic-deployer-plugin-3.6.hpi插件纔有該選項)

此時你會毛都沒看到,頁面上沒有任何顯示,也不報錯,第一個坑來了

看jenkins所在tomcat的日誌catalog.out文件

點擊這個選項時報了這麼個錯

2017-1-10 13:51:27hudson.widgets.RenderOnDemandClosure$1 generateResponse

警告: Failed toevaluate the template closure

org.apache.commons.jelly.JellyTagException:jar:file:/root/.jenkins/plugins/weblogic-deployer-plugin/WEB-INF/lib/classes.jar!/org/jenkinsci/plugins/deploy/weblogic/WeblogicDeploymentPlugin/config.jelly:17:138:<j:invokeStatic> Could not load class: org.jenkinsci.plugins.deploy.weblogic.jdk.JdkToolService.Reason: java.lang.NoSuchMethodException:org.jenkinsci.plugins.deploy.weblogic.jdk.JdkToolService.getJDKHomeByName(java.lang.Object)

        atorg.apache.commons.jelly.tags.core.InvokeStaticTag.createLoadClassFailedException(InvokeStaticTag.java:177)

        atorg.apache.commons.jelly.tags.core.InvokeStaticTag.doTag(InvokeStaticTag.java:139)

        atorg.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)

        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)

        atorg.apache.commons.jelly.tags.core.CoreTagLibrary$2.run(CoreTagLibrary.java:105)

        atorg.kohsuke.stapler.jelly.JellyViewScript.run(JellyViewScript.java:95)

        at org.kohsuke.stapler.jelly.IncludeTag.doTag(IncludeTag.java:147)

        atorg.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)

        atorg.kohsuke.stapler.jelly.CallTagLibScript$1.run(CallTagLibScript.java:99)

        atorg.apache.commons.jelly.tags.define.InvokeBodyTag.doTag(InvokeBodyTag.java:91)

        atorg.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)

        atorg.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)

        atorg.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:161)

        atorg.apache.commons.jelly.tags.core.OtherwiseTag.doTag(OtherwiseTag.java:41)

        atorg.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)

        atorg.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)

        atorg.apache.commons.jelly.TagSupport.invokeBody(TagSupport.java:161)

        atorg.apache.commons.jelly.tags.core.ChooseTag.doTag(ChooseTag.java:38)

        atorg.apache.commons.jelly.impl.TagScript.run(TagScript.java:269)

        at org.apache.commons.jelly.impl.ScriptBlock.run(ScriptBlock.java:95)

        atorg.apache.commons.jelly.tags.core.CoreTagLibrary$2.run(CoreTagLibrary.java:105)

        atorg.kohsuke.stapler.jelly.CallTagLibScript.run(CallTagLibScript.java:120)

        at org.kohsuke.stapler.jelly.CallTagLibScript$1.run(CallTagLibScript.java:99)

        atorg.kohsuke.stapler.jelly.DefaultScriptInvoker.invokeScript(DefaultScriptInvoker.java:63)

        atorg.kohsuke.stapler.jelly.DefaultScriptInvoker.invokeScript(DefaultScriptInvoker.java:53)

        athudson.widgets.RenderOnDemandClosure$1.generateResponse(RenderOnDemandClosure.java:99)

        atorg.kohsuke.stapler.HttpResponseRenderer$Default.handleHttpResponse(HttpResponseRenderer.java:124)

        at org.kohsuke.stapler.HttpResponseRenderer$Default.generateResponse(HttpResponseRenderer.java:69)

        atorg.kohsuke.stapler.Function.renderResponse(Function.java:113)

        atorg.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:98)

        at org.kohsuke.stapler.MetaClass$JavaScriptProxyMethodDispatcher.doDispatch(MetaClass.java:470)

        atorg.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:53)

        atorg.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)

        at org.kohsuke.stapler.Stapler.invoke(Stapler.java:876)

        atorg.kohsuke.stapler.MetaClass$12.dispatch(MetaClass.java:391)

        atorg.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:746)

        atorg.kohsuke.stapler.Stapler.invoke(Stapler.java:876)

        atorg.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:813)

        atorg.kohsuke.stapler.Stapler.invoke(Stapler.java:876)

        atorg.kohsuke.stapler.Stapler.invoke(Stapler.java:649)

        atorg.kohsuke.stapler.Stapler.service(Stapler.java:199)

        atjavax.servlet.http.HttpServlet.service(HttpServlet.java:722)

        atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:306)

        atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

        athudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:96)

        athudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:88)

        atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)

        atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

        at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:48)

        atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)

        atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

        athudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)

        athudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)

        athudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)

        atjenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)

        athudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)

        atorg.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)

        athudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)

        atorg.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)

        athudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)

        atorg.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)

        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)

        atjenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93)

        athudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)

        at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)

        athudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)

        at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)

        athudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:76)

        athudson.security.HudsonFilter.doFilter(HudsonFilter.java:168)

        atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)

        atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

        atorg.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)

        atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)

        atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

        at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:81)

        atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)

        atorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

        atorg.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)

        atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:244)

        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)

        atorg.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240)

        atorg.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)

        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:589)

        atorg.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164)

        atorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)

        atorg.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:541)

        atorg.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)

        atorg.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:383)

        atorg.apache.coyote.http11.Http11Processor.process(Http11Processor.java:243)

        atorg.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188)

        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166)

        atorg.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:288)

        atjava.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)

        atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)

        atjava.lang.Thread.run(Thread.java:662)

Caused by:java.lang.NoSuchMethodException:org.jenkinsci.plugins.deploy.weblogic.jdk.JdkToolService.getJDKHomeByName(java.lang.Object)

        atjava.lang.Class.getMethod(Class.java:1607)

        atorg.apache.commons.jelly.tags.core.InvokeStaticTag.doTag(InvokeStaticTag.java:124)

        ... 93 more

這個錯誤在網上根本查不到解決辦法,遂想到是不是剛剛安裝的weblogic插件需要設置什麼東西沒設導致的錯誤,重新進到<系統設置>一直往下拉發現有個weblogic的設置。。。設置吧,不知道咋設置吧,找官網!!!

有了,有些選項設置起來依然費勁,猜着來吧

configuration.xml官網給的參考

我的configuration.xml文件內容及格式(注意:該文件內容修改後需要重啓jenkins)

<?xmlversion="1.0" encoding="UTF-8"?>

<configxmlns="http://org.jenkinsci.plugins/WeblogicDeploymentPlugin"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://org.jenkinsci.plugins/WeblogicDeploymentPluginplugin-configuration.xsd">

       <weblogic-targets>

              <!—該節點根據需求可配置多個-->

              <weblogic-target>

                     <!--隨便起個名字(我直接用的domain當名字)-->

                     <name>rayootechDomain</name>

                     <!-- domain的ip -->

                     <host>10.1.1.66</host>

                     <!-- domain的端口 -->

                     <port>7001</port>

                     <!-- domain的登錄名 -->

                     <login>weblogic</login>

                     <!-- domain的密碼 -->

                     <password>123QWe!@#</password>

              </weblogic-target>

       </weblogic-targets>

</config>

重新選擇該項,發現頁面有反應了,第一個坑至此算解決完了!!!

別忘了檢查前面的設置對不對,有可能沒保存

看到下面這個配置項中的Environment項我突然明白上面配置的configuration.xml中的<weblogic-target>是什麼意思(並非之前猜測的集羣配置),如果配置了多個<weblogic-target>標籤,下面的Environment選項則有多個選項,選擇自己需要的domain就行了!!!



保存成功後執行構建(跟之前一樣),去看jenkins控制檯吧!

 

若上圖中的Targets參數不爲空,則jenkins控制檯輸出爲(一部分):

/opt/jdk1.6.0_45/bin/java-Xms256M -Xmx1024M -cp /bea/wlserver_10.3/server/lib/weblogic.jarweblogic.Deployer -debug -stage -remote -verbose -upload -name EBT-WX-UAT-source /root/.jenkins/workspace/EBT-WX-UAT/target/EBT.war -targets AdminServer(或其他文本框中輸入的值) -adminurl t3://10.1.1.66:7001-user weblogic -password 123QWe!@# -deploy

(由此看出jenkins往weblogic部署war包是直接通過命令部署)

不知道爲啥,只要帶上Targets參數就部署報錯,一開始也不知道是因爲這個參數導致部署失敗,所以查了一下weblogic用命令部署war包的命令,都沒有用targets參數的,所以嘗試清空上圖中的Targets的值,可以看到jenkins控制檯輸出的命令爲:

/opt/jdk1.6.0_45/bin/java-Xms256M -Xmx1024M -cp /bea/wlserver_10.3/server/lib/weblogic.jarweblogic.Deployer -debug -stage -remote -verbose -upload -name EBT-WX-UAT-source /root/.jenkins/workspace/EBT-WX-UAT/target/EBT.war -targets  -adminurl t3://10.1.1.66:7001 -user weblogic-password 123QWe!@# -deploy

可以看到-targets參數後面已經沒值了,部署成功!!!

 

注意:weblogic控制檯這裏一定要是釋放配置的狀態!!!否則你別想用jenkins部署成功!

這算是第二個坑吧

Ant編譯遇到的坑

build.xml儘量用eclipse或者其他開發工具倒出來!



此時項目下會生成一個build.xml文件,執行ant命令時默認是build,只編譯,不會打war包,需要加上這種配置。

我的配置

<?xml version="1.0"encoding="UTF-8" standalone="no"?>

<!-- WARNING: Eclipse auto-generatedfile.

              Any modifications will beoverwritten.

              To include a user specificbuildfile here, simply create one in the same

              directory with the processinginstruction <?eclipse.ant.import?>

              as the first entry and export thebuildfile again. -->

<project basedir="."default="war" name="EBT">

       <!--

       需要指定使用eclipse裏面的jdtcompile編譯!!!

       解決方案:http://www.cnblogs.com/hoojo/p/use_eclipse_ant_javac_JDT_compiler_class.html

        -->

       <property name="build.compiler"value="org.eclipse.jdt.core.JDTCompilerAdapter"/>

   <property environment="env"/>

   <property name="debuglevel"value="source,lines,vars"/>

   <property name="target" value="1.6"/>

   <property name="source" value="1.6"/>

   <path id="EBT.classpath">

       <pathelement location="build/classes"/>

           <filesetdir="WebContent/WEB-INF/lib">

           <include name="*.jar"/>

       </fileset>

   </path>

   <target name="init">

       <mkdir dir="build/classes"/>

       <copy includeemptydirs="false"todir="build/classes">

           <fileset dir="src/main/java">

                <excludename="**/*.launch"/>

                <exclude name="**/*.java"/>

           </fileset>

       </copy>

       <copy includeemptydirs="false"todir="build/classes">

           <fileset dir="src/main/resources">

                <excludename="**/*.launch"/>

                <excludename="**/*.java"/>

           </fileset>

       </copy>

       <copy includeemptydirs="false"todir="build/classes">

           <fileset dir="src/test/java">

                <excludename="**/*.launch"/>

                <excludename="**/*.java"/>

           </fileset>

       </copy>

   </target>

   <target name="clean">

       <delete dir="build/classes"/>

   </target>

   <target depends="clean" name="cleanall"/>

   <target depends="build-subprojects,build-project"name="build"/>

   <target name="build-subprojects"/>

   <target depends="init" name="build-project">

       <echo message="${ant.project.name}: ${ant.file}"/>

       <javac debug="true" debuglevel="${debuglevel}"destdir="build/classes" includeantruntime="false"source="${source}" target="${target}"encoding="UTF-8">

           <src path="src/main/java"/>

           <src path="src/main/resources"/>

           <src path="src/test/java"/>

              <!--該參數用來解決使用sun的內部api時編譯報錯!!! -->

                     <compilerargline="-XDignore.symbol.file"/>

           <classpath refid="EBT.classpath"/>

       </javac>

   </target>

   <target description="Build all projects which reference thisproject. Useful to propagate changes."name="build-refprojects"/>

       <!--打war包-->

       <targetname="war" depends="build">

              <warwarfile="${basedir}/target/EBT.war"webxml="${basedir}/WebContent/WEB-INF/web.xml">

                     <filesetdir="WebContent"/>

                     <classesdir="build/classes"/>

              </war>

       </target>

</project>

上面紅色字體需要特別注意,在Ant編譯時遇到的坑:

1.    如果java代碼中用到了Sun內部的api時會編譯報錯

需要該配置<compilerarg line="-XDignore.symbol.file"/>

2.    Ant編譯時報GBK亂碼錯誤需要增加該參數

encoding="UTF-8"

3.    Ant編譯時報什麼“泛型無法轉換無法確定<X>X的類型參數;對於上限爲 T,java.lang.Object的類型變量 X不存在唯一最大實例”(這個是最嚴重的bug,網上對該bug建議最多的是對泛型強轉,我們這報錯的地方太多改不限時;另外一個方法是不使用JDK進行編譯,而是用eclipse(ecj[Eclipse Compiler forJava])的JDT(查尋得知eclipse的JDTCompiler也實現了java的編譯規範,作用同javac,編譯後的class文件java虛擬機也能用)進行編譯。

注意,想用JDT編譯有兩種方法,推薦方法一和方法二,更簡單

方法一:

直接把tomcat安裝目錄lib目錄下的ecj開頭的jar包copy到ant安裝目錄的lib目錄

方法二:

去maven倉庫搜索ecj,選擇Eclipse ECJ

一開始我用的是4.5版本,copy到ant下的lib目錄執行ant命令還是報錯,思路是對的,可能版本不對,試着降低版本直接用了4.2.2版本copy進去,重新執行ant命令,成功!!!

方法二:

需要去eclipse或者Myeclipse的安裝目錄的plugin目錄中找到以下幾個jar)

1.    org.eclipse.jdt.compiler.tool開頭jar

2.    org.eclipse.jdt.core開頭jar

3.    org.eclipse.jdt.debug.ui開頭jar

4.    jdtCompilerAdapter.jar這個jar包需要從org.eclipse.jdt.core開頭jar包中找到(麻煩)

注:這幾個jar包當時從我機器上的eclipse安裝目錄的pulugin中找這幾個jar包copy到ant安裝目錄的lib目錄下執行ant命令還是報錯,後來又從別人Myeclipse2014安裝目錄的pulugin中找到,重複copy步驟,重新執行ant命令編譯,成功!!!

如何修改該編譯Bug

1.    將方法一中的ecj-4.2.2.jar或方法二中的幾個jar包copy到ant安裝目錄的lib目錄下

2.    build.xml中增加

<propertyname="build.compiler" value="org.eclipse.jdt.core.JDTCompilerAdapter"/>配置,強制更改ant的編譯方式爲JDT

好了,用ant重新編譯吧,再有錯你來找我!!!

現在只想靜靜。。。

至此所有的坑都沒了。。。


發佈了19 篇原創文章 · 獲贊 14 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章