From fb9fec005a41bb333b3ed2c409c3214e99f5b3ff Mon Sep 17 00:00:00 2001 From: Achilleas Pipinellis Date: Tue, 19 Sep 2017 11:30:44 +0000 Subject: [PATCH] Refine docs trigger script and use a really long branch name to test it --- .gitlab-ci.yml | 7 +- doc/development/img/manual_build_docs.png | Bin 14869 -> 14867 bytes doc/development/writing_documentation.md | 75 ++++++++++++++++++++-- scripts/trigger-build-docs | 45 +++++++++---- 4 files changed, 103 insertions(+), 24 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 1d86757ea1d..cc3c170cb23 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -174,7 +174,8 @@ build-package: # Review docs base .review-docs: &review-docs image: ruby:2.4-alpine - before_script: [] + before_script: + - gem install gitlab --no-doc services: [] variables: SETUP_DB: "false" @@ -193,10 +194,9 @@ review-docs-deploy: name: review-docs/$CI_COMMIT_REF_NAME # DOCS_REVIEW_APPS_DOMAIN and DOCS_GITLAB_REPO_SUFFIX are secret variables # Discussion: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/14236/diffs#note_40140693 - url: http://$CI_COMMIT_REF_SLUG-built-from-ce-ee.$DOCS_REVIEW_APPS_DOMAIN/$DOCS_GITLAB_REPO_SUFFIX + url: http://preview-$CI_COMMIT_REF_SLUG.$DOCS_REVIEW_APPS_DOMAIN/$DOCS_GITLAB_REPO_SUFFIX on_stop: review-docs-cleanup script: - - gem install gitlab --no-doc - scripts/trigger-build-docs deploy # Cleanup remote environment of gitlab-docs @@ -207,7 +207,6 @@ review-docs-cleanup: name: review-docs/$CI_COMMIT_REF_NAME action: stop script: - - gem install gitlab --no-doc - scripts/trigger-build-docs cleanup # Retrieve knapsack and rspec_flaky reports diff --git a/doc/development/img/manual_build_docs.png b/doc/development/img/manual_build_docs.png index fef767c2a793f2bcf576e0f7fd9e51c92af92ce3..615facabb5fd6584125d3c4ebe3c894aa546fad5 100644 GIT binary patch literal 14867 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 literal 14869 zcmbt*1yGgU*Y82#fN%gwIdmv0(ueK_6$R;%=Fr_;QqrQNctAuzq@=q`N~EPhO1c~F zKJWYg=6*Bx-nnz<&M?e*V(ci9x@WJ?P%O#Mgsoi~}i8 zSWX!3HtmdW9C)wyAqEfn;=RNVd{GuFX9T#x3=v%)=c3)P(Z5Q=`vMtogPR?AsR$JB zkwhMPZV0gT2Fo%fD8^NF!_cQ>k&@u(9uFq?$y90vMV~V1`R7vmTX;PBmiq_>a0kh= zfA37{3q+4+OT_>K614x{2I4(E+7kZ2ZYeh~Gr(QkYc}RtJs=|^v$nRjo1c}H#oc6( z_3$BrD^2S#46{QrVFWfhb*q?fk(765cI03|I z#Wz~w+p67PUn}b@@M8X2VlK)$QD{jT8Xph;`0-<4EPNcPqNCH}u(Pp&+54S~5+>-m z%Rs@QAE8r*G@kr!-re0jAD3TPD5tMagI+u5S@PoL*?|!yG~i-tuK7FLkKW!EF4(6} zpH5AAczBw*U_e@(4hI@9badd0OH14q12laZB6n@Zi{vyk$hDI?$_B+B<9a!ni}b2d zWxNP)@HsJQ3C50i^QQF;`QzPQ&L+=#_lk-Nu)@LWVAuL^ZmChrt-cg)%#E=^88tOh zeuvrUyu63?yRG=A+jTpa!V(;VH7=`*^DQ9}k&!KvWfm>p+0QVCt3a^CxMuB3Ev3Z1?FLROn)9Cze% zhA%{sOCfPNC2+*VB*prbZ|?o=*sFsv8lYNE!cF9y{sylfj9V-Y>N%?nEuMZWDf>TFz0w$%TTOru{CGe5JV`(o6HUb2mYcAXFpxc)$O~K4a?;>TR6j6k8Vo} z{JR-fE!tQ&`&ww~V0R>pt(~?3yKsO~MW^vETftvx*2WOS$ zOPw)mTU!J+KCZ0A*g%(j_lv&{t;73J5~#UKrzLqVSO_*gh0)R9QLu-%+PJFSx2Tj@ zNGaHL+v!QEsiS}fW%f1e2~ovBU%q^q!f!|QHZgH;A)J0cCRekdqiW7SD%rsMHmnUj z#itjKlR9nrnK?KJ!9&!ner)@yQE+;0SnViP&*=Bl(Pg<N^G&ayZ}INnpS} zSRi1VR(qXGH{Cse+?`zZ0TKuM;<7uoknWrI>`l19GqrHKo5nL?;3ZPdB4G}+jgfFv zcgdFYebmbEvr+U8IazZbn~xX|uZtLo*9R5(hgi;h-*E*N&C2y|tVqhXP9@S!Vp<;T zfO64bdnNw+3HL0LRlJ=je)lHjzV;2nM|%r3b)GPEIM}e!^fA zv<&^o$BrWqAszW0*$CwBQk+DvIsGx&%0Ncc`MGy_Ma9CeoM*tA!I19${$(6gg>F~e zdS5C6BR#0t84n*HxDNxbWpe-ao4TFGHZWi4moF?`{czcoyz1(dVm*cM?7cIfkEfmE zCZ*NO3)7A+%EaM>v_RLi>pi()PzC0@)YQGn%Nv&;4*I|ny^DVZOgmxIO*@u{-^(-!M7Aqkx@VA`j9dZfOR)a4soS|{z6Ouh zW5cc;F32f)gji@(*kc_DlUEAc1c(zDI)*mowdtluWLOYk{oCV7<~nR=-zkA*->V%& zaS@MC_<28>n5R-|eM0=vWHQYF)BhsVcy+*UDIZTtW=A;<=tZLwo##*dzoY3~<}wsu zU*AY&3uOvZDG~eIEDD2^UK&a4iS)Xavu-RO!Un2M{Tb zPoloN>pP3a^SZ6=jgAT{U9CZjk}8&d^z&EYkUH#}L48iPmxm9JkC`4lx-D^aNb0^h z5j61P#zMl2C&c2TSD1sA|LFn_uwIW@uLs|@h%KP-9J__|=j|YfJ@c(SJamm)H}G7* z{vhmz2W+w7WOga8#{0;+8984-lkuV}T|-F;#&0_j=(0MH)zmb%6iS|GlScaBMW8X| zH=VMTh3CdxyXFGCy#H>Q(-pXHk8m(&s@@9$^hRLLcj@4=ecwzciKs^CCQ!dPx48b* zMnIu{NCeg+gKO#SBd?rWEg1K01~ zb7(OFL)-8WF1gGkLEA~SE0N)=LYKO*S+WSYHXFqUQ7@7@_pN;&SaTv=2_-&bntr$F zIHJx2;b7BxmqoYEogKV+XAJe3tHt0)Y@ol@j*Rxx)r=}qQW$gi+TePC5*J#&Np5}Q z*W*psp+_6zrUM^@e3gT!r*J!AvGfvzVaB`H7dr=5VPRpXHfnl$8%YXa%*Lf}YLH7~ z(fBaR=7Bq@u*dq%*?id1IIQ|X`#4=n(1dny+0(y1yFE=`cUz03#fhwHe6%i)ir;w} zYcbA+IBGC}b+dLy6v@Y2(f-6j!pC!~DCst}cfc>l@v|n0`k>yuiSeGS$rlC09kh~y9rE-xrMSLmqqbcCg`NYu4qt9#s~1-P-mR(vwWD#({fN4t zu_1K)_;Ja0_>`x!-xs}|?!-&(kj6%F;9;`9eC-K?-o=&vbl^|aa$m?)ySV6t`FZr%v04` z4Sz8`dN)7|M;|G0=RvEgoR_R;JVV|HxKbHYBP$z69Pgs5Ql zo91uAxe~N>f<}bI`?-;=SMH6MH5{26o60)SM7Z)jq)AV5hbI#^DfUV29$12H;#CB; zPkX~n^79L(|)?hmkK}VRoNT= zF1JEMx!DGvy|YymGY^j{SMkZPvIJ0e&*MppQm+H#(1H7N(^BoziR*f=gA(9T{4=`} z^F0xmk+QA1F8r8=tE)Y*4><9tfNL+1EA*xD^%mwXvpbZ!XqR;Dy>2`Vyan)AhlCVV zI8cACsIBR~Ia=9tdU!5(5>#dHuimCQZzruPwJfGVT^8W^6p!qOyza8+#s7P_B4NKc zIfyq6#m_LOshlTDr&%sMKc-OqRp6AR=nI)tYdc@hvHtv7%XB%5q;VF+06Pyo+AhZ> z8pQRs;Dc?eX)nhK6z^>!X#Gw3neaU;^9T`d{FgmmDeu|v^9HUXdY9H?bhP))xdSrz zGa5-%bgsuz@fR+yTO4xt8@VI`ipnI+of>-Ne3rRV*?re+Kqzl2j*&nze0led%>Ua! zdN5yzW4S^$5(*%2im)3iWmu5(g6D#Tr6n#1d945*M+4^##iw9vZuGl2_4M=e6I-N< zPHH;-Z3FCvI0d8kyUIf{?ONAI$bk=$Xt*B5+35I>1q==<*xIt8PlI#_NcP=3QQLZ5 zJ-xF@{>NHHWMU4bykNSC8kYya!os_|71?yYW33LNPCU2jQ>A=;MNtEzu=)(t1BB6J zxY{!dkPc`WcwvipZ2v*gT{gHEebpqIf8XGYM$z~uWX6W_8R_tpK8no-)hKvC@P=N;veiByJ$M4@lwe*PcWyxw)gi zsO5~J0j z(w9$6xl;F*2i;OGti(aoZ%6SPb_I)to}TOaNxB^?=+mt`ldo)dujVGz9{2g8eSU>7 z^Nm2n?8lv?I0PcakOi%vV_=^Vn=JBe96Ub`)Yer+eMDTaR zpHHG)f{R3dS3+M{;IQb^1US~0A3vV{lW==akN*DsraxUE%D>~?Fb=)%o!yhLPStdwDsB$1NfAn+e<0+Na$bq5QB2R-hV85G=u_5Uy++Y(A{&AeTn z>X_Tlt1E|I!kEbx$z@i#)V1&bO=$Sd8P4D7@)f1W{%kv4@so5#Ot%3q!bMDh5Y(6s z=}@3LmA{GjMxESy{xXYy(OE|#w!3z3r4-pGp%M#EO zrdXRNANqTZ&oA_M#OEk$^xf~G-T&SP4-ic%%@gw3m3)Oh5C8PZjk*(&11=W#$I?mL zwe4;B=g$dPSy>s9dl{2^L1q<{mPY03;n9XH3oWc?ETh#K_5N&DjxSwgGf>WSKN}pM zmx#-X{XJmr8k2))m5^=rR$Ys2u_`tXzwG7>#!=p2nL{(Y$BG~L6yY?7Cg?v8!smATJ8AS)>P~iWKXM5b z-H$xMfot_45jSSEN+CjKm8SivnqZof4TH6jGR4NlH6bih+_>}0h)5|FWQjl-<^j=2 z)-#8rw1G)jb&IKm%)FAh15$x&lp&(Tv}`g{oi%I7@|L(}_K;-0I&{Q{Fm+4Y_cKOv zujomMm{ZL+`Y0j+EVF-SlmRoII))hT`D-EOO;7_sdZv2`VSyVZ$bKp=SewmCU#fPa zuaN)co;;Qghb5CYgAtDWHF^JK^s@%hGeu7BT%HK{E z^`xb9)2#{LkV8vXPuhm^5liSa4WvxLTOn7ZGxMBqbIBXx1qdUzoAk$aJct%vqUJmoUe2PLuFoGQvFQW@I_1ym zs>EBKHo0b`N*2G#b&#-`#)jV)azqGF`gonfrD1T)eIuDMn5tL=&^xN4;>7v(^@RwEkrgl;(z=dk3Gg8Y&;hGfCQ0+5camT z8b_z2MN8;x`=VWm<}H6M?T#{)g{GemKETxihzJqguvHI=%+ICt{jZ=Pi;lTDofock zjs1ukvXxP|DM_CdbS1S3$eTa#+HiaXC=*#HKYHET7{wP&;b0Z7vI7AE2zp$u0CK@m zll1G0POr-gC=ZD;|;iFMBk9S(m z({en5+L+l-X=J}Ec?St(*9MH-zd>gcfSNXGkKao6&;=rZJ6nEN*vwS!%r(&i<29Nb zq7HZD3sHDtUqMm4?ZVq<-jA7bvEG&&SH8g>uj$%iQh^qiXj)J)FHQ3Mt(4@v(rIK1&I}ZTHS2pN~cb9ITPk#RK2%cbTVPmV@?0|BP zs#L!EJ|gmuvyg-(&E}a`L6_O`zewE9&Q5A|Vf|daY8{)kXs2yw?1@v(NJH}YS3V|h zAMuqPRx-X25Qwn7Mm+?*GceLIPL_C2huD{qG&QV`t`^if;wNK)o?Uu>cj`=po0*#j z8B@Bt2~n|*hl#MV;^pV(d#+}9+#x3q1x(XCpdW)p<>loa_y0VpKV6JM^F51;i&)AO zMP6^-?_HhDF@u!14B6j`&siS`5>hPnu*WFF{DV_hhB4f8>ovce^T&9p;|69s zN%&t18u*`?1CulX$$b3N9P#2f&c>#p;G64RD4V9SNZ)Vy5=%pFo*h@?$rh5A2v4tK zecr*${>&#EUKFihHylJMg9_lhR{h3&A&C!^nRs|eGz*wrnT};Vw<^YePE6n?_PhoZ z0iX{)ePR;tZwbNK13>drULGzxJGEQ2umV4<7j5?-(gGpX+2+22U8694 zZXMf+D>e3O8yiAzDElWX?{GGBs#%oe;a#W(ECz6CvQc9$6Dn-|AGW*{MZIur8aWmI zRO+)$sJ#yO(Sfq<*d43p^>O53q-k7b)Tj7Ba7vmpL`Qo z03=c*NMJx}5}%kD(kb7y({G5_b)!E^WJ$R|2noRl#V^=Ct3LX>vEj7#laULyGz9ym z`S{J7H-P&_gX!*e0L-~Ow)GWrRC)RM7A8tf(LlcFRo%+bxu>ZaR>T=Ey^sG_m#M0a z8|%{b!&i`9OQ^C#Un{EWPvF@u6zv7wT8?4W+?dM7pE~W!x^_sNob69*xL$IZLI;pW z6}nCbE6+u5E)Nu6yjZDfE7+!vVLB?|8ha zGbGya<8&q6;q+!|%N=OO;$laXKfvTQsFfwnGSg;BiPV?)2^@6;-JAGvy_f=#7c*p|>Jv}XHh{8{M0a~J|K{joJGaf-7Q1aP( zy|8xZ2fqvy0yso_<=N}BpsI`RIo_aI6ecDnT86)dhp~_JDs5905D-X?>g_P&pR?Pi zQ->!fOQ{wgTb6s1vDX2)T&l_Z6>-6R$O6>zCB zn$vcAOE--oyLd7ZdOPX{21Z6kBsr1~l-rAL?)Iu>4@FpCW1Qp)b6?)Ba0WBHmUjyFvKhLpk$-bWxU zUFg^OCO#W+wL&o~tj{_zCSul79_JuwaIzbu)CbdFr~Pj9BaDrv$C}XIdL3-Hy;E zSM}AL+Q*i(paYMlZW!JE!@f+wO2OKyLv3&IVQ!0i(5hSmW&=njT0Xn$-1C!$jVz!b zQ(q(sKr(k*u-*W`<|zm0`6;(pJ6g;|qL@JDKjlaI=8nkb{)f&P27e1I=Fit}+v{3o zA|fG!rqH5@t2=<=V^%yko^oJjWW<2{9390DGoFUNZ#d$=bya$%7DkzSpy7FQY6odn z&Y`N`J9-{x6~Y%X%ZRUAE*~^2;ZKb(!6_XzhMPSZ=Cc(7*a(?Ic|kY(>mq4icb(IB zwqNFdGawsb;;d zj>a*0LS|DZf%6v@P~ zXpm9`|0RcHrM9$&;=k0_kG?qBS?W$;2F4c}8tR+2HC1JLyg3QVPm(@9B4#}Bk3QQ% z@7}-vFQsaqa4sU5GZXPP6AAc6PAj>H>js&u&|l?Bn6&P4L6Ofp;JmAz`6^Q|77;Q| zwFfk9+Mb;1Vs!t-rF{n3UxPjFFYK$VExw+Z0PfcwA%m*tiY2VRj(A^+bCco}^L@&4 z!L`8GIQ27O`Aq)m({k;i6(luX9v(pqX(3>^Nb_t_<|I#*r|N_7RL!IldkTk3;>5q& z32$$gtv~-;Q0;fY|MlzFT@W}!j8lX<1U^6@@So^j04HN8q{Os~5FG%z2L|K;14KwC zy5u)!SGW6~Dj>qv`Jbbj)-NIPZi zYN={ZEguTdW_RsysMZPj(wu-{c;2@W>MKSN1!HN1f=Up=~hV_l%vbgHb9fOSon1 z655My$N|eVjCsoL=O9d@<43@=AOE1NTA_o#jVARM4X07ux(yvRrv-Wr$BzlRVp!P? zCNv^I@zeOas5Nj_@|gGN7qTqt%a<^R(^oe;kw#yVDEJ7^$gRmYp5Ta7jDTz3zpIYm zvOaz+HjsqpYMsAv1xSpr(E=@I04Iy<_wfLa9=nPP@Sjcz8nTpicIE*E?A_$1OKcoM znr4v9m0Aqa#jQR=ln0&DcH0FK`Gi4RK!22J-gx#agnnIYA|Bc-38}HcJa zXk_Fy8gQl}aA;{0PqNdDb&j38Z9Ulh*7s%G*xlA?Hbgb15nmpENPyq@NEt`}^#I#1 z&)#)ybF;nDZVHWo&|?d8j+{hM}Fu9Zg{E&g?2!1C~>ei(Q=D^(P zVp2!nx3N&SzO9!idTxKl|3)nRZ`7z`He#)r$a3Am@%C`b9`NCp;CKrt=g z$Y&Fai4jRa$A^by!X%YgyJ7M{2?@jklUwe;u->;A1%euPcX!0R!?#iEp}9GUl_O?s z&QhNvr_erzK0$$N{`8pSQS1B9B?$-#0YJcH+qmv$NHQN98Vb6;zUD4|@JLW-E_+~Q zS5O*xNB+ZeBS*(O85tRLcOO1@PNTy{5f|VR)xiU14J{fNcma}9Jf#JvkUj<_LF$&~ zX2|*ZxlskQlIEe*9n%ni#~mCv552EUZE($?#(^8Uzis)&U5%>ZW^RdNNnyqIBV{Zs z9%v_p_9J~ZrRD#*hg`c*Q`}baPJ4R@KE7_@SXYsUB=QdQgAaCFTN@Aox73g&FC`rv z#UUZx-ELSb!~#kYh0T%}2{<{HhoI`ul6adU3g{p%jRk^>D(1h2{PR=R(QyeIS(b{v zm+J#Or61`(J?|9M#{dI@ZvQi1${$kdKWWO7S6E2E`W_GD7M8ZQ_Ye#bx8KNTOPQK7 zg9>$~YCf=T{*|rXY?32bYoN5fCttGNNh2 zL`)t`rh9-PG;s!pud#quDG_$VBH{tF7}0}~ia|_*epca$E%!B7VNl4Iq1q2=wbnx0I2hUAMtPB2LJl?t0Y(!&kQQ782tr4GBzg7lmKd} zw!h17E5y-(TGyke&z?CQuD!IKt|o@HfnKZ3%1VCQWs-Jn1kMnE_>~C-eb02 z=|auyni?T98SpC7CgpwLMhcKKf)*@G2ZxiCqJ{=ql1MCY#tgUpb*Ft*c2N-_p#CxF zr$Ap&ZEbBlEC~HlLtK~xxT>nEm*On5)$HDdwlH91tUGo{I1VIl)nw?bpETO6B7}j$trN4Xob?` zvMn_H63)Df-TPfCJPN&GxK;3b4<48TSRQN#$b$OY)vSDc8u9Mn1jvvGziz7ZGsM?} zohHn9v3k@9p6jP2uYY=|ZXpmpel;ChkCBmC?~Kkl2DEiJ6%h12Z!w zFh+nXYHDhN%dM=ev`bCoRLm3McT9tdJM{`i_jf2y5i#%5-Kie_XCkoqg?d$|H}qoO z?{=_1h(9X1m;*MzgUyJDZ!bFJBUa zD`1crkB)XLne05TfB^n1vt!333~*k)1AzoMK<{!I zxTbferKjVk_d^*x5%Imt!C@2jRm@^yGX?NdVU`CEa6lXiHU)X^&*5QA$is&Z13OHJ zX?CWgehd!Yr4bPojRs6W+!3RE93aPvFJAQrs+pQ*8}+fpi*}$FTzvUD(%HoY0A~{u z6SSgy&dFh9VS$3$$=Xo%zmjeA^-?jfhFv5Za)9y50tYP^1am?4Pe($?TeAz<(MPVE^G?OFUw zu*IP951TX9iZ|_Ls;;iK_L@@@C!z%G-lIo*-X9(}#sU=ut~qe66dM~`C12hDh8934 zz$YZ6r*Cj8o4DRKgVYohL_y;ff=W_?Y8L2zk2ghjraS^m-_n?7Dt}NUJN}W~Qd$2t zIPy2VI2SP9+P!Y)AEJy(9?+MOp#cV1n0p7;B*rfwK!Toym4m~5Dqv?;3}wtzs$E~4 zDm5EBwC-B%vKl+(UpF%l9%(<GUsO=3y4 zXCaJch@Xaa(dZ}fkCd7tGW4-sE2OnsyI8Q{ZEDZtM&ccgbA;<2RvVX#D-hGt((bN4 z1R+i4oJP*uyLO5#=JL|Fae?j8BY?U7oWw*&qp3Xcevo|reW7Vn+Xv7 zCB)g-ILio=GS6>B+}@|&>um9NyVr8c=5c#q=l-W@JGW0S${n^W zmwfOr?<&7my{tCol~BJ+OG^+byU3>;BM+*}B;Sc4vC#TYpMp_8Qq$8PM>LeNMb+1f zK79YQd)XPR`z|^8g0F&?lQRyr@+i62>EhT9rS`0W7E}^InFZt+edBVV?AMhJ!j!eu zlP9- zgCFR9l#y~T(V!HFK7R0RX=&+9Svxl;M~Wp8{4uh#6QuLoE#f4sW4g7=hKZ{SRD#0E zv6NVvp-JW&J*Ady_NXRChP(>5uy+Nj-Uv{Ft?f6-oyH3e5F8j1d+5&Se;RSkgQfyW z6B8z3VPW8EnPfNJMap&ALA*Pyi0w#fu(h#SniI-2=agYKLU0L8`*5B5{Ia7LD9Zzi zGk5B-HQDMwnl8obxOWc-4C|0ExD0MPRY?GhvR#4RuifEdRpJJ|W)<2FV9h;}+nR;C zp`c$8U^ZM*_qvP#i_Dsu)PV6oJqoql;m{5&!EV^CKx)BbGA3vH%bL4`G%F=?ybbH_ zPnt1%29PRRT3rr27~5)cYMY6nBAs9>xU4-JS<1+%KY)RaK@Z+cObyaa{lc zJ6@f;wRd(df~Gj=yl2lNetrsohF9VedY2<&Vmcn6d~ZPj4)WY6tlE{hIgl7ZBOCO> zSQgO5C2WY%mMu{_+)*q9B!&J{7*HkPd)QI_6re$wDP_GsTJ=_2o0w)>{CfJ;9paxwx zm-C2|iXY#;u>pyCDlsB(AvZYjv{_k0bdv5G1_pGf7c7ZhN>%<>-hkKyFJ&^<=y%DD z7a9y;6`dLocKgZ5FLv=NC$wH39nI$^IU9fCY`P>VEiFAg-w0p$vbkxC9tRpqL2_Fu z`TqTTU(R{Z(eNh@fbfW}yF4L~+f&ahh@@qM8eLhCP=NL>`L{(@+}zyI(wcH;iUA#k z*QeA1_RY5ZOWQMb=+izs4P8Wn7DyysUuHu?#$ZVLs_)isKJXSPujAoZ5q>IhD|hLA zV@(u6CW`Wc5eSPb?3v7?vUhm{`v@p@X6lmXDg$o(!J{#Owo|lZB`V`Tek81$i3L%7 zAG5E{W5=CZvQoEDyUL!{#MHFZZ9@~#?)VN(SNv$uDBTSU4y2~vlo+=`KS%`70ZbgY6xZZ)VqbqSAac5v9p|_?!5svL z#4aBIz3Ehz03H6IFaF=jKd=6L;om|P;DdXdCFRff;iHU*%p-qwM_R-#&N)BvKd@EW zXnrv=JZkEL;GZF~O_>l7vLXzpk@ZF9XsjE@X$EC9Vb%I1=9FVJ*&A!OleN>%=xXbu zT)k<&_!M}Bg@^9yXyA+91}Ts|Kc4sqOaxg0cqv07>0{Y^AL&c7U?8{@19j~n) zomknNTU&WDAaF6`taHjhBg;4K(qO}N+m1KrR<5k~0})Tc|2y~t5pFQ|t=PuK#&~a#5CPmB25;}`l3_}S*zWD_ZazC$l{( zxZP8}U=+aW@DFhSHEI?R`~{yYFx_jlL&JXXg+ct_{5%5){EUe`rx<3bN?`!m!U)BE zhl&B#hP7dd2v-0^XD`}3*;>TWJ|Mhl1YncG5IAG4+$zyX&)S;R;a1Vp=g-MM&y-t{0(v`yRpbM~y;O_^PT`D!4ZrMBYjm}jAHPDE zAmhbdN3s7PVh{{y09p;UgTvtfy#fr2rosR`0U;THFaX7{t%gBvV$$&@^9Kupq4Snu zOqFKA@*MZB1=S;gEnb!XOa!1X=IQZ5>GCXiuT|>i*50fJ%x7O9oO^PEq z`}1e4`}gmImL;zA{!4$*vz?r;&YFNi5rwqO@96_XijKlf`@s5w4_-bb1Jz|&kVOSF zI@i$1$;mxrXP5K$Z#4QS%J{jaW^&`mi9ZCuPZS~+^sSw_J-_vD9>b5hY7qDU;W$h8 z2CiT4Ib=s=V{gx4%TFCR-w*h4d@2)Q?4X=gjC9;vl&iAo88tUElPzg~lx*>&rwuz9 z4-e0%R2%Ce!{_C|5pV}|+cPe{9380oWoMx#29l~9Kta~S|12*@rr|IWp7eMrSEpg* zc6Q3Qr06hsy^%snzHZOPC0$-w2{xu|Z*NBfAH`?SWIzWk$Q6dN75?1{-?RP99|MDf z9#j1P3;xZ_%xpG&1RCu@O@S8L4Hw@ zJdhC-3iUK~`T{&U8|LRkVxADtO2Yt)K7u&=`qndSS;83Zl9PK)@AQKDRY4}Bo7jtg zYrOka9Q^479^2DFs`;`2#UzzMz|3qbY)pxKnTgO?r~g_M{Oz^+5X z!y!Ni06?1uMd4dLW;|<0L4|)$s_!VJbWa_=#3RKfOqHViKjP#cd?}#UvL8wMTDv_K zza0Gp==6VSP z2q4S!u}i6c_E0wwR3v-Ia=KMEkojH*-*w|Yl;L;!e4mk#5yWF>_Q=!VwaB#+`_YM> z9OOAW0Ti8V=%TVCVq*zUUC4luF#_BNk|w((d4GR#i9mf-RVGS7T2O}r&crVbh?I;5 z2Lg!kJ!|Ot`uf_=&fUUi9v)SC`q!Z4HCUhwA0L0lT;xZzX95KShX*3YV|AWl~;4pwYz=`_jaR>`j0sL?C5il<#k@w61 zY#}g{lf#y{LI?WpjzuSqJlq-owo|h-L0@lMAd^1o>MM`n5GBW{aFeu&VB0unu z=x!W|D9f|`Wsv57ERULswm<;JAvnx%a|VmaagB7$6uk<-oC@K4woqgl9OM-s4MQ^! z0J?MW^74+2rja>{y#_=|)7`3tq>j%WcEM;f0sN7yXX(_|PwR@jf`X-SVG6zD?}ddi z0jq&Y4KM<*?dY(Y9WrCTItRD3w_lm#n@{Q(S$8$&#)$3u4MTq=mj%9?`roit;2S1T zC(hC=7@D0G|1Z`Ga)jogGKWMv|2tWQj!FLzVSu~By^V%6G~kdC_>=z&dle*~9R#?? zN!zedYl01YyCvHHJn_Gz*N6UQOWwC=iYyeL6p*)4|8qv*VF0xXyqys*)zIW*4=3pp zK>Y!PnN?Pn2#t@NcjCtcwf~?XjKia&p|4ti{{wy005pRhZ1Axicw$FT>H5wF{I4+= zC8$M%NrYAmneHVhHjYkCMz*v_QNo}wBBBs;9T4jr!Fs1om_;67Gq4&A;?VP+oB)C; zPL?SKaddKG3JedRazH-#76(#u0u*w~1o-BkA|PIX^*~9Pl7{BBLGfzN@Ver?UzELP zAOCn`0epol)A{+B0g(cE=c>+JmxHDA{D)IkpFH+wf{toU&aUDLxoTat2*d5=rPaT_ zX6nmg>N#wdSNa*@!7DuA2}vT!f}`b`Il;RwEEt34{#jhQDgz8IseZ}HmoeXxNX#md zne<$2rXLnGkfquQFlr=AepOxk?RVebPGf#t6T7IAEc}~c+VW{m-built-from-ce-ee` -1. Trigger a pipeline and build the docs site with your changes + project named after the scheme: `preview-` +1. Trigger a cross project pipeline and build the docs site with your changes -Look for the docs URL at the output of the `build-docs` job. +After a few minutes, the Review App will be deployed and you will be able to +preview the changes. The docs URL can be found in two places: ->**Note:** +- In the merge request widget +- In the output of the `review-docs-deploy` job, which also includes the + triggered pipeline so that you can investigate whether something went wrong + +In case the Review App URL returns 404, follow these steps to debug: + +1. **Did you follow the URL from the merge request widget?** If yes, then check if + the link is the same as the one in the job output. It can happen that if the + branch name slug is longer than 35 characters, it is automatically + truncated. That means that the merge request widget will not show the proper + URL due to a limitation of how `environment: url` works, but you can find the + real URL from the output of the `review-docs-deploy` job. +1. **Did you follow the URL from the job output?** If yes, then it means that + either the site is not yet deployed or something went wrong with the remote + pipeline. Give it a few minutes and it should appear online, otherwise you + can check the status of the remote pipeline from the link in the job output. + If the pipeline failed or got stuck, drop a line in the `#docs` chat channel. + +TIP: **Tip:** +Someone that has no merge rights to the CE/EE projects (think of forks from +contributors) will not be able to run the manual job. In that case, you can +ask someone from the GitLab team who has the permissions to do that for you. + +NOTE: **Note:** Make sure that you always delete the branch of the merge request you were working on. If you don't, the remote docs branch won't be removed either, and the server where the Review Apps are hosted will eventually be out of disk space. + +### Behind the scenes + +If you want to know the hot details, here's what's really happening: + +1. You manually run the `review-docs-deploy` job in a CE/EE merge request. +1. The job runs the [`scirpts/trigger-build-docs`](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/scripts/trigger-build-docs) + script with the `deploy` flag, which in turn: + 1. Takes your branch name and applies the following: + - The slug of the branch name is used to avoid special characters since + ultimately this will be used by NGINX. + - The `preview-` prefix is added to avoid conflicts if there's a remote branch + with the same name that you created in the merge request. + - The final branch name is truncated to 42 characters to avoid filesystem + limitations with long branch names (> 63 chars). + 1. The remote branch is then created if it doesn't exist (meaning you can + re-run the manual job as many times as you want and this step will be skipped). + 1. A new cross-project pipeline is triggered in the docs project. + 1. The preview URL is shown both at the job output and in the merge request + widget. You also get the link to the remote pipeline. +1. In the docs project, the pipeline is created and it + [skips the test jobs](https://gitlab.com/gitlab-com/gitlab-docs/blob/8d5d5c750c602a835614b02f9db42ead1c4b2f5e/.gitlab-ci.yml#L50-55) + to lower the build time. +1. Once the docs site is built, the HTML files are uploaded as artifacts. +1. A specific Runner tied only to the docs project, runs the Review App job + that downloads the artifacts and uses `rsync` to transfer the files over + to a location where NGINX serves them. + +The following GitLab features are used among others: + +- [Manual actions](../ci/yaml/README.md#manual-actions) +- [Multi project pipelines](https://docs.gitlab.com/ee/ci/multi_project_pipeline_graphs.html) +- [Review Apps](../ci/review_apps/index.md) +- [Artifacts](../ci/yaml/README.md#artifacts) +- [Specific Runner](../ci/runners/README.md#locking-a-specific-runner-from-being-enabled-for-other-projects) diff --git a/scripts/trigger-build-docs b/scripts/trigger-build-docs index 44f832ed3e6..d3a9f5ff4ea 100755 --- a/scripts/trigger-build-docs +++ b/scripts/trigger-build-docs @@ -2,13 +2,6 @@ require 'gitlab' -# -# Give the remote branch a different name than the current one -# in order to avoid conflicts -# -@docs_branch = "#{ENV["CI_COMMIT_REF_SLUG"]}-built-from-ce-ee" -GITLAB_DOCS_REPO = 'gitlab-com/gitlab-docs'.freeze - # # Configure credentials to be used with gitlab gem # @@ -17,6 +10,26 @@ Gitlab.configure do |config| config.private_token = ENV["DOCS_API_TOKEN"] # GitLab Docs bot access token which has only Developer access to gitlab-docs end +# +# The remote docs project +# +GITLAB_DOCS_REPO = 'gitlab-com/gitlab-docs'.freeze + +# +# Truncate the remote docs branch name if it's more than 63 characters +# otherwise we hit the filesystem limit and the directory name where +# NGINX serves the site won't match the branch name. +# +def docs_branch + # The maximum string length a file can have on a filesystem (ext4) + # is 63 characters. Let's use something smaller to be 100% sure. + max = 42 + # Prefix the remote branch with 'preview-' in order to avoid + # name conflicts in the rare case the branch name already + # exists in the docs repo and truncate to max length. + "preview-#{ENV["CI_COMMIT_REF_SLUG"]}"[0...max] +end + # # Dummy way to find out in which repo we are, CE or EE # @@ -28,18 +41,18 @@ end # Create a remote branch in gitlab-docs # def create_remote_branch - Gitlab.create_branch(GITLAB_DOCS_REPO, @docs_branch, 'master') - puts "Remote branch '#{@docs_branch}' created" + Gitlab.create_branch(GITLAB_DOCS_REPO, docs_branch, 'master') + puts "Remote branch '#{docs_branch}' created" rescue Gitlab::Error::BadRequest - puts "Remote branch '#{@docs_branch}' already exists" + puts "Remote branch '#{docs_branch}' already exists" end # # Remove a remote branch in gitlab-docs # def remove_remote_branch - Gitlab.delete_branch(GITLAB_DOCS_REPO, @docs_branch) - puts "Remote branch '#{@docs_branch}' deleted" + Gitlab.delete_branch(GITLAB_DOCS_REPO, docs_branch) + puts "Remote branch '#{docs_branch}' deleted" end # @@ -50,11 +63,11 @@ def trigger_pipeline param_name = ee? ? 'BRANCH_EE' : 'BRANCH_CE' # The review app URL - app_url = "http://#{@docs_branch}.#{ENV["DOCS_REVIEW_APPS_DOMAIN"]}/#{ee? ? 'ee' : 'ce'}" + app_url = "http://#{docs_branch}.#{ENV["DOCS_REVIEW_APPS_DOMAIN"]}/#{ee? ? 'ee' : 'ce'}" # Create the pipeline puts "=> Triggering a pipeline..." - pipeline = Gitlab.run_trigger(GITLAB_DOCS_REPO, ENV["DOCS_TRIGGER_TOKEN"], @docs_branch, { param_name => ENV["CI_COMMIT_REF_NAME"] }) + pipeline = Gitlab.run_trigger(GITLAB_DOCS_REPO, ENV["CI_JOB_TOKEN"], docs_branch, { param_name => ENV["CI_COMMIT_REF_NAME"] }) puts "=> Pipeline created:" puts "" @@ -77,4 +90,8 @@ when 'deploy' trigger_pipeline when 'cleanup' remove_remote_branch +else + puts "Please provide a valid option: + deploy - Creates the remote branch and triggers a pipeline + cleanup - Deletes the remote branch and stops the Review App" end