{"id":29,"date":"2011-11-30T06:03:17","date_gmt":"2011-11-30T06:03:17","guid":{"rendered":"http:\/\/finaldie.com\/wordpress\/?p=29"},"modified":"2012-11-05T05:43:35","modified_gmt":"2012-11-05T05:43:35","slug":"how-to-make-a-autobuild-system-with-git-server","status":"publish","type":"post","link":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/","title":{"rendered":"How to Make a AutoBuild System with Git Server"},"content":{"rendered":"<p>\u4eca\u5929\u7ed9\u5927\u5bb6\u5206\u4eab\u4e00\u4e0b\u6700\u8fd1\u81ea\u5df1\u7684\u6210\u679c, \u6298\u817e\u4e86\u4e00\u4e2aautobuild\u7cfb\u7edf, \u5982\u679c\u60a8\u548c\u6211\u6709\u540c\u6837\u7684\u9700\u6c42, \u4e0d\u59a8\u8ddf\u968f\u6211\u4e00\u8d77\u642d\u5efa\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf, easy and simple, have fun :)<\/p>\n<p><strong>Why:<\/strong><\/p>\n<p><strong>\u00a0\u00a0<\/strong>\u4e8b\u60c5\u662f\u8fd9\u6837\u5f00\u59cb\u7684, \u6211\u81ea\u5df1\u7684\u9879\u76ee\u653e\u7f6e\u5728github\u4e0a, \u8fd9\u662f\u4e00\u4e2alinux\u9879\u76ee, \u7136\u800c\u6211\u6240\u7528\u6765\u5f00\u53d1\u7684\u673a\u5668\u662fmac, \u5b83\u4e0d\u80fd\u7528\u6765\u7f16\u8bd1\u6240\u6709\u7684\u6a21\u5757, \u6bcf\u6b21\u6211\u90fd\u9700\u8981push\u63d0\u4ea4\u4e4b\u540e, \u518d\u53bbserver\u4e0apull\u4e0b\u6765, \u7136\u540e\u7f16\u8bd1\u770b\u770b\u7ed3\u679c, \u8fd9\u4e2a\u8fc7\u7a0b\u6211\u6301\u7eed\u4e86\u4e00\u9635\u5b50\u4e4b\u540e\u518d\u4e5f\u5fcd\u53d7\u4e0d\u4e86\u4e86, \u6211\u60f3\u8981\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf:<\/p>\n<p style=\"padding-left: 30px;\">1.\u00a0\u5f53\u6211push\u63d0\u4ea4\u4e4b\u540e, \u4ed6\u80fd\u5b9e\u65f6\u7684\u53cd\u9988\u7ed9\u6211\u7f16\u8bd1\u7684\u7ed3\u679c, \u5c31\u50cf\u672c\u5730\u7f16\u8bd1\u4e00\u6837<br \/>\n2.\u00a0\u8fd0\u884ctest unit, \u5e76\u5c06\u7ed3\u679c\u5b9e\u65f6\u53cd\u9988\u7ed9\u6211<br \/>\n3.\u00a0\u968f\u540e\u53d1\u9001\u4e00\u5c01\u90ae\u4ef6\u5230\u6211\u7684\u90ae\u7bb1\u5185, \u5305\u542b\u7f16\u8bd1\u7ed3\u679c\u4ee5\u53catest unit\u8fd0\u884c\u7ed3\u679c<br \/>\n4.\u00a0\u800c\u8fd9\u6b21\u7684\u63d0\u4ea4\u4ec5\u4ec5\u662f\u4e3a\u4e86\u6d4b\u8bd5\u96c6\u6210\u7684\u6548\u679c, \u800c\u4e0d\u5f71\u54cd\u771f\u6b63\u7684\u7248\u672c\u5e93\u4e3b\u5e72<\/p>\n<p><strong>How:<\/strong><\/p>\n<p><strong>\u00a0\u00a0<\/strong>\u76ee\u7684\u660e\u786e\u540e, \u6211\u60f3\u5230\u4e86git hook, \u8fd9\u91cc\u9762\u7684hook\u6709\u4e00\u4e2a\u53ef\u4ee5\u6ee1\u8db3\u6211\u7684\u9700\u6c42&#8211; post-receive, \u8fd9\u662f\u4e00\u4e2aserver\u7aef\u7684hook(shell\u811a\u672c), \u6bcf\u5f53\u63a5\u6536\u5230applypatch\u540e\u90fd\u4f1a\u8c03\u7528\u4e00\u6b21\u5e76\u5c06\u8f93\u51fa\u7ed3\u679c\u53cd\u9988\u7ed9client, \u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u5f00\u59cb\u5229\u7528\u8fd9\u4e2ahook\u642d\u5efa\u8fd9\u5957\u7cfb\u7edf.<\/p>\n<p>\u9996\u5148\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u5de5\u4f5c\u6d41\u7a0b(\u5982\u4e0b\u56fe):<\/p>\n<p><a href=\"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg\"><img decoding=\"async\" class=\"alignnone size-full wp-image-30\" title=\"autobuild\" src=\"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg\" alt=\"\" width=\"726\" height=\"494\" \/><\/a><\/p>\n<p>\u56fe1 WorkFlow<\/p>\n<p>\u7b80\u5355\u7684\u63cf\u8ff0\u4e00\u4e0b\u8fd9\u4e2a\u6d41\u7a0b, \u76f8\u5bf9\u8fd8\u7b97\u6e05\u6670\u7b80\u6d01, \u627e\u4e00\u53f0\u53ef\u4ee5\u7528\u4f5cbuild\u7684\u673a\u5668, \u5efa\u7acb\u4e00\u4e2agit bare repo \u7528\u4e8e\u63a5\u53d7\u63d0\u4ea4, a clone repo for update &amp; build, \u5f53\u4f60\u5411\u8fd9\u4e2arepo push\u540e, server\u6536\u5230commit\u4f1a\u81ea\u52a8\u8c03\u7528post-receive hook, \u63a5\u4e0b\u6765\u4f60\u9700\u8981\u8ba9\u8fd9\u4e2ahook\u811a\u672c\u505a4\u4ef6\u4e8b:<\/p>\n<p>1. \u5b9a\u4f4d\u5230clone repo \u76ee\u5f55\u4e2d\u8fdb\u884cpull, \u66f4\u65b0\u6700\u540e\u4e00\u6b21\u63d0\u4ea4<br \/>\n2. \u5728build\u76ee\u5f55\u4e2d\u6267\u884cmake<br \/>\n3. \u6267\u884cTestUnit<br \/>\n4. \u5c06\u521a\u624d\u8f93\u51fa\u7684\u4fe1\u606f\u53d1\u9001\u5230\u6307\u5b9a\u90ae\u7bb1<\/p>\n<p>\u8fd9\u4e2a\u811a\u672c\u5b8c\u6210\u4e0a\u8ff04\u4e2a\u6b65\u9aa4, \u4e5f\u5c31\u5b8c\u6210\u4e86\u6211\u4eec\u5236\u5b9a\u7684\u76ee\u6807. \u73b0\u5728\u6240\u6709\u91cd\u70b9\u90fd\u5728\u8fd9\u4e2ahook\u811a\u672c\u5185, \u4e0d\u8fc7\u4f60\u662f\u5426\u6709\u4e00\u4e2a\u7591\u60d1, \u8fd9\u4e9b\u6267\u884c\u4e2d\u7684\u4fe1\u606f\u5982\u4f55\u624d\u80fd\u53cd\u9988\u7ed9\u63d0\u4ea4\u7684client? \u8fd9\u4e2a\u4e5f\u662f\u6211\u6700\u5148\u60f3\u95ee\u7684, \u67e5\u4e86git hook\u7684\u8d44\u6599\u540e, \u53d1\u73b0post-receive\u6267\u884c\u65f6, \u6807\u51c6\u8f93\u51fa(stdout)\u548c\u6807\u51c6\u9519\u8bef\u8f93\u51fa(stderr)\u90fd\u4f1a\u88abgit-send-back\u7ed9\u5f53\u524dclient, \u6240\u4ee5\u8fd9\u4e2a\u4f20\u8f93\u95ee\u9898\u6211\u4eec\u53ef\u4ee5\u4e0d\u7528\u62c5\u5fc3, \u00a0\u6211\u4eec\u53ea\u9700\u8981\u5173\u5fc3\u54ea\u4e9b\u4fe1\u606f\u6211\u4eec\u9700\u8981\u6536\u96c6, \u54ea\u4e9b\u9700\u8981\u4e22\u5f03\u5373\u53ef.<\/p>\n<p><strong>ToDo<\/strong>:<\/p>\n<p>\u76ee\u6807\u6e05\u695a\u4e86, \u539f\u7406\u4e5f\u6e05\u695a\u4e86, \u63a5\u4e0b\u6765\u6211\u4f1a\u5c55\u793a\u5982\u4f55\u642d\u5efa\u4e00\u4e2agit server ,\u4ee5\u53ca\u5982\u4f55\u7f16\u5199\u8fd9\u4e2agit hook(post-receive), \u00a0\u5230\u6700\u540e\u6d4b\u8bd5\u7ed3\u679c\u6f14\u793a.<\/p>\n<p><strong>1. Git server<\/strong>:<\/p>\n<p>\u642d\u5efaserver\u5f88\u591a\u6587\u7ae0\u4e2d\u90fd\u6709\u63cf\u8ff0, \u6211\u7a0d\u5fae\u63d0\u70bc\u4e00\u4e0b, \u505a\u4e00\u4e2a\u6700\u7cbe\u7b80\u7684. \u9996\u5148\u6211\u4eec\u627e\u4e00\u53f0\u673a\u5668(\u8981\u6709root or sudo\u6743\u9650)<\/p>\n<p>1). mkdir -p git_repo\/autobuild \u00a0 ( git_repo\u4e3agit server\u7684\u6839\u76ee\u5f55, autobuild\u4e3a\u65d7\u4e0b\u7684\u5176\u4e2d\u4e00\u4e2arepo )<br \/>\n2). cd git_repo &amp;&amp; git &#8211;bare init<br \/>\n3). sudo git daemon &#8211;verbose &#8211;export-all &#8211;base-path=gir_repo &#8211;enable=upload-pack &#8211;enable=upload-archive &#8211;enable=receive-pack \u00a0 \u00a0(\u8fd9\u4e2a\u53ef\u4ee5\u505a\u6210\u4e00\u4e2ashell \u4e5f\u53ef\u4ee5\u628agit daemon\u6ce8\u518c\u6210service, \u8fd9\u4e2a\u5c31\u4e0d\u518d\u8fd9\u91cc\u8fc7\u591a\u8ba8\u8bba\u4e86 \u5404\u6709\u559c\u597d)<\/p>\n<p>\u5b8c\u6210\u4e0a\u8ff03\u6b65\u540e, \u4e00\u4e2a\u7b80\u5355\u7684git server\u5c31\u642d\u597d\u4e86, \u73b0\u5728\u6211\u4eec\u9700\u8981\u5c06\u5176clone\u51fa\u6765\u5230\u4e00\u4e2a\u76ee\u5f55\u4e2d\u7528\u4e8e\u63a5\u4e0b\u6765\u505aautobuild\u73af\u5883. (\u4eca\u540e\u6bcf\u6b21receive commit\u540e\u6211\u4eec\u90fd\u4f1a\u5230\u8fd9\u4e2a\u76ee\u5f55\u505a\u4e00\u6b21git pull\u66f4\u65b0\u6700\u540e\u4e00\u6b21\u63d0\u4ea4, \u5e76\u8fdb\u884c\u540e\u7eed\u64cd\u4f5c)<\/p>\n<p>\u6bd4\u5982 \u6211\u4eec\u5c06\u5176clone\u5230\u4e00\u4e2a\u540d\u4e3a&#8221;\/test_env&#8221;\u7684\u76ee\u5f55\u4e0b:<br \/>\ngit clone git:\/\/127.0.0.1\/autobuild test_env<\/p>\n<p>\u597d\u4e86\u5230\u6b64, \u642d\u5efagit server\u5e76\u51c6\u5907autobuild\u73af\u5883\u76ee\u5f55\u5df2\u7ecf\u5b8c\u6210, \u63a5\u4e0b\u6765\u6211\u4eec\u5f00\u59cb\u7f16\u5199post-receive hook\u4e86.<\/p>\n<p><strong>2. Post-receive Hook:<\/strong><\/p>\n<p>\u521a\u521a\u4e5f\u63d0\u5230\u4e86, \u8fd9\u4e2a\u811a\u672c\u5c31\u662f\u6211\u4eec\u4eca\u5929\u7684\u4e3b\u89d2, \u90a3\u4e48\u6211\u4eec\u5148\u56de\u5230git_repo\/autobuild\u76ee\u5f55\u6765, \u5728\u8fd9\u91cc\u9762, \u6211\u4eec\u53ef\u4ee5\u770b\u5230hooks\u76ee\u5f55, \u8fdb\u53bb\u4e4b\u540e\u6211\u4eec\u53ef\u4ee5\u627e\u5230post-receive.sample \u8fd9\u4e2a\u6a21\u677f, \u5c06\u5176rename\u4e3apost-receive, \u5e76\u6dfb\u52a0\u6211\u4eec\u9700\u8981\u7684\u5de5\u4f5c\u6d41\u7a0b:<\/p>\n<p>\u4e00\u4e2a\u7b80\u6d01\u7684\u4f8b\u5b50, \u5185\u5bb9\u5982\u4e0b:<\/p>\n<pre>mailfile='autobuild.txt'\r\nemail='xxx@xx.com'\r\n\r\nunset GIT_DIR \r\n\r\n# 1. git pull\r\ncd \/git_repo\/autobuild\r\ngit pull &gt; $mailfile\r\n\r\n# 2. build\r\nmake clean\r\nmake --no-print-directory 2&gt;&gt; $mailfile\r\n\r\n# 3. run test unit\r\nmake run_test --no-print-directory &gt;&gt; $mailfile\r\n\r\n# 4. output to stdout for echo back\r\ncat $mailfile\r\n\r\n# 5. send a email to yourself\r\nmail -s \"Autobuild `date`\" $email &lt; $mailfile<\/pre>\n<div>\n<p>\u4e0a\u9762\u7684\u4f8b\u5b50\u4ec5\u4ec5\u5b8c\u6210\u4e86\u6211\u4eec\u5de5\u4f5c\u6d41\u7a0b\u4e2d\u7684\u76ee\u6807, \u5e76\u6ca1\u6709\u8fdb\u884c\u4efb\u4f55\u6392\u7248\u5de5\u4f5c, \u4e3a\u4e86\u4f7f\u90ae\u4ef6\u7684\u683c\u5f0f\u66f4\u52a0\u6e05\u6670, \u4f60\u53ef\u4ee5\u5728\u5176\u4e2d\u653e\u7f6e\u66f4\u591a\u7684echo, \u6bd4\u5982\u6253\u4e0a\u4e00\u4e9b\u6a2a\u7ebf\u4f5c\u4e3a\u5206\u5272, \u5199\u4e0a\u4e00\u4e9b\u63d0\u793a\u8bed\u53e5, \u8fd9\u4e2a\u5c31\u770b\u5927\u5bb6\u81ea\u5df1\u7684\u559c\u597d\u4e86, \u6211\u5c31\u4e0d\u5728\u8fd9\u91cc\u8d58\u8d58\u7684\u63cf\u8ff0\u4e86 :), \u63a5\u4e0b\u6765, \u4f60\u9700\u8981\u5c06\u8fd9\u4e2arepo\u52a0\u5165\u5230\u4f60\u672c\u5730\u7684git remote\u5217\u8868\u4e2d(\u4f7f\u7528remote add\u547d\u4ee4\u6dfb\u52a0), \u6bcf\u5f53\u4f60\u60f3\u8981autobuild\u7684\u65f6\u5019, \u5c31\u5c06\u5f53\u524dbranch push\u5230\u8fd9\u4e2aremote repo\u4e2d, \u4f60\u4f1a\u5728push\u6267\u884c\u65f6\u5f97\u5230\u4e0a\u8ff0\u6211\u4eec\u63d0\u5230\u7684\u6240\u6709\u53cd\u9988(build info, run test unit, receive a email for backup). That&#8217;s All.<\/p>\n<p>\u6700\u540e, \u9644\u4e0a\u4e00\u4e2a\u6211\u7684\u90ae\u4ef6\u4fe1\u606f\u683c\u5f0f, \u4ee5\u4f9b\u53c2\u8003:<\/p>\n<pre>2011\u5e74 11\u6708 27\u65e5 \u661f\u671f\u65e5 23:04:46 EST\r\nhi, This is a Autobuild message, please don't reply!\r\n------------------------Update Info-------------------------------\r\nMerge made by recursive.\r\n ftu\/Makefile |    2 +-\r\n 1 files changed, 1 insertions(+), 1 deletions(-)\r\n\r\n------------------------Build Result------------------------------\r\nNo errors\r\n\r\n------------------------Test Result-----------------------------------\r\n( test -d test &amp;&amp; cd test &amp;&amp; make run_test )\r\n(cd ..\/final_libraries\/bin &amp;&amp; .\/test )\r\nFINAL TEST UNIT START...\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_list DESCRIBE:for test flist &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\n[ALL ASSERT PASSED -- 11\/11]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_hash DESCRIBE:for test fhash set and get &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\n0--2717\/2775\r\n1--3238\/4163\r\n2--2769\/2775\r\n3--3272\/4163\r\n4--2742\/2775\r\n5--3284\/4163\r\n6--2751\/2775\r\n7--3260\/4163\r\n8--2741\/2775\r\n9--3226\/4163\r\ntotal count = 30000 max_size = 34690(cost 589730 byte) use ratio=1.00 avg len=3000\r\nhash iter totoal=30000\r\nhashforeach totoal=30000\r\n[ALL ASSERT PASSED -- 30003\/30003]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_hash_del DESCRIBE:for test hash_del method &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\nhash del complete\r\n[ALL ASSERT PASSED -- 20000\/20000]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_mem DESCRIBE:for test mempool alloc and free &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\nmain tid=47601252718336\r\ntid=47601254823680\r\ntid=47601256924928\r\nmempool init complete tid=47601254823680\r\ntid=47601254823680 size=4 diff_time:155540usec | 155ms\r\ntid=47601256924928 size=4 diff_time:183863usec | 183ms\r\ntid=47601254823680 size=12 diff_time:153841usec | 153ms\r\ntid=47601256924928 size=12 diff_time:146459usec | 146ms\r\ntid=47601256924928 size=20 diff_time:146551usec | 146ms\r\ntid=47601254823680 size=20 diff_time:170322usec | 170ms\r\ntid=47601256924928 size=30 diff_time:144495usec | 144ms\r\ntid=47601254823680 size=30 diff_time:152498usec | 152ms\r\ntid=47601256924928 size=36 diff_time:148525usec | 148ms\r\ntid=47601254823680 size=36 diff_time:152242usec | 152ms\r\ntid=47601256924928 size=60 diff_time:136363usec | 136ms\r\ntid=47601254823680 size=60 diff_time:136486usec | 136ms\r\ntid=47601256924928 size=100 diff_time:139143usec | 139ms\r\ntid=47601254823680 size=100 diff_time:148458usec | 148ms\r\ntid=47601256924928 size=180 diff_time:155570usec | 155ms\r\ntid=47601254823680 size=180 diff_time:137590usec | 137ms\r\ntid=47601254823680 size=300 diff_time:147943usec | 147ms\r\ntid=47601256924928 size=300 diff_time:154894usec | 154ms\r\ntid=47601254823680 size=600 diff_time:147344usec | 147ms\r\ntid=47601256924928 size=600 diff_time:155993usec | 155ms\r\ntid=47601254823680 size=1000 diff_time:149958usec | 149ms\r\ntid=47601256924928 size=1000 diff_time:146590usec | 146ms\r\ntid=47601254823680 size=1200 diff_time:140344usec | 140ms\r\ntid=47601256924928 size=1200 diff_time:157028usec | 157ms\r\ntid=47601254823680 size=3000 diff_time:154509usec | 154ms\r\ntid=47601256924928 size=3000 diff_time:159357usec | 159ms\r\ntid=47601254823680 size=5000 diff_time:148422usec | 148ms\r\ntid=47601256924928 size=5000 diff_time:147129usec | 147ms\r\ntid=47601254823680 size=8202 diff_time:151623usec | 151ms\r\ntid=47601256924928 size=8202 diff_time:153929usec | 153ms\r\ntid=47601254823680 size=16394 diff_time:146452usec | 146ms\r\ntid=47601256924928 size=16394 diff_time:141301usec | 141ms\r\ntid=47601254823680 size=51200 diff_time:257559usec | 257ms\r\ntid=47601254823680 total diff_time:2651372usec | 2651ms avg=155ms\r\ntid=47601256924928 size=51200 diff_time:243754usec | 243ms\r\ntid=47601256924928 total diff_time:2661121usec | 2661ms avg=156ms\r\n[ALL ASSERT PASSED -- 52094510\/52094510]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_realloc DESCRIBE:for test mempool realloc &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\n[ALL ASSERT PASSED -- 8\/8]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_log DESCRIBE:for test log system &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\nlog work thread start\r\nread log info:[2011-11-27 23:04:55][debug]:log test final\r\n\r\nfind ptr=0x7fff5036ce2d\r\n[ALL ASSERT PASSED -- 3\/3]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_mbuf DESCRIBE:for test mbuf of mbuf_seek &amp; rewind &amp; realloc &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\n[ALL ASSERT PASSED -- 31\/31]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_mbuf1 DESCRIBE:for test mbuf of mbuf_push &amp; mbuf_pop &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\n[ALL ASSERT PASSED -- 90\/90]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_timer DESCRIBE:for test ftimerfd &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\n[ALL ASSERT PASSED -- 4\/4]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_fev DESCRIBE:for test fev for create register add del methods &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\n[ALL ASSERT PASSED -- 18\/18]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_fev_listener DESCRIBE:for test fev listener &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\ntest listener thread startup\r\nwait for poll\r\nnet_conn:connect sucess fd = 6\r\n[ALL ASSERT PASSED -- 5\/5]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_fev_buff DESCRIBE:for test fev buff &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\nwait for poll\r\nnet_conn:connect sucess fd = 6\r\nread size=12, read_str=hello final\r\nmain recv str=hi final\r\nevbuff error\r\nerror happened haha\r\n[ALL ASSERT PASSED -- 22\/22]\r\n\r\n &lt;&lt;&lt;&lt;&lt;&lt;&lt; CASE NAME:test_fev_conn DESCRIBE:for test fev asynchronous connect &gt;&gt;&gt;&gt;&gt;&gt;&gt;\r\nmain tid=47601252718336\r\nwait for poll\r\naccept sucessful\r\ntid=47601256924928\r\n[ALL ASSERT PASSED -- 2\/2]\r\n\r\n--------------------------------------\r\nTOTAL CASE 13, PASS 13, FAILED 0\r\n\r\nBest Regards! Final Autobuild Team<\/pre>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u4eca\u5929\u7ed9\u5927\u5bb6\u5206\u4eab\u4e00\u4e0b\u6700\u8fd1\u81ea\u5df1\u7684\u6210\u679c, \u6298\u817e\u4e86\u4e00\u4e2aautobuild\u7cfb\u7edf, \u5982\u679c\u60a8\u548c\u6211\u6709\u540c\u6837\u7684\u9700\u6c42, \u4e0d\u59a8\u8ddf\u968f\u6211\u4e00\u8d77\u642d\u5efa\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf, easy and simple, have fun :) Why: \u00a0\u00a0\u4e8b\u60c5\u662f\u8fd9\u6837\u5f00\u59cb\u7684, \u6211\u81ea\u5df1\u7684\u9879\u76ee\u653e\u7f6e\u5728github\u4e0a, \u8fd9\u662f\u4e00\u4e2alinux\u9879\u76ee, \u7136\u800c\u6211\u6240\u7528\u6765\u5f00\u53d1\u7684\u673a\u5668\u662fmac, \u5b83\u4e0d\u80fd\u7528\u6765\u7f16\u8bd1\u6240\u6709\u7684\u6a21\u5757, \u6bcf\u6b21\u6211\u90fd\u9700\u8981push\u63d0\u4ea4\u4e4b\u540e, \u518d\u53bbserver\u4e0apull\u4e0b\u6765, \u7136\u540e\u7f16\u8bd1\u770b\u770b\u7ed3\u679c, \u8fd9\u4e2a\u8fc7\u7a0b\u6211\u6301\u7eed\u4e86\u4e00\u9635\u5b50\u4e4b\u540e\u518d\u4e5f\u5fcd\u53d7\u4e0d\u4e86\u4e86, \u6211\u60f3\u8981\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf: 1.\u00a0\u5f53\u6211push\u63d0\u4ea4\u4e4b\u540e, \u4ed6\u80fd\u5b9e\u65f6\u7684\u53cd\u9988\u7ed9\u6211\u7f16\u8bd1\u7684\u7ed3\u679c, \u5c31\u50cf\u672c\u5730\u7f16\u8bd1\u4e00\u6837 2.\u00a0\u8fd0\u884ctest unit, \u5e76\u5c06\u7ed3\u679c\u5b9e\u65f6\u53cd\u9988\u7ed9\u6211 3.\u00a0\u968f\u540e\u53d1\u9001\u4e00\u5c01\u90ae\u4ef6\u5230\u6211\u7684\u90ae\u7bb1\u5185, \u5305\u542b\u7f16\u8bd1\u7ed3\u679c\u4ee5\u53catest unit\u8fd0\u884c\u7ed3\u679c 4.\u00a0\u800c\u8fd9\u6b21\u7684\u63d0\u4ea4\u4ec5\u4ec5\u662f\u4e3a\u4e86\u6d4b\u8bd5\u96c6\u6210\u7684\u6548\u679c, \u800c\u4e0d\u5f71\u54cd\u771f\u6b63\u7684\u7248\u672c\u5e93\u4e3b\u5e72 How: \u00a0\u00a0\u76ee\u7684\u660e\u786e\u540e, \u6211\u60f3\u5230\u4e86git hook, \u8fd9\u91cc\u9762\u7684hook\u6709\u4e00\u4e2a\u53ef\u4ee5\u6ee1\u8db3\u6211\u7684\u9700\u6c42&#8211; post-receive, \u8fd9\u662f\u4e00\u4e2aserver\u7aef\u7684hook(shell\u811a\u672c), \u6bcf\u5f53\u63a5\u6536\u5230applypatch\u540e\u90fd\u4f1a\u8c03\u7528\u4e00\u6b21\u5e76\u5c06\u8f93\u51fa\u7ed3\u679c\u53cd\u9988\u7ed9client, \u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u5f00\u59cb\u5229\u7528\u8fd9\u4e2ahook\u642d\u5efa\u8fd9\u5957\u7cfb\u7edf. \u9996\u5148\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u5de5\u4f5c\u6d41\u7a0b(\u5982\u4e0b\u56fe): \u56fe1 WorkFlow \u7b80\u5355\u7684\u63cf\u8ff0\u4e00\u4e0b\u8fd9\u4e2a\u6d41\u7a0b, \u76f8\u5bf9\u8fd8\u7b97\u6e05\u6670\u7b80\u6d01, \u627e\u4e00\u53f0\u53ef\u4ee5\u7528\u4f5cbuild\u7684\u673a\u5668, \u5efa\u7acb\u4e00\u4e2agit bare repo \u7528\u4e8e\u63a5\u53d7\u63d0\u4ea4, a clone repo for &#8230; <a title=\"How to Make a AutoBuild System with Git Server\" class=\"read-more\" href=\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/\" aria-label=\"More on How to Make a AutoBuild System with Git Server\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v22.3 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>How to Make a AutoBuild System with Git Server - Final Blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Make a AutoBuild System with Git Server - Final Blog\" \/>\n<meta property=\"og:description\" content=\"\u4eca\u5929\u7ed9\u5927\u5bb6\u5206\u4eab\u4e00\u4e0b\u6700\u8fd1\u81ea\u5df1\u7684\u6210\u679c, \u6298\u817e\u4e86\u4e00\u4e2aautobuild\u7cfb\u7edf, \u5982\u679c\u60a8\u548c\u6211\u6709\u540c\u6837\u7684\u9700\u6c42, \u4e0d\u59a8\u8ddf\u968f\u6211\u4e00\u8d77\u642d\u5efa\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf, easy and simple, have fun :) Why: \u00a0\u00a0\u4e8b\u60c5\u662f\u8fd9\u6837\u5f00\u59cb\u7684, \u6211\u81ea\u5df1\u7684\u9879\u76ee\u653e\u7f6e\u5728github\u4e0a, \u8fd9\u662f\u4e00\u4e2alinux\u9879\u76ee, \u7136\u800c\u6211\u6240\u7528\u6765\u5f00\u53d1\u7684\u673a\u5668\u662fmac, \u5b83\u4e0d\u80fd\u7528\u6765\u7f16\u8bd1\u6240\u6709\u7684\u6a21\u5757, \u6bcf\u6b21\u6211\u90fd\u9700\u8981push\u63d0\u4ea4\u4e4b\u540e, \u518d\u53bbserver\u4e0apull\u4e0b\u6765, \u7136\u540e\u7f16\u8bd1\u770b\u770b\u7ed3\u679c, \u8fd9\u4e2a\u8fc7\u7a0b\u6211\u6301\u7eed\u4e86\u4e00\u9635\u5b50\u4e4b\u540e\u518d\u4e5f\u5fcd\u53d7\u4e0d\u4e86\u4e86, \u6211\u60f3\u8981\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf: 1.\u00a0\u5f53\u6211push\u63d0\u4ea4\u4e4b\u540e, \u4ed6\u80fd\u5b9e\u65f6\u7684\u53cd\u9988\u7ed9\u6211\u7f16\u8bd1\u7684\u7ed3\u679c, \u5c31\u50cf\u672c\u5730\u7f16\u8bd1\u4e00\u6837 2.\u00a0\u8fd0\u884ctest unit, \u5e76\u5c06\u7ed3\u679c\u5b9e\u65f6\u53cd\u9988\u7ed9\u6211 3.\u00a0\u968f\u540e\u53d1\u9001\u4e00\u5c01\u90ae\u4ef6\u5230\u6211\u7684\u90ae\u7bb1\u5185, \u5305\u542b\u7f16\u8bd1\u7ed3\u679c\u4ee5\u53catest unit\u8fd0\u884c\u7ed3\u679c 4.\u00a0\u800c\u8fd9\u6b21\u7684\u63d0\u4ea4\u4ec5\u4ec5\u662f\u4e3a\u4e86\u6d4b\u8bd5\u96c6\u6210\u7684\u6548\u679c, \u800c\u4e0d\u5f71\u54cd\u771f\u6b63\u7684\u7248\u672c\u5e93\u4e3b\u5e72 How: \u00a0\u00a0\u76ee\u7684\u660e\u786e\u540e, \u6211\u60f3\u5230\u4e86git hook, \u8fd9\u91cc\u9762\u7684hook\u6709\u4e00\u4e2a\u53ef\u4ee5\u6ee1\u8db3\u6211\u7684\u9700\u6c42&#8211; post-receive, \u8fd9\u662f\u4e00\u4e2aserver\u7aef\u7684hook(shell\u811a\u672c), \u6bcf\u5f53\u63a5\u6536\u5230applypatch\u540e\u90fd\u4f1a\u8c03\u7528\u4e00\u6b21\u5e76\u5c06\u8f93\u51fa\u7ed3\u679c\u53cd\u9988\u7ed9client, \u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u5f00\u59cb\u5229\u7528\u8fd9\u4e2ahook\u642d\u5efa\u8fd9\u5957\u7cfb\u7edf. \u9996\u5148\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u5de5\u4f5c\u6d41\u7a0b(\u5982\u4e0b\u56fe): \u56fe1 WorkFlow \u7b80\u5355\u7684\u63cf\u8ff0\u4e00\u4e0b\u8fd9\u4e2a\u6d41\u7a0b, \u76f8\u5bf9\u8fd8\u7b97\u6e05\u6670\u7b80\u6d01, \u627e\u4e00\u53f0\u53ef\u4ee5\u7528\u4f5cbuild\u7684\u673a\u5668, \u5efa\u7acb\u4e00\u4e2agit bare repo \u7528\u4e8e\u63a5\u53d7\u63d0\u4ea4, a clone repo for ... Read more\" \/>\n<meta property=\"og:url\" content=\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/\" \/>\n<meta property=\"og:site_name\" content=\"Final Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/hu.yuzhang\" \/>\n<meta property=\"article:published_time\" content=\"2011-11-30T06:03:17+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-11-05T05:43:35+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg\" \/>\n<meta name=\"author\" content=\"final\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@hyzwowtools\" \/>\n<meta name=\"twitter:site\" content=\"@hyzwowtools\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"final\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/\",\"url\":\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/\",\"name\":\"How to Make a AutoBuild System with Git Server - Final Blog\",\"isPartOf\":{\"@id\":\"https:\/\/finaldie.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg\",\"datePublished\":\"2011-11-30T06:03:17+00:00\",\"dateModified\":\"2012-11-05T05:43:35+00:00\",\"author\":{\"@id\":\"https:\/\/finaldie.com\/blog\/#\/schema\/person\/2d4c840d6e8e197f8ade98af2bd2fab3\"},\"breadcrumb\":{\"@id\":\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#primaryimage\",\"url\":\"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg\",\"contentUrl\":\"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/finaldie.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Make a AutoBuild System with Git Server\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/finaldie.com\/blog\/#website\",\"url\":\"https:\/\/finaldie.com\/blog\/\",\"name\":\"Final Blog\",\"description\":\"As simple as possible...\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/finaldie.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/finaldie.com\/blog\/#\/schema\/person\/2d4c840d6e8e197f8ade98af2bd2fab3\",\"name\":\"final\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/finaldie.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/4c720545b79ddb0f23b527e0bbcfd9bc?s=96&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/4c720545b79ddb0f23b527e0bbcfd9bc?s=96&r=g\",\"caption\":\"final\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"How to Make a AutoBuild System with Git Server - Final Blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/","og_locale":"en_US","og_type":"article","og_title":"How to Make a AutoBuild System with Git Server - Final Blog","og_description":"\u4eca\u5929\u7ed9\u5927\u5bb6\u5206\u4eab\u4e00\u4e0b\u6700\u8fd1\u81ea\u5df1\u7684\u6210\u679c, \u6298\u817e\u4e86\u4e00\u4e2aautobuild\u7cfb\u7edf, \u5982\u679c\u60a8\u548c\u6211\u6709\u540c\u6837\u7684\u9700\u6c42, \u4e0d\u59a8\u8ddf\u968f\u6211\u4e00\u8d77\u642d\u5efa\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf, easy and simple, have fun :) Why: \u00a0\u00a0\u4e8b\u60c5\u662f\u8fd9\u6837\u5f00\u59cb\u7684, \u6211\u81ea\u5df1\u7684\u9879\u76ee\u653e\u7f6e\u5728github\u4e0a, \u8fd9\u662f\u4e00\u4e2alinux\u9879\u76ee, \u7136\u800c\u6211\u6240\u7528\u6765\u5f00\u53d1\u7684\u673a\u5668\u662fmac, \u5b83\u4e0d\u80fd\u7528\u6765\u7f16\u8bd1\u6240\u6709\u7684\u6a21\u5757, \u6bcf\u6b21\u6211\u90fd\u9700\u8981push\u63d0\u4ea4\u4e4b\u540e, \u518d\u53bbserver\u4e0apull\u4e0b\u6765, \u7136\u540e\u7f16\u8bd1\u770b\u770b\u7ed3\u679c, \u8fd9\u4e2a\u8fc7\u7a0b\u6211\u6301\u7eed\u4e86\u4e00\u9635\u5b50\u4e4b\u540e\u518d\u4e5f\u5fcd\u53d7\u4e0d\u4e86\u4e86, \u6211\u60f3\u8981\u4e00\u4e2a\u8fd9\u6837\u7684\u7cfb\u7edf: 1.\u00a0\u5f53\u6211push\u63d0\u4ea4\u4e4b\u540e, \u4ed6\u80fd\u5b9e\u65f6\u7684\u53cd\u9988\u7ed9\u6211\u7f16\u8bd1\u7684\u7ed3\u679c, \u5c31\u50cf\u672c\u5730\u7f16\u8bd1\u4e00\u6837 2.\u00a0\u8fd0\u884ctest unit, \u5e76\u5c06\u7ed3\u679c\u5b9e\u65f6\u53cd\u9988\u7ed9\u6211 3.\u00a0\u968f\u540e\u53d1\u9001\u4e00\u5c01\u90ae\u4ef6\u5230\u6211\u7684\u90ae\u7bb1\u5185, \u5305\u542b\u7f16\u8bd1\u7ed3\u679c\u4ee5\u53catest unit\u8fd0\u884c\u7ed3\u679c 4.\u00a0\u800c\u8fd9\u6b21\u7684\u63d0\u4ea4\u4ec5\u4ec5\u662f\u4e3a\u4e86\u6d4b\u8bd5\u96c6\u6210\u7684\u6548\u679c, \u800c\u4e0d\u5f71\u54cd\u771f\u6b63\u7684\u7248\u672c\u5e93\u4e3b\u5e72 How: \u00a0\u00a0\u76ee\u7684\u660e\u786e\u540e, \u6211\u60f3\u5230\u4e86git hook, \u8fd9\u91cc\u9762\u7684hook\u6709\u4e00\u4e2a\u53ef\u4ee5\u6ee1\u8db3\u6211\u7684\u9700\u6c42&#8211; post-receive, \u8fd9\u662f\u4e00\u4e2aserver\u7aef\u7684hook(shell\u811a\u672c), \u6bcf\u5f53\u63a5\u6536\u5230applypatch\u540e\u90fd\u4f1a\u8c03\u7528\u4e00\u6b21\u5e76\u5c06\u8f93\u51fa\u7ed3\u679c\u53cd\u9988\u7ed9client, \u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u5f00\u59cb\u5229\u7528\u8fd9\u4e2ahook\u642d\u5efa\u8fd9\u5957\u7cfb\u7edf. \u9996\u5148\u6211\u4eec\u6765\u770b\u4e00\u4e0b\u5de5\u4f5c\u6d41\u7a0b(\u5982\u4e0b\u56fe): \u56fe1 WorkFlow \u7b80\u5355\u7684\u63cf\u8ff0\u4e00\u4e0b\u8fd9\u4e2a\u6d41\u7a0b, \u76f8\u5bf9\u8fd8\u7b97\u6e05\u6670\u7b80\u6d01, \u627e\u4e00\u53f0\u53ef\u4ee5\u7528\u4f5cbuild\u7684\u673a\u5668, \u5efa\u7acb\u4e00\u4e2agit bare repo \u7528\u4e8e\u63a5\u53d7\u63d0\u4ea4, a clone repo for ... Read more","og_url":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/","og_site_name":"Final Blog","article_publisher":"https:\/\/www.facebook.com\/hu.yuzhang","article_published_time":"2011-11-30T06:03:17+00:00","article_modified_time":"2012-11-05T05:43:35+00:00","og_image":[{"url":"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg"}],"author":"final","twitter_card":"summary_large_image","twitter_creator":"@hyzwowtools","twitter_site":"@hyzwowtools","twitter_misc":{"Written by":"final","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/","url":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/","name":"How to Make a AutoBuild System with Git Server - Final Blog","isPartOf":{"@id":"https:\/\/finaldie.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#primaryimage"},"image":{"@id":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#primaryimage"},"thumbnailUrl":"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg","datePublished":"2011-11-30T06:03:17+00:00","dateModified":"2012-11-05T05:43:35+00:00","author":{"@id":"https:\/\/finaldie.com\/blog\/#\/schema\/person\/2d4c840d6e8e197f8ade98af2bd2fab3"},"breadcrumb":{"@id":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#primaryimage","url":"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg","contentUrl":"http:\/\/finaldie.com\/wordpress\/wp-content\/uploads\/2011\/11\/autobuild.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/finaldie.com\/blog\/how-to-make-a-autobuild-system-with-git-server\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/finaldie.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Make a AutoBuild System with Git Server"}]},{"@type":"WebSite","@id":"https:\/\/finaldie.com\/blog\/#website","url":"https:\/\/finaldie.com\/blog\/","name":"Final Blog","description":"As simple as possible...","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/finaldie.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/finaldie.com\/blog\/#\/schema\/person\/2d4c840d6e8e197f8ade98af2bd2fab3","name":"final","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/finaldie.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/4c720545b79ddb0f23b527e0bbcfd9bc?s=96&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4c720545b79ddb0f23b527e0bbcfd9bc?s=96&r=g","caption":"final"}}]}},"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/posts\/29"}],"collection":[{"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/comments?post=29"}],"version-history":[{"count":2,"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/posts\/29\/revisions"}],"predecessor-version":[{"id":121,"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/posts\/29\/revisions\/121"}],"wp:attachment":[{"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/media?parent=29"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/categories?post=29"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/finaldie.com\/blog\/wp-json\/wp\/v2\/tags?post=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}