From 31980d8011ec8bf0ea00272005362f7d486c2096 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 22 Dec 2025 14:51:15 -0600 Subject: [PATCH 01/64] fix openssl CRL error Signed-off-by: Corey Hemminger --- lib/mixlib/install/version.rb | 2 +- mixlib-install-3.12.32.pre.dev.gem | Bin 0 -> 42495 bytes mixlib-install.gemspec | 15 +++++++++++++++ 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 mixlib-install-3.12.32.pre.dev.gem diff --git a/lib/mixlib/install/version.rb b/lib/mixlib/install/version.rb index 59dea9d9..b611fba9 100644 --- a/lib/mixlib/install/version.rb +++ b/lib/mixlib/install/version.rb @@ -1,5 +1,5 @@ module Mixlib class Install - VERSION = "3.12.32" + VERSION = "3.12.32-dev" end end diff --git a/mixlib-install-3.12.32.pre.dev.gem b/mixlib-install-3.12.32.pre.dev.gem new file mode 100644 index 0000000000000000000000000000000000000000..76cb003a96c7d5305a4f8262d63e8ead02fcef45 GIT binary patch literal 42495 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 literal 0 HcmV?d00001 diff --git a/mixlib-install.gemspec b/mixlib-install.gemspec index e7b607f5..ddca569c 100644 --- a/mixlib-install.gemspec +++ b/mixlib-install.gemspec @@ -19,5 +19,20 @@ Gem::Specification.new do |spec| spec.add_dependency "mixlib-shellout" spec.add_dependency "mixlib-versioning" + + # OpenSSL version requirements based on Ruby version for CRL check issue fix + # Ruby 3.4.x requires openssl gem >= 3.3.1 + # Ruby 3.3.x requires openssl gem >= 3.2.2 + # Ruby 3.2.x requires openssl gem >= 3.1.2 + if RUBY_VERSION >= "3.4.0" + spec.add_dependency "openssl", ">= 3.3.1", "< 4.0" + elsif RUBY_VERSION >= "3.3.0" + spec.add_dependency "openssl", ">= 3.2.2", "< 4.0" + elsif RUBY_VERSION >= "3.2.0" + spec.add_dependency "openssl", ">= 3.1.2", "< 4.0" + else + spec.add_dependency "openssl", ">= 3.0", "< 4.0" + end + spec.add_dependency "thor" end From ef8ea46a0eaa896e499426761920ed8d5c3c0d2e Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 22 Dec 2025 14:59:41 -0600 Subject: [PATCH 02/64] simplify openssl dep version Signed-off-by: Corey Hemminger --- mixlib-install-3.12.32.pre.dev.gem | Bin 42495 -> 42496 bytes mixlib-install.gemspec | 16 +--------------- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/mixlib-install-3.12.32.pre.dev.gem b/mixlib-install-3.12.32.pre.dev.gem index 76cb003a96c7d5305a4f8262d63e8ead02fcef45..56c0efe680c20699d7305f20565cfb88353f9287 100644 GIT binary patch delta 12592 zcmZ9SV_W7Aw6?Qt+qP{?w%yd^rkcA6ziiu+ZP#Smw(TbC`M-LOz4tnL|iZ)CkGfC2L}%)FE1w#8ygrKJ0}+x7Z@2^q8Yel{U3PnL<9&l02)3F%A5c* z0}9RojtVV;=y)!Trml|FfN=mg-YC3WYdY5tqA7GwG~do-jh%ktGsCN=ZI&;IR|fnB zo|!dWylutG4dwk6mc^MF!t{!0iWDTZ1hK5}4gK8a%lCG;~g{ zmZ^e&TeH?g$1gGhrbc(b1+88sxO&Bly=Yg~Uwf4O&3v)6hfK@8*nZ*!U#>Q7M1n5j zs=pxh5C zs3I66h|+~c0ao!QF&T=4YWE}e%1}%AH`Lp5le3K>vt*1yXz1 znRpDQh5M4+LG{YKFl>^vIygeRBHZ0^?Jop}D3tpTja)(?BoEVhWi7jRw_@7KQXWQ* zHYsKToV_yV8)j+E<1dFl@LCj|0YyvUPoaG$b{vnmTwSrZ=9lQXtVG*sDcGilKzEbV z<^C=@PUb4j18zLe1q1XtksM*oF9Y_hKUKu9g?Gfi>lZ86PdBRy#G8C11*>fyDvZ)& zb6x*|OCl@-cm>QXV9D*}P~6Knfe!i%#(P9;ZZYQCWCXafvvOv$g<1CA6{E}Pxta-K z#fR~j0zuG0kXwjHhgc0J-GTVmZgkUWB^FBMASUY^EEkpujOo--;y-#7L>*H-jPHLl zeRNuXQA5Wb1s2a5NeCIY%;DdC_eN{Y{8OQLIN!r9)mY#`(13|rRYYDe-=nFt8Jw0T z!oI?N$tYMvY?Uf7Y-i@5y?nRA&im&#Oe2FstD$@RvdsT^ybCCU3x~DC z6u+zQ)8+H=9TZt$^IDNKM0WDrrE(c9Fm*w%g%bhllO~KTS;5^D3_mw^@1;od@4+uH=xqAcHfPtXP3*+= z#n{dGlT~&w0f$Oqg6=Ao&h4NS=bcq%)_-Z7s^1+Naw=Eq*)uIRS52<$O3!<*LKRSslNX|9w#a%1 zqhP0*`t~NFt_+y%sg|<*+TN4xLimSbuChb#R>W7bso0~7N=c^UVbHYIM>n7XDMEO+ zs7(?VW?gJ7wq$B=BJ3wGs^aa?*5Yg-)H)e`Y;0x(^>j^Wxm)~^KTsIn{T!l=$?U{6 z8*1e?enw-IiD_?F9EUPZ|5oB^OzMFNt;DJ_lfA1cybsu|7k-&H%1AykMFzRy)a{y% zjVoH4qf&|^FX;{g|4LJW@Ct>Y*mIu!l>(X&ZS_huSM2LpY=n*4FR!fJ)v$RAu%k3b zR$WswQCedZ%+Ifz^jMnvy4nTTnWUwi6K0!lc*q&US4f^EV9STU(jm6NZEeNOnK#8o z<#HgZ901qJ9MzAm#{pgKj?&m+tHggoGVqCm#^!coT$HY(In-E-C!9UE$nm8MQtcX) zmP86t-+T`)(%n6n2XVDnYc#kVy$@K^ad1?njM;KUE&C5_nEAUvrf{?fb3~rcTjn%(PwT#oSZ<^gdu4Hwcc`I^Et3Mo+k9A3J6Cvo8 z{R&Z2{xzdkn;#2BOy=gkJyG5z{lws=@B?5RD&@qEy3frII_^XpX<=JxqwWuHgJI)jLGBEB42I?fvUzM*)Cg(bXsN=2>awPaSBY=P*QL(m$#MY zd=E+sjG-J`GruDXMGf`f*}md~LpcPzM|#{|71|rMjk{}mezG=KUweFh?TF8QeZM?j zgcaS){sL<5zy4x={Fg5V+SjRm;OWj^IHs2w#F_ff$#%^dSwGmerp}2B6A( z9y2)c4_y%4xT*3`CL&q*DL&FO9cNCtoS;G{z8PV$#r=fuhDCN z$3f@9)It<;wPx6REDgkP0J7GpDi4-bDF%oAi>;WHesmDbnpB=zI7&qbzig-K1PxH- zO4fP}hq+BphEJ02M%gCTz48N1n2|&PcCS^!oUS|dV|&5wg@L4Gq*zc4{NVT*IH*3}mD^A?p%@14>=BP`9pv4k9*j>4lJ6 zF;bAasGU0e_lQqS0euf$PDIV3AF_Wr%~Vz7 z@Eg-QW^d4lf9vE10z)xo2Qx?Y!Pz}rKM4jAg5THu^*-*Rg*-9e?uLdCS2}mM1Ao1F z!5XlxW%pO<2sU6lnD#F$4&o39&PlA8_{05s^gP}t0iLY##wgZKILZTp^_Ikm zwWanYY>P)_e4$W^C;FTJ_Bikg`;*1r^@wwSA`?|k>{|Dej}7Rd#f#!A*P&gO75xOQ zLU~Lg(0!m3;T0{g-WH^MhoZ$`j8njKlkMIaLKPMHHjk<+8^D*9Fu0*bi> z#U(?^+(zrt|9UhoMIpivf-M$ERB6E?#yj2O%N54U)%?W}_4chAWC5=thOvL*8otBI z=1jHvLoj8TyPDLqQ2U5=%0x4HAk#0Ud!8@634pOEA8Sw= zhTF6{9rx^p-5$C-r}sIsT7;t@TdtwA}C4Td3@Thl>Bttk_5c&qz`I}?j5^CzTy|p224*xsD|9VSL@+Lc}nnQ^k$Us<|ob5Ntj^aXi`M_HlIdXp7!E z0(i|X_>37bbk*9s%|l=+bSW31we-)rq>6v(=5CqcsYhovvsy*lqoxz&BX+%PfNjZQ z)~7KxlA#YfPXhl4N&p+-AznanQC*#CHS-rr8cqj}^Xmo~ zoQ~LrAw78NpB{viaEi{XmI05!obPU5=H8nan4nrlRJOv55=0Or?9Y$H6IINdzTPOm+A^dVD1*fO$gZ|HiXe?DRCO;yTU`)dw2p`c&Z5RA& z;}pQ_@{~*5p>;@<%vi{LyI~-#j@?mO{@w<5>wY)k?Q|<~?~YB#wOdJwowz+lPyG0< zw%@qAn-v`3Kc*nn*&M^8gyaVL66x|)2X)dIGm0<&SWW2Hw1#MGUtMV@HUDHz6DLj^ zr(~XOhk2bosmu|qUVX0ynydD}(%y1v#LSo`3gSgeC_zIUzs}$k8ioFyagqo)7!5JI z5+ymJBhES8{6;(^(u$b?Gq_&cT0AMcs(50N_@pNUCTM^1?+ZdsEKjLO<2@A{1pVZ$ zc&aOB4?f`Qf&ot`x4t=7zZ|nDD~Dbu7~>__gpl)eu?uU<(hS4_0I%n=6sWB1IEpYV zc_w~n_&cClcP}6J?V;rz?5lPk2Aq?M%=*p?@*GS1LPPW$iSHQ-X@`79COTz@}?9*HoX>i%5v7VQIObD%af=UEE8V zrGoVqU%RWc7Pdd+CkDRJB<(f3;$D28CyC33$mx&#)|dkb&w{1@r6;Im9Qq}SX}9Zh zLp~8|4pxNYGpV4vfY%U*f22}dA(w=^d6kvYxweIZ(v)#(M@aE{rX7A>P=)XSz^;n) z98&O`XE!u+8#*-1B!^FUclzNw4F>51S=q9pQ1{jChGAbds6`dOSeTT^EcxzQ$ zp_zVI$Nd0|TX2Nw?%G`!31c27c4=wq?Fyp0|J=L#oR#P-{%YK=PL2bpM& zC_kQ@SmVgTMn=)Ls8PpS!iyd!C)*u-f~&JdMnyreh?WsVIu8GkcR{+NH`XR=zQ7M| z2H!n#GWK?OSO6I;%0f=OlY9vNIvoP6oMxyi83CNUX}f zDVh9^F4GdKF_rhYqnG2aUKx3oh@i7h0=s{)?i4)H>pH#pdyvjj0nY=;8L77_y(xv< z<5#h!*f~SYSX6uL!veN}b|f+#yHfa@lhD3mo3vcM)b zjc6e-KxTnOzXq>nDn@i#fRNpm_f}yENcBE!R`U{mi|6E zG1 zMdtD}s7ynaxZ&fua2@RVsg)%f$s0LJTNCiu);MtC`oZ?WI`5~}BrVd=NdS}!IWk=o zGY_K&{~gN!4lKBF-}382uecc)2+OTPBT`?J5My1V#DQ{fm1w$ym~()+MISeG1Zw@a zmS#0f*DAGi#2#`@u5+il-}pzmhlLhQ4eA(gPsd{tggj0#T6syi`vGFmtwkw`c}xj{KBRJDoHxMN8eQUz zEg2nb?@rP#{hK+8bO5GWn1Fhbb(|siMCFPTIN}420&h8mIj9c*971)>@AuLEkdRc1 zh2ni}vS*B_hYU3$gLTNrbslJ$tw5k}hWz0Vm~Br5KFhZV>Pg^G3azj9bS_5%Gl-Il zbvtR%Vpam_6<;A{mFt~OSE8<-k6UXz=waAj>#|o>lwKX#DFZ6iM)4N=CnKpG=JoIV z&S|RI@?FebNlVD6V>e<>tO*p{9L*$qej%0DdZ9!B0VOS}MUlN8b0E=c=>kyJSWdjK#gySBWMC`;%4j zM?4MI3Q!-W;qlwuH%UElmYb1qovHW7pm;V6uR2M^Y6ko*97`|Nof60ne){SOw)v-r z^hEdyn>_QZ?N?_8!7)Y$w2?(x>}{MY{I06saXgXlaPOU{ z$SVO^8817#jNZI(T|Ti9NQ!ra-wSo(B}^Mt@0rYWlxZMxUe(L86>8W}_N0k9LTSu$ zP#L+f^aE>kD@XEH?W^}voSoxpn!?qxtRxobxTX`>=R|YgWrWfld1TlJsQVf8bm~`% zyC|L3iRdGoxFu8O?D-udK?M?{RrXSh&LHU7e6epqn)+zp zcfCWdFq|~YIGex3--=f@8i6# zwb7qsa6ej9WHa+&pI|eutb72sCO!Q+t8Y&=Ji;06SOSiDU#WF=#6F1_)1ZGI&^5Jo zH}&FT)5+4W>#Mc0FDG=FA99Ywb?V%w0KI&ZiyUM${`7rYDi9=z@SODK`mtH7c5DF@86wi!~x** z)NJ?jYpnnlmE=ES^PYP5)p~#OU!K3NX6s7tp~ft=VXV2d{q}wgP%>PCvq5ZJ6HC?b;uv(Iw1{q`js(fF zk=*)8{nWg+StNin(;0dQ^J5w9Na_EB~GckoimlsFf;3z(QVRBHy~M7?$R^nSw+?a8b-oqUhjEpC zPciE~#02}m`?b3KD{**lIM;C%NkZN9mJL33kHC7wLOoU_dLNzkrR#2e%4EgNc937l@9PsviEK+ZLRH zouDvQfWWjnSDI!ur{YFht;3?YKg~~|2w%dSi`k!dqPZM`3h7bIwn!yAyP?PP3zsF~ zk4<-IpHGs_3^et#%d6g&iei_S<)+aL3E%uEE%7s+ZV~89qSjlpn@lA3Rzgt0YS>u1HT@ooLD0obz}Lt^AH? zFP2a&gu^ikMu0e3>hdoL2#p`-C0a7vl|C)Kn*ncfE-`a@#0%cA7lNmn6Xp6c`A+%~ z!}+0982@sx+f?}JLh!tKrB z;a3c0e6b4bYZ>|@-u5b5S!DJuQrV{&+P;s3*C_BM_L>S#n(N~fdU~uaI#}v^07}!D zD;uxWuJRn+P3X^9H*dor#xmg9Y=`_eAcH_Q2QTcn1tFuyfF9(nr$~q)x%cM%Tie7_ z)cdPjN7d9J%-qHhI4UX5B0NeJuONKC@on{n6l-|uC+$IlWgnwv(=^oluT`YXku5v__)>H z)&5Aw)Gr(Xkn||%zbv!P5`0RRnh8ye1uqYuPwkx>Zm9LZD>uELA7eb9u{yq^^wiD? zALHPlTjX6qhEiX93x;wM3-o7(TZxvN)=VADjHASmAu-W<40$D*ht|t4)g|%jam5EV z{I<1;fbEn;y`*fsxo3?Pc$5SeBuO&07`TE^20XcdvwSaw*OOG)V2RT}lQB!&qxs!_ z`jj44onQ+7DBBj-1mVqpfAim4B9t%rzT$7^yEQ(iwLl-WSzq^8pVz-$CR$1(kqLrJ zU}x8U|1<4eRIKj%YxfL<$1>+i^u2za&c1HGTtD%DNf+S3 z!4mcYZmwIeR`6ls?J_ifWKY6l)I!h9u&R0(SEQ3w4%CqoTij7vVoU-}vrLMQ69xRZ z3hSmpRo*H$KJ@c;X4~+oDaO=+(b3I(f>fSzP!6bFWbXMjjGxhRIjRed#ec2K=l>GW?d?Zvy{c>?q8L`)FsA%D z?{U1y#DfWs_yw*)RREqqSakaeasuCy@5{Z9v&LYQhzH3>{KZj)mEtEbel=z={Lv8Y zwU`)^ur5o%K}6aYbLMT)YL0)w@uCz)rLQXdBI*|h>xeY2hCv{P6zqWi;ifdyIv&$Cy$+fX%!1l5zQyQQ zFFy8T&G62F5|3p0X@8q`V1x1!kVBdK*;LQzn&psPVxb#vhx}uoXR9(l?^fH#L=%oE z%8B_M_b?~LPR7Rll^cD7%H`{-Qv>|j9wF)NPH)DK5ft7 z``Sr?MLSc&5|@N&>O^;Jc_0uNQa7<1+BAjoO3f9CGYor0NBormO z;(+@*xQZ!yWz~x7qpH-up$?_ELBUNSc#j_k8s}n_IQADJW3~<}xx=Ri0&65Du{5iL zd?ZH3vJl*Qh2I0{_)n;vbNic}p9F`Zg$3-df!gTAl^)dfRlXN-ZG0$Kg7Pze+tuRA z1os>XV{e%%Aor5!XKTsLYCkQE9P+AgyP#)I%v}hX+RHjsn`C;@!-MGKmVJlQSA$Q- z{n5vxn@|XK2%|&R!}{n!=ku#CYwUJ66p_J4B+{BEKi`B{VTYrXpqp)1%Yag1q>;8Q zz+8m8Ct?}dCdw*k{PU(LRRvV~R3Ax}RC~}&EwoKH&444>Hr$H^CyVayiW(^~xZA3n zVIf_hS^B|F9K8Y_MdnA49Dt@TIOOzvq(8%~#q>8nUWxw4)C*QBkp)BJ*Lrn7#_H9raypk9d{!f*qX;z!M#!>AuoUxReKO*kkDcZsx>>v8i>;b0Ox` ztZyS7fCA&WhP9sH`D>XB20Rv1k|C4|jwzy1RS_Gk6E?(aqF3!8vuYGdW!D*gXEH%0 zwUl%L@$f)_73cL<))&bDA?MRRLYbZhqRP)|W?zXtYH#+0Gn~%6^W4?Cy9F!)5ZF0s zkNw%o-YHJxH$n$p)lTc@5;OD0L>%$rg0ieQo2O?svdXT-k~bq5IRirgTjy!fcIT(|VPMfl>Yb9k0^)*UqL{)^V*+vG}=BmNJ}6(6+Jl ze)cq33Kx}6EX8|gw6Ta>j$P~$;2XcM(zzNC9Mm<)w=svC%(A}kvJBluxGavGQCon9 z?WFE{VOPk%5*$GV?&W|Ld_+@aV_v)zzsR(Ls$-Qokbnz`?j7M-bR1zO)vGqAG{?Au z+pforNgf=*!_OiOd8dSmVbB>8bZTO2&}odgE0uQPC+);wIbP`yrzigj^wo#5JL2(e z($Ph56cM1|_p!rPZ*y9DK`QodY|69b11_;r!bSrKbl8b~jMjA}QRjNyCHKgG3hKR- zQ_oHtabjuOuw@8^Br)Kk^4Yhhh|{Rcb>hDi>x7H zc|OVt6r(_e5f`eqfV`{((DOAt%}yr?Sm3i9NInwE<&-x2`6SWxLGaHWVO|kk;n3{!yScO-KXjjbB1^Diu7Y z%3(|pOfA36Yxxs6YN3JbZi9A8IR#gNYDFFVcvz!dI1f=3J2~LNgRRhMrQFGG47aa8 zu!E+D(wxn+5my>C9{AV|@-Y*$TA6&xV};!({)bh5e#96K>rkvKr*cm_ecy;~LvMhEe3pa1n* z0Z7-x0S0yFtHKa%bM|$3b=Y!cs<@|MmVr^xF#io@2((Q@m*R<}n?_0og~5}gwTnCm z8;=}7zR}0Gub>79DofL66c-mjqx-N@P~Xaoaz9n-{N?9mJEgB@i=x6gK@ay;bIr`N^(&*VGcF?2OpaW*GlzeAOJ4 zL%0gNGrIZBl8oJHV%dQ!V%*>nyZ?I-enm-KKqjE~Gw&P1j|LyXpq%eMXx^#^;C1t= z)UuAu7{K3!Zejs$@WOR(NSYtCZj`8}s2)0Eu@$mfD+NLUot9BfGsVAFw3Tvs1P($c zCA^Ff7BQMTZTvjoDVy2XHgF7{Ju$G{XES_8S=bWNf7q2{TUBzor%+3sY!vHp!Hw(o z<#PiSL$?q=teNP1^KR6O%*V+le{w#X=m}s29>I-cC)82@Xg~&0+h;Y>!KKm}5_v3% z6EC69xhfS%sj{`movJqPx`^r72BuY!(#Q#^{pel<##^cMt6y0%LWp_)!=IlHrXF!% z*h)&!>5`*VHlj_VdHxLdU-n<9+b<@*FPp&CSItL9m$uN?+v)D+%l5CAZ!iVQBH$?^ zTSz)P!w6q+q^!*TAw;n==XC}C0gt`w1((@HcbNkBF^6D0hn1w?WOHfG%nSMAepl5% z9aL^Su8Kq}Z-CxfgD=EWkx1u_tfp*)vZIOV^=>p2Z0iGMirs-qL)&*1e ze~cmF$_nNO@p|zMe?~qUEVlijm-u<`rsQ)I4vfmqv;a8G=H%M^uzfz63Rt6nsG$#> z3d_(a9o(*$-}l-i5g{fr1Hctv1_AYRiq+cAlAiWR4wv-uuoXjb2`o_00)@ZT6{P^g zhd=(0w1pvAK^ktHB^8+F`V+q~MB4QS=_LLgkho>Nl~j13>4aHO(fTtQcy(AlAKdK- zprBTAR0Pv&oY}do9U$7BO*BNWO|C^zpcLd7{?+@l+YYxv3pw&ckv@TMQVKxjfg)VM z*b3b8(h0~t01*j_!a+3k!h;t){@gorI@#sKaeF>e+J5E;F1^BiIBryO+3>4xQF=Pm zB#aR|D7d5kIqfOzopI-Bls=p0I;Zv+gZv#$q>%-BA2HCQVA4 zl5}W2>U<+)xx^fV1=Dfv1Ii88QX*%DmJZ&f5@JW37`nd?yBz{AL)@DtAyCBH#S%i33@Z4YBlFQKn?Aizz%ApK zo3k^M(*RTQ_PKxDJut8r+Omz2P^x3B!XjDImKRJ}2rHK@?ZL%Ij3E()Am{xCj(fN#%V>jlK&@O~;CL)uh>qmSx zp~~KNZPR8#kSVEKZxSdks~o8wYqzwS!h6uv=#orHCUPx%2d4C4oV4n(v>Ka3MD5OT zMhW*ZeOXS&&74t7FB;^Dqdq@w2B+>@Y61dVhC`iV15;tWykM`_2ur`=s_E8$Qt2i} z+M$*7Q@_hLuGg*f)nB5nHn?1On2)sOi8S0qJHTbp_up7_)gwlVo)7PHg~Gu4fI`vV z+Cf|?NDZfhfYl5!t?+aD&<7FZy~_%<=0xs@rgd2SE|%Y(PVq|`ov%WwwjWUQpBDoY zWe%k)+g4YR#UG3@9K|RAVUbz!)5aJck&=oy(RLY=uI z%t^nqTVm3(qgI&2w4E2JU3DU06+x%)lPb@@n#JMQ>C<494`3$gz9ta6PiaLpow%ZW z-9F&~F-hrMf=XDp)RcwI!D{3F>F3xo9m+=y057@kEcwM~7b-cQjR3M$^ z)BTJ0+rvGiRd=^A3Gj-IUGseVw*9tmoCBs*#z|5r#RgN29L%g~(87s>Hfau{O(-a* zX-Sco`ZV}^aGP~2KH|suVA!zhtjwdn(S|pRFjS+JbZNY~-e6iSz{CL-9{4Ax{wA}e z5~rXQ_?AP5M&Rt6QcAz7w~Tn)Gw5!Tz;ZI*5J{u!*h<9{dgcBA|JXP&6(PkH!oevz z*V!bmU!h!f3H8a;aOizrhJ=54fON%(jH*IQZ;+3BP-)sI>moBB`}v+J4mao+r){b|a?t_EI$D!S{Fpyn#J$3M!rq@&5tU Cz#$m` delta 12687 zcmZ9TQ*hr8u*GBB`Ng(vyRq5WM&o?rHnwf6vDMhNt;TMW`+vD}XYTBI*xC2b?4Fsk zfs+tl6AdoZMiftVt%|=8fRs_~3vA1{%022vZy) zlp6{IPAb;TW-@VgHLV7Fzt_!i{>Rn22U9-0jZMkw^YMMoH8Bm6#M3DE8Rh($XFOhS zIDPC4vTO8)nc25O}XvQLdFn<`q=ba(3LV1gRwm`=ivu92})Z-A4eO~ zH#*jpmdK116v>dV7G?lN{Hb9U+n0u#^B?Ify?4K`J{LW!tY!`!0f!GP1|#)vv`Bm4 z1IHX&clx7FU>73tws8iYGGOoOJ!JvOY&=({7R8uK2yztz zrespW1UFTF9Vii9*IgsRZKlPX%1Rm3{!h>TWl5LXu4^<@zUJ_-6svcK_g`O58E;YV zJ!S*`KmBRTg$Tpt%jXZErRsg?5J%hRIk}hwr|4K=*79X1a16C>FotEJWu&*T8mw)l zOgWg647`z*?PY*s1*KQEnC%`uK7SxUzKFvGoG1Z}RgaB?J=5b)IfZLhZHdf4;ds~| z$))yf+7twDv7goidD|#02>3ox=#;6fSeMc+x|K0q-}p913B{1L@>@2j96et$(;e;o zJ^M%Hs*pNgpUe_r^0cSrm zy=<_9x6T@Winw?Ebecwwb5zEfF?xJ`Cs~3SPXaUEsv4$$#dkzLU8>a+4^PW;`Rm!U zC=7a^uG+vcMLD6rJo+HluyxdZpuC}GaHbtWh@t_1S16xxd90}xDF|0)PS#|uINRK> zYD_yJUn4QFbSS}$egI+s{2IFP0IM;tH<<3PyJ{}E^3P27{f2bg#36h(1wkX~R=*o2 zvm1H{mc8pA4~7HVRJeYe*Gn;fG4>BU26M=ONm#|8&dEwJ9wl3+e}{SQIPi{mMl33AN**d?4YG(NNw z%8NB)(rAEx04G1j!J8=~RKX8;uSp9?(fgfY?mCkJnFOw1SsPGQTU%LMtF~i#fcK7m z9=S>*m9dB5zZ%fp+}qpub4o-tjQ_G}X%RJ)B<5CJqO74#;;iI83dq5~k z9>G0~$6avX0`L-?HhQ=PBC593xK7iyU?<(8v`zPSI$jScJ(G;U{uD}(H=MnCTkq-` z{apSOLm`&XGY*8*j5NC$K79?p1(KwEAGn&W_TjN+WM2G-s}c`Xs>-UY_rRISwJRB= z1yEkS{P(Li6L`d_a+69f&c|`u9Q))~ z*1ni{<9>fyZ0)>$yjUaNOv6P(51NYq8#gqn34PJNtbKOa8e>HI@L-66U**cc=ebX4aaO{_E zrSE(9JISA2H5hHgT%i=1OtPihKYGUYKx!0tU3x;BvWN8J5f!rvthYLt~^@eGwDp04}bIL8;B0jQS`S zbdoK243yC=xEhp8k_f2S+_t@RNzp<1Np?Mj32SyLR**c6*OAdOwL*!s1N|Ipkm(sK z>NN4xfDVG6Vw9+jaoW@9GGFeUthwgy zq%pg{OSV=z&U^6nw^$ezY~951+lp2`~1tpzaffGm8M*t zM@|ksq?=v;4cI+}f>4@ihAa1_Bm|i!_V3ZCzTx;r)X*(Nk5c*KsA?3=fQ|4-28&~! zDaFLQ(4w=wCNx?tuQg+R*Wjyz?yRSBio@)dFP4q9^8PUQBmO>FI&4U&q+fS2xFD(% zfjvs6f0ekZx(jO~VyV2sq0eln4`2ticRxuQ*nHd~AqjvnG^ACKBE zE9-oxKy4Rxg|l0PM|CKF|2Tn$Nf5cob|9BKSbjA$;|I4;FB?zgP-dzYn>=Lz8?l96 z?s=z`uu!m*}`wzp0r0R_z{dq)TvEkmZKfY0crpP6vhq@jU%&gz=v!8xqZ1tuowCYynq9e=3 zn2vP*C$uF3D`p*4u^qed=B(^n{jZV3ly|`m=wL|2j31R9c9>O%m6AX1YU>j5&THg~ zfQnvum(Fbvx9o9?mvc8Zx5_16lsdL+4dTd3M;F{efWD6hK}{1`G^Yt0Lg|&U1)s}@ z0}d*r4AG;Y^Wc`C-L46z^swy03K*$1=Alzl)N^B@#}V_2?$K-SYDdq;>sJV@_gCIy z-U{(QchAqS?&+^sP85HvOGC!6x=U;O;Uv$q zj+DayTJT%L4O(h{b~F#JC`Ka(-i@58pk~64WFL-x?#a^QH4om1DVj1VJIrVxnw7ml zkk10wU+!l?J^g}hf5k;o1Rdd%m4r*Xe8K(%hbgqOc^?;4*8X}Q>j|U{N=mAo=8GXE zr36wd;{0A2oCLX#Rm3h~AwF%O2}9;Qw!W-*DCUJW-2IhtHmNnmOky{bT#P9pmZHH7 zZ@@JCim$wvWW4bp{U1Y10W=U$x!+(T)qTi;O1uCQS+jg_F{cZ#Gv-RALuq?o z_KzAbAzjQ@hao4E{~&Ix$>DRs8KL)x(Oe*W*RKfl^E!7z#Kz=#-Ng7aanSHe+%wlV{I`GI1J1S;&t-r1exFu-)`&-kzA^LoqUa`~m$A65hT zx$*4QY~DqC!u$^{1tG>jXc*@$dGWK2A5#kZag@D`ex_5`p&}_0y5k3H0Um&HL`w z=XU>cl;gGY#nNH@_;#J=XT=H}$`jkjSgmM~a+xze^2~VJ75wq8mDQp7@iD@BgSz(yBN{qTA zl#KKn6N=5=^wVVh99Q@r7R0j2v%lMem&D$Uhg~+w6E&#JNc!KR zXh?PMobPYMd7^L{k zY;B0?Pql^O58;A^Tehkd(wqpl)b~^WS`ZSvQwdzSwQJz(IpLFKt`NJnCNI?EPm(JV zSCP*iyeMmw#8%$kug2i1-E63^9Y(5W(0#bB^3$ z<#41O#e=5J^VgF57VDp|&KRku4y6YrbuPMuw!naCryg`!A=T@#o&y0avG5M zQ6OdY=rd6WuezY1To$4S0*YE_u&rojnQMw_W9#sh|_qn^9U>1 zrepmEIuW|avc!nvu7PjEg^*Z}#uRh={s_SZS!dsh0EM~9CUv>!?~$JvV(rVK>d?u> zS*qmFn?$>QKkrFg49^J&A(?o;UTqFe{62x5=AQ&2J2_u|ae0wZ?(U@xzDlqxWUrV0 z<}x*kbdVObZ zkTXspZEMV6xOsgDsS)G~d`>}EkwP=4pF#z7gf}V9 zXt{BL5F7xZ401#hyow{W;As4PXPmj;N(pP#_6v)%F0_Z7AC4Z-x zHwdm3S4B>JoHY4lju31V1X*f`D-et{G(QajlRfSx{hV&a?>(>yIQObqu#4={8 zRS%lhK7+%8gT@ggyL*DT6_MP%zJz-M5`DXwjTppMY}XI$+*rPOEbTYS;c%11&ZGz|!B1bb~f^(q$+BC7GLOi@inkWb5|tl{3k+HW%#n z2?zP^Q96l^-7EUEC*`i@FsnW*OolO3Oa71BQllbN3vo6r@f-T&8x{~A+LkeY_fLv2JSR^63d)@X9W(M8-CLQDN3v{b9 z)T+Hc7;O5nRW*gx0OSSjW$Sbz<)ArJx?z+1cG3IPT|6DIaG=V zoVkC>Ta#Qektn`e{3Pu^+O|umnW`?~K)5?!q!M&Bq7B$ZiMG>;Y3AeSt`kayk=$Pu zIIYpte7kP*T4T1$gId`OXCt&lSgk3YyQ~?=ftOe}5Ju*O0Mi;Ka(q};A@~Nja2iJg z&NeK`pdT%aiuK$|b*M!Qn?i=kCsb#or1#u4i}hO7mBY14RfdIwgyi=vdKdpD&4SNs z(hb-)4N946x8;`bDhHen@`Q}KG}eP=MK39x)TezFazcVwojnWg$T7xl`wsy=1^w*o zI@={82>W(?pg41-1{U?Mt5(NjWG)x_-yg{z4#{-aC#HsZZ@QJ|0_)!^<o{W<$4XZm~9Tc`0M3-kCZ9pdCW}%suU6+MNz#uB zTRkX+6|U{nvYni_Pu-JV!t>6ufk5C9{wDZ-CyzwPCtc+0MqD6ap zp3Zv*k`l0=o|$EDwo(SZp2UJ{czcK4w8um4?0%kCntqXU_r#do51&1jh~yz4wUYGn zd-?kTeycj4fWYYxV<{PQC7A6m~PNTMYcOyDZ;dJ5YLQ=zV2X?=at zLUN`VnLRfk^{V8qV5&6*E7GGjQ;Gvby25l-h{=N{b@1Krcp0C!7Wpy2FIufOgg*H?hi!kr z$8uKuGllE*HBDOW?BBS5DTe~Ck(`?JwF!RO1kXOp1y>N-T_7}%y?2v1DB4;t-Ut+i ztd*!3qrm9Byoae`H?lIlHB*|Mgm_(x^K+){R%`U-v*!UNJ353(`!i~*$Q$}4Dkn|f z={eS7^Q67^w|U^yoxYcE=erZodhP@OijS6FBpr{zVm@j}>p9%xg^qf+!!fjRSZ%)j z)+a?NW);LkV@ynk#D!{-R%7=3%vh{-l`g*+IK3Wj=rPYWJs5ip;@Z*FxH{H=YO@Y) zqIqkOnQ?BBq07%vANa%#O8kX$HHdG{=oUh+5PfC`KH`40kxz{<^5kMg7{#TTZXl!)l!+Km2p@ z{t~9hiE7L7{<7&NpO%X*Bf*SeMN4 zeWAD-&RuAt*20;ARwAhWvh2+$03KsqG;lJj>0T-?YaV`TRJKI7a@1ZtaU;qqKQ&_qQCi_E}U1)EngAT03L(L$8x5vOClO&))%WHMq2;oeqWes`ePNY~~h5-RKV- zsAwHX>geF4%)(8nayYKE7}>uJ78B^XLJkp(Enfo=b;^0PJ5;gJi?Fg9n88Yr%B_SQ z8O7ZNTAJYW6HbyxrpwL6UMJDcgs`qbmKrj6{KcP`q{v=eBS4s3LvedHocJk^;d+u& zuyg3~QdXf4quwtu5&to^tZ))&1zIhfvQpcO`cK~aN+G;+8mUUvOzM8Bbv3`C#c|mA zKb^VO*Bo+9wl9(|Xlq~xe1;{&Sbag+S!fm3{R$ze1mFxQ*TYCTWrESikJ!`HcmFH-d$cRKDK_~ zFQCQaqnJNkkFVjJlhMi)W(mEIs5jqRy$r{4^9Z9qUa24k%nYI( z{hQQ8Jm5am4re!Fs!y46X32sv^}sBn`q)O??G-JR9m1wv?IxRte{23WhBbtihE!#4 zIA)sl7Te|ER!rNogrqCqIMl|pAA>-}(t8j-H}Z}3P;pVTIbe#ixe%RcWDi?13W5z? z%|k8ZcG{atN7@&{iI!4tvn#u<`eQb zqwREPOzjmT_~e3**k+(MIB>K!35!Wt&We-?hJK3Z%UnDB4psK4pVUt(PdESf` zR=|!5t{h4yWK&GJsL_=rJcu+Ue@|s(qWl^B(hreSL{?J4gX9pTMR4kBt6cixU|yZj zVvc?dH%vj8U>$o-RHFw;b~)Zgj2=(rts&tdTdwK$rz96l&oJTz737g#DZ4NP{QkqP zq5BpdOl(8vaR|a==YPuvx0u(Bbj*>$?kE|eM=E(g^iB+n<`TA`YO=odh`0L`Z4923 zMD)I4P(6iL1amWFliXb~DWd)ZP|k;Jh8Ls_`h0}b9}h^Wu|gR`#w4W$6^)^WN;FJG zv>XdG!-^B{${`fmIO#1j9x%6l5@1ctzqrK?ix1c!p8j#BtUO)9^fcJ1f@jKZ850<;vz_G0%@W%uJ8>%>82ovfjTxdg~pt|(GJTY0LyIMwp03K(-AIbaYVh_gT*YW4Y0s4994 z`xdWRq`jXOBpYa>YktluX=g;$W@iy*AwZnO@j#tRZI7#O&(Ihwo2oaJJ!#o+beY=H zC}J+8Zwi^nscA}6LYWVGYJ%T#XxiY5l?D;>)v+po|flu8;BYFCRctvjs z2PS%QWz3Cw&Bs(f6;SMKqmJa=RqWT?FP>&G3Frc4M_63$aahOIB1jJ>^j72XFm}os z8-3nCUOv7Yi~809w4vFyNo7U86=jxgt)2J153fgWR@Od#Hr+V)`il)mDtGI*Vcy%FfKr zkJye**!O#Hcu>4TBtENlcMjWd8dlWB=6JJ-c}+B%A;md>w?bGbRAfDLK*BEnP-Oar zy6FLXGOMX_t3fS>v|nckx!I_nC_7iO9i=&`8mEbOWKXYVE0LqF6@JU;&L26#z7~t( zST`M%JeSD{axP7W+`GE|a|WyW#-^arW?ki#LRI)t_t@Oh z-TL44BXS2sImZRV)+eriy;13m^ulqWjL0?I47(5N`h`RZAn^8AqyirXVBg<|Vs^k! zwL4BW2gpqs7yWnZ4|AMOoJ%FFypnXEiV&X8zoB%W@4^lAxtdya@zDKX%rYlZNTH6R zc6HWbK~~(ezBw)M4?PAxk5p#@XpPH?Anbpw8ukIVEOFHS?#dA)A9u9cv;j8?377xe zxdV6yF<$oQwJF2cuC$e0<#;9xRX_Em%6?>jjlP`i(0!eNx&m}2zq~!ao;&|BwvB(v+&Cu4au|11ld)Lk{gymMTGiS zW)h>obc=BY#V~=M>#!9QRH-s7J|TEHoY;==c){WwJ(cZg zgq5akwOs5?zH_dwtfdFr^PW>=mVZ8WB4b_r;eQ;6)Fj1&{YYY_3;Rhy#;Xqm8C%uT zj^%C*#`R4s=x;_0Z*i=nnN*{Z`nr0M^EhVg<}7jnCgLQlDUo=A?s~1JQvp1@>M-7 z^r1x2PBkTCtnky~q8>xCSefD`U7#qmMJ_@_L{eFrL0$!ZC>|BRimjtj?GDP@o&{Ig0?-GY3sH+zi^UGHerbE;H;sG~n-zd$0~<2K zjI7x0;vJ}Ti^N*;6gRoWE;Y6EL_N? z8hjfZJMth^S%~;!fJOx?1dZapiv2ftgmxAB=N3_m3nsyfi9m+5$SA##vXX?R5G&J0 zvS!n?`e@Wl`6Fsmj+qiFmay;3AFv9tP8mq`RKak?pMM_rD^Y zBLYs_PBW!|x{hhveCb#{fyMRE$g{7_%O}5zby7lasBt0I8|WN4(fgU`2z$Y&8%Hov!eD_pYSV563~2 z2g|B3Eyh#h@c!I(4TeK1LBI_o7N@MyQt?VqI)N<)tC>H(ZVH*~5rM*x5>NywX=zqc7fm zc+f&ja3QUFId}pYq1*18kVFelJ?G?B&LR0*j4$Q7jb!yNaW=ZH+JXF-nA7@Zewt|S82O?JI&>}0-S^Z8mLFx7RDNIr!^g4^ z?&i{O-0I}?GAaK0tFpDZ`y@dC3Jn6^Mvc2m(aP*jy{vYwrQ8;Mp(pL(i0!)anZH0W zrna(AgmN#m+Q%K4nS7++6d~MIdVjCiDn0Pk2MTGQf{9-YUEHt!S7<1%y)*?tyByu> z6&hHj^W*iVMnjc@(ae~2baFfB1-;pbW|TSfv5tGde=e04c@3;A5w%72v~LQgCb%if zBqsyo*og^!9h)fnmMfCHp|&tO?Ifxv)WKV1d|dwE%U=Ss`qqJBdCyj87jd7Vn``73 z9ilhVG<)qqEDfY-)p9ztuz4R~gY{+%#RzX%OBPpumC0owNGu_x#c^y~q&Y)C4e5tJ zOn4?8Ca=nFMEC+N*J?kCGwGxV^XZ1T&A0%W3+7A``2yXnT)q-h5I8&Lz^bH`?+n`~ zV1v14KDL6O245a5F&CT}*&Xpd2>&h~G+v+eSK>QLslX|n*27;RSxv%Z=5=(gr z42MDPc+l*%^(;RS_kGzJplzZ592pz2-c+>gE1IKcQ7|Zc#~FUvp{7msM$$C0ZAO z%SQ&1LhLUzHu<8Rp19guWMz8S^USi8MBr{a&cXHh?)$7?l!pWFTr1A3Y(F&~QFxjT zLf?<RXU4$Q^L++?c^(7*H>kV zI=GLbX0<rnmRY)u556@{ESQm#_halt`u!&KbpPfa+EUDU*UROL;goe}a3rWrx>B6^&b! zSLCufguj}i_$X5vp2f;BVZOkA&@ApZhA)}E$hUY_bz7i!37BZ3)T@1C&I~8wSt?Zf z*yy_?1*ZpPA+Z0%h@1_uO_G4rJpNky6tOq~&W=2zzUn{khkZW(U6=jzJOOr&Xb2R2 zY+xAuJI-476ta3>;u@Uud64bEJu@38N%H>%03pS z{`x#V7lFJ|mPMw6FY}rTteyU4!*&tza%ziQBs-VnJL~c{uXbI`KsYub8>-g+qv6cH z9|*bN6|5hxJ}UiIQTJ+-#8O?sF~e=kbKw@r8{^}8WoZ_BF(6U(Jrn%ZNOCRsHcTEZ zvJ4Lvj3e?SvjW}p8JB`mTn~jzYTPI~0n(P`r>kp@A@#u!FTSI0@f!b|Vq;Nb2M$+*MEKdO=Ke#5O z?r@kCi5zMW%c@!T{$|4Y4am1VBp+Vz0v>DY6J+j+u}&@+N{~!-Z}^L$I9(cI6Uk-18!CLXp2pDaSD_Kgli1~AM+>7&F8 zC+|W3V@aHLYBylOfi7BDz0xCE($F&3wlHMpvWoVpq}w5zkVk1(^Rr?KX{FbVrPtFR zscS}#I*hr!6~TS5*y)7Tcv>q)k^Tz!XL|Cwp}pO|aWL3AvON*f-5uh&g+jmJjg?xR z=Y8So5;Ne{72GS?Nfb530<3?=3lX@$(uZdg=vm_QG$04LS>OdsYPXo&(hNF-%4Ut7 z;I3Is%}C;g3tia%3#7a)Sc82(a85ThmPY9ei^Rvu7()_c&xTR)^G#KX*tc@Gfq!`p zFD0?*8MFnZ4|dZ=Fx`I5v{6Gk!kXO@9!`Eu&*yjFiJK4SgZ6OnUkCC|FX<^NZ>#smM9X`hxd@5F`QgYQ8O{IFw5+c4(}hGu3SsSU%ykv zD_1TaUp}uGA_4?+XY%f2V?F&|Z{H8vN5M+cNFcOG)43mLN68c(EMzce|FpW=Dm46f z9Co;5ytotAy?%KdE1C>iy|Bc|#*O~LP1HJ`5Hp%Yo3yY1H!$pi5nEyS z%Oa5^h@OK&pq*=GKDiw5J!WN|kA=RNWK>EL82un)|A7!cvo-?1?jzgi&*yF6(!Yn^ z;oh|ocdt7&&w8nli5mn$+34o?3YrQ_a!F}-wOZz6yBZ-;ye=zR1aD+3n1MJ diff --git a/mixlib-install.gemspec b/mixlib-install.gemspec index ddca569c..84039ff2 100644 --- a/mixlib-install.gemspec +++ b/mixlib-install.gemspec @@ -19,20 +19,6 @@ Gem::Specification.new do |spec| spec.add_dependency "mixlib-shellout" spec.add_dependency "mixlib-versioning" - - # OpenSSL version requirements based on Ruby version for CRL check issue fix - # Ruby 3.4.x requires openssl gem >= 3.3.1 - # Ruby 3.3.x requires openssl gem >= 3.2.2 - # Ruby 3.2.x requires openssl gem >= 3.1.2 - if RUBY_VERSION >= "3.4.0" - spec.add_dependency "openssl", ">= 3.3.1", "< 4.0" - elsif RUBY_VERSION >= "3.3.0" - spec.add_dependency "openssl", ">= 3.2.2", "< 4.0" - elsif RUBY_VERSION >= "3.2.0" - spec.add_dependency "openssl", ">= 3.1.2", "< 4.0" - else - spec.add_dependency "openssl", ">= 3.0", "< 4.0" - end - + spec.add_dependency "openssl", ">= 3.3.1" # ruby CRL check issues exist in ruby's bundled openssl version spec.add_dependency "thor" end From 6a6a8e9684b8a36cdca5e2a1af3c6e6044ebb14d Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 22 Dec 2025 15:05:04 -0600 Subject: [PATCH 03/64] remove dev from gem version Signed-off-by: Corey Hemminger --- lib/mixlib/install/version.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mixlib/install/version.rb b/lib/mixlib/install/version.rb index b611fba9..59dea9d9 100644 --- a/lib/mixlib/install/version.rb +++ b/lib/mixlib/install/version.rb @@ -1,5 +1,5 @@ module Mixlib class Install - VERSION = "3.12.32-dev" + VERSION = "3.12.32" end end From 175f6b06c87dce5b949342ae39e9e62d6100222b Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 22 Dec 2025 15:15:14 -0600 Subject: [PATCH 04/64] update test to use ruby 3.1 and 3.4 Signed-off-by: Corey Hemminger --- .expeditor/verify.pipeline.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.expeditor/verify.pipeline.yml b/.expeditor/verify.pipeline.yml index 19ca7f91..2ee090a5 100644 --- a/.expeditor/verify.pipeline.yml +++ b/.expeditor/verify.pipeline.yml @@ -11,13 +11,13 @@ expeditor: steps: -- label: run-specs-ruby-2.7 +- label: run-specs-ruby-3.1 command: - .expeditor/run_linux_tests.sh rake expeditor: executor: docker: - image: ruby:2.7 + image: ruby:3.1 - label: run-specs-ruby-3.0 command: @@ -25,17 +25,17 @@ steps: expeditor: executor: docker: - image: ruby:3.0 + image: ruby:3.1 -- label: run-specs-ruby-3.1 +- label: run-specs-ruby-3.4 command: - .expeditor/run_linux_tests.sh rake expeditor: executor: docker: - image: ruby:3.1 + image: ruby:3.4 -- label: run-specs-ruby-3.0-windows +- label: run-specs-ruby-3.1-windows command: - .expeditor/run_windows_tests.ps1 expeditor: @@ -43,10 +43,10 @@ steps: docker: host_os: windows shell: ["powershell", "-Command"] - image: rubydistros/windows-2019:3.0 + image: rubydistros/windows-2019:3.1 user: 'NT AUTHORITY\SYSTEM' -- label: run-specs-ruby-3.1-windows +- label: run-specs-ruby-3.4-windows command: - .expeditor/run_windows_tests.ps1 expeditor: @@ -54,5 +54,5 @@ steps: docker: host_os: windows shell: ["powershell", "-Command"] - image: rubydistros/windows-2019:3.1 + image: rubydistros/windows-2019:3.4 user: 'NT AUTHORITY\SYSTEM' From 65907274c372045fdd6a844665bd01be606c52a9 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 22 Dec 2025 15:35:56 -0600 Subject: [PATCH 05/64] remove testing build of gem from repo Signed-off-by: Corey Hemminger --- .gitignore | 1 + mixlib-install-3.12.32.pre.dev.gem | Bin 42496 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 mixlib-install-3.12.32.pre.dev.gem diff --git a/.gitignore b/.gitignore index cbef319b..3e8bb38b 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ tags .ruby-version .kitchen/ .kitchen.local.yml +mixlib-install-*.gem diff --git a/mixlib-install-3.12.32.pre.dev.gem b/mixlib-install-3.12.32.pre.dev.gem deleted file mode 100644 index 56c0efe680c20699d7305f20565cfb88353f9287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42496 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Μ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 From 88636988b53468351a22f52204634134e8bc6036 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 17:26:03 -0600 Subject: [PATCH 06/64] test Signed-off-by: Corey Hemminger --- .expeditor/verify.pipeline.yml | 79 +++++++++++++++++++++++++++++++++- mixlib-install.gemspec | 2 +- 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/.expeditor/verify.pipeline.yml b/.expeditor/verify.pipeline.yml index 2ee090a5..ff835d98 100644 --- a/.expeditor/verify.pipeline.yml +++ b/.expeditor/verify.pipeline.yml @@ -10,16 +10,31 @@ expeditor: timeout_in_minutes: 30 steps: +- label: run-specs-ruby-2.6 + command: + - .expeditor/run_linux_tests.sh rake + expeditor: + executor: + docker: + image: ruby:2.6 -- label: run-specs-ruby-3.1 +- label: run-specs-ruby-2.7 command: - .expeditor/run_linux_tests.sh rake expeditor: executor: docker: - image: ruby:3.1 + image: ruby:2.7 - label: run-specs-ruby-3.0 + command: + - .expeditor/run_linux_tests.sh rake + expeditor: + executor: + docker: + image: ruby:3.0 + +- label: run-specs-ruby-3.1 command: - .expeditor/run_linux_tests.sh rake expeditor: @@ -27,6 +42,22 @@ steps: docker: image: ruby:3.1 +- label: run-specs-ruby-3.2 + command: + - .expeditor/run_linux_tests.sh rake + expeditor: + executor: + docker: + image: ruby:3.2 + +- label: run-specs-ruby-3.3 + command: + - .expeditor/run_linux_tests.sh rake + expeditor: + executor: + docker: + image: ruby:3.3 + - label: run-specs-ruby-3.4 command: - .expeditor/run_linux_tests.sh rake @@ -35,6 +66,39 @@ steps: docker: image: ruby:3.4 +- label: run-specs-ruby-2.6-windows + command: + - .expeditor/run_windows_tests.ps1 + expeditor: + executor: + docker: + host_os: windows + shell: ["powershell", "-Command"] + image: rubydistros/windows-2019:2.6 + user: 'NT AUTHORITY\SYSTEM' + +- label: run-specs-ruby-2.7-windows + command: + - .expeditor/run_windows_tests.ps1 + expeditor: + executor: + docker: + host_os: windows + shell: ["powershell", "-Command"] + image: rubydistros/windows-2019:2.7 + user: 'NT AUTHORITY\SYSTEM' + +- label: run-specs-ruby-3.0-windows + command: + - .expeditor/run_windows_tests.ps1 + expeditor: + executor: + docker: + host_os: windows + shell: ["powershell", "-Command"] + image: rubydistros/windows-2019:3.0 + user: 'NT AUTHORITY\SYSTEM' + - label: run-specs-ruby-3.1-windows command: - .expeditor/run_windows_tests.ps1 @@ -46,6 +110,17 @@ steps: image: rubydistros/windows-2019:3.1 user: 'NT AUTHORITY\SYSTEM' +- label: run-specs-ruby-3.3-windows + command: + - .expeditor/run_windows_tests.ps1 + expeditor: + executor: + docker: + host_os: windows + shell: ["powershell", "-Command"] + image: rubydistros/windows-2019:3.3 + user: 'NT AUTHORITY\SYSTEM' + - label: run-specs-ruby-3.4-windows command: - .expeditor/run_windows_tests.ps1 diff --git a/mixlib-install.gemspec b/mixlib-install.gemspec index 84039ff2..13e5b1e1 100644 --- a/mixlib-install.gemspec +++ b/mixlib-install.gemspec @@ -19,6 +19,6 @@ Gem::Specification.new do |spec| spec.add_dependency "mixlib-shellout" spec.add_dependency "mixlib-versioning" - spec.add_dependency "openssl", ">= 3.3.1" # ruby CRL check issues exist in ruby's bundled openssl version + spec.add_dependency "openssl", ">= 3.1.2" # ruby CRL check issues exist in ruby's bundled openssl version spec.add_dependency "thor" end From 66f328b948a337f6f008490f634a83b6f64b1c88 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 18:27:08 -0600 Subject: [PATCH 07/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 ++ mixlib-install.gemspec | 14 +++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index f315bf97..e1ae3101 100644 --- a/Gemfile +++ b/Gemfile @@ -3,6 +3,8 @@ source "https://rubygems.org" gemspec gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" +gem "public_suffix", "<= 5.1.1" if RUBY_VERSION < "3.0.0" +gem "public_suffix", "< 7.0.0" if RUBY_VERSION < "3.2.0" group :test do gem "rake" diff --git a/mixlib-install.gemspec b/mixlib-install.gemspec index 13e5b1e1..ffd1c0c7 100644 --- a/mixlib-install.gemspec +++ b/mixlib-install.gemspec @@ -19,6 +19,18 @@ Gem::Specification.new do |spec| spec.add_dependency "mixlib-shellout" spec.add_dependency "mixlib-versioning" - spec.add_dependency "openssl", ">= 3.1.2" # ruby CRL check issues exist in ruby's bundled openssl version spec.add_dependency "thor" + + # OpenSSL version constraints to fix CRL checking issues in OpenSSL 3.6+ + # Ruby 2.6-2.7 bundled openssl needs update to 3.1.2+ + # Ruby 3.0-3.2 bundled openssl needs update to 3.1.2+ + # Ruby 3.3 bundled openssl needs update to 3.2.2+ + # Ruby 3.4 bundled openssl needs update to 3.3.1+ + if RUBY_VERSION < "3.3.0" + spec.add_dependency "openssl", ">= 3.1.2" + elsif RUBY_VERSION < "3.4.0" + spec.add_dependency "openssl", ">= 3.2.2" + elsif RUBY_VERSION < "4.0.0" + spec.add_dependency "openssl", ">= 3.3.1" + end end From d6389a52cfd88632d8c9bec69eb03c4fdb06987d Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 18:30:56 -0600 Subject: [PATCH 08/64] test Signed-off-by: Corey Hemminger --- Gemfile | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index e1ae3101..329f39a6 100644 --- a/Gemfile +++ b/Gemfile @@ -3,8 +3,11 @@ source "https://rubygems.org" gemspec gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" -gem "public_suffix", "<= 5.1.1" if RUBY_VERSION < "3.0.0" -gem "public_suffix", "< 7.0.0" if RUBY_VERSION < "3.2.0" +if RUBY_VERSION < "3.0.0" + gem "public_suffix", "<= 5.1.1" +elsif RUBY_VERSION < "3.2.0" + gem "public_suffix", "< 7.0.0" +end group :test do gem "rake" From 3f26bde1ab101ac607c1cf208e71c66d4d5433f8 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 18:46:33 -0600 Subject: [PATCH 09/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Gemfile b/Gemfile index 329f39a6..ce9b8cad 100644 --- a/Gemfile +++ b/Gemfile @@ -4,8 +4,10 @@ gemspec gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" if RUBY_VERSION < "3.0.0" + gem "byebug", "< 12.0" gem "public_suffix", "<= 5.1.1" elsif RUBY_VERSION < "3.2.0" + gem "byebug", "< 12.0" gem "public_suffix", "< 7.0.0" end From 855cf45b9c0262770b701b6c3b8df9c15506b5f1 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 18:50:46 -0600 Subject: [PATCH 10/64] test Signed-off-by: Corey Hemminger --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index ce9b8cad..6e46f13e 100644 --- a/Gemfile +++ b/Gemfile @@ -5,6 +5,7 @@ gemspec gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" if RUBY_VERSION < "3.0.0" gem "byebug", "< 12.0" + gem "mixlib-shellout", "< 3.3.9" gem "public_suffix", "<= 5.1.1" elsif RUBY_VERSION < "3.2.0" gem "byebug", "< 12.0" From b5a1b6a3d7c0fd7d6f2588d604e45041574d21ac Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 18:57:30 -0600 Subject: [PATCH 11/64] test Signed-off-by: Corey Hemminger --- mixlib-install.gemspec | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mixlib-install.gemspec b/mixlib-install.gemspec index ffd1c0c7..7c9c960e 100644 --- a/mixlib-install.gemspec +++ b/mixlib-install.gemspec @@ -26,7 +26,9 @@ Gem::Specification.new do |spec| # Ruby 3.0-3.2 bundled openssl needs update to 3.1.2+ # Ruby 3.3 bundled openssl needs update to 3.2.2+ # Ruby 3.4 bundled openssl needs update to 3.3.1+ - if RUBY_VERSION < "3.3.0" + if RUBY_VERSION < "2.7.0" + spec.add_dependency "openssl", ">= 3.1.2", "< 3.2.0" + elsif RUBY_VERSION < "3.3.0" spec.add_dependency "openssl", ">= 3.1.2" elsif RUBY_VERSION < "3.4.0" spec.add_dependency "openssl", ">= 3.2.2" From 08010a2db45b154bc4579fc9be97f1efb4dda427 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 19:22:23 -0600 Subject: [PATCH 12/64] test Signed-off-by: Corey Hemminger --- Gemfile | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/Gemfile b/Gemfile index 6e46f13e..13ef9bff 100644 --- a/Gemfile +++ b/Gemfile @@ -3,38 +3,40 @@ source "https://rubygems.org" gemspec gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" -if RUBY_VERSION < "3.0.0" - gem "byebug", "< 12.0" - gem "mixlib-shellout", "< 3.3.9" - gem "public_suffix", "<= 5.1.1" -elsif RUBY_VERSION < "3.2.0" - gem "byebug", "< 12.0" - gem "public_suffix", "< 7.0.0" -end +gem "mixlib-shellout", "< 3.3.9" if RUBY_VERSION < "3.0.0" group :test do + gem "contracts", "~> 0.16.0" # this entry can go away when ruby < 3 support is gone gem "rake" gem "rspec" gem "webrick" gem "webmock", "~> 3.4" - gem "contracts", "~> 0.16.0" # this entry can go away when ruby < 3 support is gone if RUBY_VERSION < "2.6.0" - gem "climate_control", "= 0.1.0" - gem "vcr", "= 6.0.0" gem "mixlib-shellout", "= 3.2.5" + gem "public_suffix", "<= 5.1.1" + gem "vcr", "= 6.0.0" + elsif RUBY_VERSION < "3.0.0" + gem "public_suffix", "<= 5.1.1" + elsif RUBY_VERSION < "3.2.0" + gem "public_suffix", "< 7.0.0" else - gem "climate_control", "~> 1.0" + gem "climate_control" gem "vcr" end end -# use old chefstyle to support TargetRubyVersion of 1.9 group :chefstyle do - gem "chefstyle", "~> 0.4.0" + gem "chefstyle" end group :debug do gem "pry" gem "pry-byebug" + if RUBY_VERSION < "2.7.0" + gem "byebug", "< 12.0" + gem "pry-byebug", "< 3.10.0" + elsif RUBY_VERSION < "3.1.0" + gem "byebug", "< 12.0" + end gem "rb-readline" end From f4f1d15bb5083988512083d57eb82c90a0616adf Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 19:26:23 -0600 Subject: [PATCH 13/64] test Signed-off-by: Corey Hemminger --- Gemfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 13ef9bff..35cfd0b5 100644 --- a/Gemfile +++ b/Gemfile @@ -31,12 +31,14 @@ end group :debug do gem "pry" - gem "pry-byebug" if RUBY_VERSION < "2.7.0" gem "byebug", "< 12.0" gem "pry-byebug", "< 3.10.0" elsif RUBY_VERSION < "3.1.0" gem "byebug", "< 12.0" + gem "pry-byebug" + else + gem "pry-byebug" end gem "rb-readline" end From 3e4ef651506531bed6860b95d0427609859cf082 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 19:35:44 -0600 Subject: [PATCH 14/64] test Signed-off-by: Corey Hemminger --- Gemfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index 35cfd0b5..136ad0e8 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,6 @@ source "https://rubygems.org" gemspec gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" -gem "mixlib-shellout", "< 3.3.9" if RUBY_VERSION < "3.0.0" group :test do gem "contracts", "~> 0.16.0" # this entry can go away when ruby < 3 support is gone @@ -12,15 +11,17 @@ group :test do gem "webrick" gem "webmock", "~> 3.4" if RUBY_VERSION < "2.6.0" + gem "climate_control", "= 0.1.0" gem "mixlib-shellout", "= 3.2.5" gem "public_suffix", "<= 5.1.1" gem "vcr", "= 6.0.0" elsif RUBY_VERSION < "3.0.0" + gem "mixlib-shellout", "< 3.3.9" gem "public_suffix", "<= 5.1.1" elsif RUBY_VERSION < "3.2.0" gem "public_suffix", "< 7.0.0" else - gem "climate_control" + gem "climate_control", "~> 1.0" gem "vcr" end end From fd435c9e9288cb93f26d0fe4a296356682edce66 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 19:40:26 -0600 Subject: [PATCH 15/64] test Signed-off-by: Corey Hemminger --- Gemfile | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/Gemfile b/Gemfile index 136ad0e8..25a613d6 100644 --- a/Gemfile +++ b/Gemfile @@ -13,13 +13,17 @@ group :test do if RUBY_VERSION < "2.6.0" gem "climate_control", "= 0.1.0" gem "mixlib-shellout", "= 3.2.5" - gem "public_suffix", "<= 5.1.1" + gem "public_suffix", "<= 5.1.1" # Dep of addressable which is a dep of webmock gem "vcr", "= 6.0.0" elsif RUBY_VERSION < "3.0.0" + gem "climate_control", "~> 1.0" gem "mixlib-shellout", "< 3.3.9" - gem "public_suffix", "<= 5.1.1" + gem "public_suffix", "<= 5.1.1" # Dep of addressable which is a dep of webmock + gem "vcr" elsif RUBY_VERSION < "3.2.0" - gem "public_suffix", "< 7.0.0" + gem "climate_control", "~> 1.0" + gem "public_suffix", "< 7.0.0" # Dep of addressable which is a dep of webmock + gem "vcr" else gem "climate_control", "~> 1.0" gem "vcr" @@ -33,10 +37,10 @@ end group :debug do gem "pry" if RUBY_VERSION < "2.7.0" - gem "byebug", "< 12.0" + gem "byebug", "< 12.0" # Dep of pry-bybug gem "pry-byebug", "< 3.10.0" elsif RUBY_VERSION < "3.1.0" - gem "byebug", "< 12.0" + gem "byebug", "< 12.0" # Dep of pry-bybug gem "pry-byebug" else gem "pry-byebug" From da294360d81fd4a10dbb5fd95fe08026b71a95ac Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 19:53:21 -0600 Subject: [PATCH 16/64] test Signed-off-by: Corey Hemminger --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 25a613d6..f08c48cc 100644 --- a/Gemfile +++ b/Gemfile @@ -13,6 +13,7 @@ group :test do if RUBY_VERSION < "2.6.0" gem "climate_control", "= 0.1.0" gem "mixlib-shellout", "= 3.2.5" + gem "parallel", "< 1.25.0" gem "public_suffix", "<= 5.1.1" # Dep of addressable which is a dep of webmock gem "vcr", "= 6.0.0" elsif RUBY_VERSION < "3.0.0" From 24957b8348b9ba0ac55dff140bf5acc354910944 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 20:01:44 -0600 Subject: [PATCH 17/64] test Signed-off-by: Corey Hemminger --- Gemfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Gemfile b/Gemfile index f08c48cc..8ba34b02 100644 --- a/Gemfile +++ b/Gemfile @@ -13,7 +13,6 @@ group :test do if RUBY_VERSION < "2.6.0" gem "climate_control", "= 0.1.0" gem "mixlib-shellout", "= 3.2.5" - gem "parallel", "< 1.25.0" gem "public_suffix", "<= 5.1.1" # Dep of addressable which is a dep of webmock gem "vcr", "= 6.0.0" elsif RUBY_VERSION < "3.0.0" @@ -31,8 +30,9 @@ group :test do end end +# use old chefstyle to support TargetRubyVersion of 1.9 group :chefstyle do - gem "chefstyle" + gem "chefstyle", "~> 0.4.0" end group :debug do From b5e7c761d6f6e9f34ca73da45bdb55bfd5166ae4 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 20:08:27 -0600 Subject: [PATCH 18/64] test Signed-off-by: Corey Hemminger --- Gemfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Gemfile b/Gemfile index 8ba34b02..6efc487d 100644 --- a/Gemfile +++ b/Gemfile @@ -15,6 +15,11 @@ group :test do gem "mixlib-shellout", "= 3.2.5" gem "public_suffix", "<= 5.1.1" # Dep of addressable which is a dep of webmock gem "vcr", "= 6.0.0" + elsif RUBY_VERSION < "2.7.0" + gem "climate_control", "~> 1.0" + gem "mixlib-shellout", "< 3.3.9" + gem "public_suffix", "<= 5.1.1" # Dep of addressable which is a dep of webmock + gem "vcr", ">= 6.0.0", "< 6.2.0" elsif RUBY_VERSION < "3.0.0" gem "climate_control", "~> 1.0" gem "mixlib-shellout", "< 3.3.9" From a42f57dcefcfc470f208e85bfdeeecbfa92688df Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:08:00 -0600 Subject: [PATCH 19/64] add GHA workflows Signed-off-by: Corey Hemminger --- .editorconfig | 19 ++ .github/copilot-instructions.md | 369 ++++++++++++++++++++++++++++++ .github/workflows/ci.yml | 23 ++ .github/workflows/integration.yml | 39 ++++ .github/workflows/lint.yml | 108 +++++++++ .markdownlint-cli2.yaml | 5 + .rubocop.yml | 1 + .vscode/extensions.json | 8 + .vscode/mcp.json | 9 + .vscode/settings.json | 8 + .yamllint.yml | 4 + 11 files changed, 593 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/copilot-instructions.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/integration.yml create mode 100644 .github/workflows/lint.yml create mode 100644 .markdownlint-cli2.yaml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/mcp.json create mode 100644 .vscode/settings.json create mode 100644 .yamllint.yml diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..cc21b046 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# https://EditorConfig.org + +# top-most EditorConfig file +root=true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true + +# 2 space indentation +indent_style = space +indent_size = 2 + +# Avoid issues parsing cookbook files later +charset = utf-8 + +# Avoid cookstyle warnings +trim_trailing_whitespace = true diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 00000000..5ab58f3b --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,369 @@ +# Copilot Instructions for Mixlib::Install + +## Project Overview +Mixlib::Install is a library for interacting with Chef Software Inc's software distribution systems. It provides APIs and command-line tools to download Chef products and generate installation scripts for various platforms. + +**Primary Goal**: Support the widest range of Ruby versions possible to ensure compatibility across diverse Chef environments. + +## Ruby Version Support Strategy + +### Supported Ruby Versions +- **Minimum**: Ruby 2.3+ +- **Target Range**: Ruby 2.3 through Ruby 3.4+ +- **Testing Focus**: Maintain backward compatibility with Ruby 2.3+ while supporting latest Ruby releases + +### Critical Compatibility Rules + +1. **Avoid Modern Ruby Syntax** + - NO numbered parameters `_1, _2` (Ruby 2.7+) + - NO pattern matching (Ruby 2.7+) + - NO endless methods (Ruby 3.0+) + - Use Ruby 2.3-compatible syntax as the baseline + +2. **Dependency Version Constraints** + - Always use version-conditional dependency constraints in gemspec + - Follow the existing pattern for Ruby version-specific dependencies (see `openssl` gem constraints in gemspec) + - Consider backward compatibility when adding new dependencies + - Check Gemfile for Ruby version-specific gem constraints before adding dependencies + +3. **Standard Library Compatibility** + - Be cautious with stdlib changes across Ruby versions + - Test with methods available in Ruby 2.3 + - Avoid relying on gems that dropped support for Ruby 2.3+ + - Ruby 2.3 features that are safe to use: + - Safe navigation operator (`&.`) + - Squiggly heredoc (`<<~`) + - `dig` method on Hash and Array + - `grep_v` on Enumerable + - Frozen string literal comment + +## Code Style & Conventions + +### RuboCop Configuration +- TargetRubyVersion: 2.7 (set in `.rubocop.yml`) +- Note: While RuboCop targets 2.7, code must remain compatible with Ruby 2.3+ +- Uses `chefstyle` gem version ~> 0.4.0 +- Run style checks: `bundle exec rake style` + +### Code Formatting +- **Indentation**: 2 spaces (defined in `.editorconfig`) +- **Line Endings**: Unix-style LF +- **Charset**: UTF-8 +- **Trailing Whitespace**: Remove (trim_trailing_whitespace: true) +- **Final Newline**: Always include + +### File Headers +All Ruby files should include the Apache 2.0 license header: +```ruby +# +# Author:: [Author Name] () +# Copyright:: Copyright (c) [year] Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# ... +``` + +## Architecture & Structure + +### Core Components + +1. **Mixlib::Install** (`lib/mixlib/install.rb`) + - Main entry point for the library + - Provides `artifact_info`, `available_versions`, `install_command`, `download_artifact` methods + - Delegates to Backend for API interactions + +2. **Options** (`lib/mixlib/install/options.rb`) + - Validates and normalizes user input + - Supports EXTRA_PRODUCTS_FILE environment variable for custom products + - Key options: channel, product_name, product_version, platform, platform_version, architecture + +3. **Product Matrix** (`lib/mixlib/install/product_matrix.rb`) + - DSL for defining product metadata + - Extensible via EXTRA_PRODUCTS_FILE + - Run `bundle exec rake matrix` to update PRODUCT_MATRIX.md after changes + +4. **Backend** (`lib/mixlib/install/backend/`) + - Package Router backend for Chef's package API + - Handles API communication with packages.chef.io + +5. **Generators** (`lib/mixlib/install/generator/`) + - Bourne shell (install.sh) generator + - PowerShell (install.ps1) generator + - Supports proxy configuration and download_url_override + +6. **Artifact Info** (`lib/mixlib/install/artifact_info.rb`) + - Represents package metadata + - Includes platform, version, URL, checksum, license info + +### Supported Architectures +- aarch64, armv7l, i386, powerpc, ppc64, ppc64le, s390x, sparc, universal, x86_64 + +### Supported Channels +- :stable, :current, :unstable + +## Testing + +### Test Structure +- **Unit Tests**: `spec/unit/**/*_spec.rb` +- **Functional Tests**: `spec/functional/**/*_spec.rb` +- **Acceptance Tests**: `acceptance/**/*` + +### Running Tests +```bash +bundle exec rake unit # Unit tests only +bundle exec rake functional # Functional tests only +bundle exec rake # All tests (default) +``` + +### VCR for HTTP Mocking +- Uses VCR gem for recording/replaying HTTP interactions +- Cassettes stored in `spec/support/` +- To update cassettes, see instructions in `spec/spec_helper.rb` +- Functional tests disable VCR to test live interactions + +### Ruby Version-Specific Test Dependencies +The Gemfile contains careful version constraints for test dependencies based on RUBY_VERSION: +- Ruby < 2.6: Specific version pins for chef-utils, climate_control, mixlib-shellout, vcr +- Ruby 2.6-2.7: Different constraint ranges +- Ruby 2.7+: Loosened constraints +- Ruby 3.2+: Minimal constraints + +When adding test dependencies, follow this pattern. + +## Development Guidelines + +### Adding New Features + +1. **Product Addition** + - Update `lib/mixlib/install/product_matrix.rb` with DSL definition + - Run `bundle exec rake matrix` to update documentation + - Add tests in `spec/unit/mixlib/install/product_spec.rb` + +2. **Platform Support** + - Update `lib/mixlib/install/options.rb` SUPPORTED_ARCHITECTURES if needed + - Add platform detection logic in `lib/mixlib/install/util.rb` + - Update install script generators if platform-specific logic needed + +3. **API Changes** + - Maintain backward compatibility + - Add deprecation warnings before removing features + - Update README.md with examples + - Add/update tests + +### Version Management +- Version defined in `lib/mixlib/install/version.rb` +- Follow semantic versioning +- Expeditor handles automated version bumps via labels: + - "Expeditor: Bump Version Minor" + - "Expeditor: Bump Version Major" + +### Dependency Management + +#### Adding Dependencies to Gemspec +1. Consider minimum Ruby version compatibility +2. Use version constraints with Ruby version conditionals if needed +3. Example pattern (from gemspec): +```ruby +if RUBY_VERSION < "2.7.0" + spec.add_dependency "openssl", ">= 3.1.2", "< 3.2.0" +elsif RUBY_VERSION < "3.3.0" + spec.add_dependency "openssl", ">= 3.1.2" +# ... etc +end +``` + +#### Adding Test Dependencies to Gemfile +- Group dependencies by Ruby version ranges +- Pin versions for older Ruby (< 2.6) to ensure compatibility +- Test locally with multiple Ruby versions if possible + +### OpenSSL Dependency Notes +The gemspec includes special handling for the openssl gem due to CRL checking issues: +- Different version constraints based on Ruby version +- This pattern should be followed for other security-critical dependencies + +## CLI Tool + +### Command: mixlib-install +- Executable: `bin/mixlib-install` +- Entry point: `lib/mixlib/install/cli.rb` +- Uses Thor for CLI framework +- Run `mixlib-install help` for available commands + +### Common Commands +```bash +mixlib-install download chef # Download latest stable chef +mixlib-install help # Show all commands +``` + +## Platform Version Compatibility Mode + +The library includes sophisticated platform version compatibility logic: +- Automatically maps to earlier platform versions when exact match not available +- Example: Ubuntu 15.04 → Ubuntu 14.04 compatibility +- Controlled by `platform_version_compatibility_mode` option + +## Install Script Generation + +### Bourne Shell (install.sh) +- Supports: http_proxy, https_proxy, ftp_proxy, no_proxy +- Platform detection for Linux/Unix systems +- Generated via `lib/mixlib/install/generator/bourne.rb` + +### PowerShell (install.ps1) +- Supports: http_proxy +- Windows platform support +- TLS negotiation for older .NET versions +- Generated via `lib/mixlib/install/generator/powershell.rb` + +### Script Options +- `download_url_override`: Direct URL instead of API lookup +- `checksum`: SHA256 for verification +- `install_strategy`: "once" to skip if already installed + +## API Usage Patterns + +### Basic Usage +```ruby +options = { + channel: :current, + product_name: 'chef', + product_version: :latest, + platform: 'mac_os_x', + platform_version: '10.15', + architecture: 'x86_64' +} +artifact = Mixlib::Install.new(options).artifact_info +``` + +### Proxy Configuration +Relies on OpenURI environment variables: +- http_proxy, https_proxy, ftp_proxy, no_proxy + +## Product Extension System + +Users can extend with custom products via EXTRA_PRODUCTS_FILE environment variable: +```ruby +# custom_products.rb +product "cinc" do + product_name "Cinc Infra Client" + package_name "cinc-client" + api_url "https://packages.cinc.sh" +end +``` + +When implementing features, ensure this extensibility is maintained. + +## GitHub Workflows & CI + +- Uses Expeditor for release automation +- Verify pipeline in `.expeditor/verify.pipeline.yml` +- Linux tests: `.expeditor/run_linux_tests.sh` +- Windows tests: `.expeditor/run_windows_tests.ps1` + +## Common Pitfalls to Avoid + +1. **Don't use Ruby 2.4+ features** - Always consider Ruby 2.3 compatibility +2. **Don't assume gem availability** - Check version constraints in Gemfile first +3. **Don't break the Product Matrix DSL** - It's critical for product definitions +4. **Don't skip `rake matrix`** - Must run after modifying product_matrix.rb +5. **Don't hardcode URLs** - Use product definitions and API lookups +6. **Don't ignore platform compatibility** - Test across platforms when possible +7. **Don't add dependencies without version constraints** - Especially for Ruby 2.3+ support + +## Documentation Requirements + +When making changes: +1. Update README.md with API examples if public interface changes +2. Update CHANGELOG.md (handled by Expeditor) +3. Run `rake matrix` if products changed +4. Add code comments for complex compatibility logic +5. Document Ruby version requirements for new features + +## Performance Considerations + +- Minimize external gem dependencies +- Cache HTTP responses appropriately (VCR in tests) +- Efficient platform detection (runs on every install) +- Keep install scripts small and fast + +## Security Considerations + +1. **Checksum Verification**: Always provide/verify SHA256 checksums +2. **HTTPS**: Use secure connections to packages.chef.io +3. **OpenSSL**: Maintain up-to-date openssl gem constraints (see gemspec) +4. **Proxy Support**: Respect proxy settings in secure environments +5. **License Content**: Handle license_content securely (may contain sensitive info) + +## Release Process + +1. Merge PR to main branch +2. Expeditor automatically bumps version (unless skip label) +3. Expeditor builds gem +4. Manual promotion triggers RubyGems publish +5. GitHub release created with version tag (v{{version}}) + +## Getting Help + +- **Slack**: #chef-found-notify (Chef Software internal) +- **GitHub Issues**: Response time maximum 14 days +- **Pull Requests**: Response time maximum 14 days +- **Project State**: Active (see README.md) + +## Quick Reference + +### Key Files +- `lib/mixlib/install.rb` - Main entry point +- `lib/mixlib/install/options.rb` - Option validation +- `lib/mixlib/install/product_matrix.rb` - Product definitions +- `lib/mixlib/install/version.rb` - Version constant +- `mixlib-install.gemspec` - Gem specification with dependency constraints +- `Gemfile` - Development/test dependencies with Ruby version logic + +### Key Commands +- `bundle exec rake` - Run all tests +- `bundle exec rake matrix` - Update product matrix docs +- `bundle exec rake style` - Run style checks +- `bundle exec rake console` - Interactive console with mixlib-install loaded + +### Environment Variables +- `EXTRA_PRODUCTS_FILE` - Path to custom product definitions +- `http_proxy`, `https_proxy`, `ftp_proxy`, `no_proxy` - Proxy configuration + +--- + +**Remember**: When in doubt about Ruby version compatibility, check the Gemfile and gemspec for version-specific patterns, and test with Ruby 2.3+ when possible. The goal is maximum compatibility (Ruby 2.3+) without sacrificing functionality. + +### Ruby 2.3+ Feature Reference + +#### Safe to Use (Ruby 2.3+) +- Safe navigation operator: `object&.method` +- Squiggly heredoc: `<<~TEXT` +- `Hash#dig`, `Array#dig` +- `Enumerable#grep_v` +- `Hash#fetch_values` +- `Hash#to_proc` +- Frozen string literal pragma: `# frozen_string_literal: true` + +#### Avoid (Ruby 2.4+) +- `Integer#digits` +- `Comparable#clamp` +- `String#match?`, `Regexp#match?` +- Multiple assignment in conditionals + +#### Avoid (Ruby 2.5+) +- `yield_self` / `then` +- `Kernel#yield_self` +- `rescue` in blocks without `begin` + +#### Avoid (Ruby 2.6+) +- Endless ranges: `(1..)` +- `Enumerable#chain` +- `Kernel#then` + +#### Avoid (Ruby 2.7+) +- Numbered parameters: `_1`, `_2` +- Pattern matching +- `Enumerable#filter_map` +- `Enumerable#tally` diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..5d5919bb --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,23 @@ +--- +"on": + pull_request: + push: + branches: + - main + +permissions: + contents: read + +concurrency: + group: ci-${{ github.ref }} + cancel-in-progress: true + +jobs: + lint: + uses: ./.github/workflows/lint.yml + secrets: inherit + + integration: + uses: ./.github/workflows/integration.yml + needs: lint + secrets: inherit diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml new file mode 100644 index 00000000..054356d4 --- /dev/null +++ b/.github/workflows/integration.yml @@ -0,0 +1,39 @@ +--- +"on": + workflow_call: + +permissions: + contents: read + +concurrency: + group: integration-${{ github.ref }} + cancel-in-progress: true + +jobs: + integration-tests: + runs-on: ${{ matrix.runner } + strategy: + fail-fast: false + matrix: + runner: + - ubuntu-latest + - macos-latest + - windows-latest + ruby: + - 2.6 + - 2.7 + - 3.0 + - 3.1 + - 3.2 + - 3.3 + - 3.4 + steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - name: Chef Install Test + run: bundle exec mixlib-install download chef diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..b7347d44 --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,108 @@ +--- +"on": + workflow_call: + +permissions: + contents: read + +concurrency: + group: lint-${{ github.ref }} + cancel-in-progress: true + +jobs: + chefstyle: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + ruby: + - 3.4 + steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - uses: r7kamura/rubocop-problem-matchers-action@v1 + - name: Chef Style + run: bundle exec rake style + + yamllint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Run yaml Lint + uses: actionshub/yamllint@main + + jsonlint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - name: Run JSON Lint + run: | + sudo apt-get update + sudo apt-get install -y jsonlint + find . -name "*.json" -not -path "*/node_modules/*" -not -path "*/.git/*" -exec echo "Linting {}" \; -exec jsonlint -q {} \; + + markdown-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + + - name: Markdown lint + uses: DavidAnson/markdownlint-cli2-action@v22 + with: + globs: | + *.md + !CHANGELOG.md + + markdown-link-check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: gaurav-nelson/github-action-markdown-link-check@1.0.17 + with: + use-quiet-mode: "yes" + use-verbose-mode: "yes" + check-modified-files-only: "yes" + base-branch: "main" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + test: + name: Unit Test with Ruby + needs: + - chefstyle + - jsonlint + - yamllint + runs-on: ${{ matrix.runner } + strategy: + fail-fast: false + matrix: + runner: + - ubuntu-latest + - macos-latest + - windows-latest + ruby: + - 2.6 + - 2.7 + - 3.0 + - 3.1 + - 3.2 + - 3.3 + - 3.4 + steps: + - name: Checkout code + uses: actions/checkout@v6 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: ${{ matrix.ruby }} + bundler-cache: true + - name: Setup Machine + run: | + bundle install + - name: Rake Test + run: bundle exec rake diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml new file mode 100644 index 00000000..ed65e9f4 --- /dev/null +++ b/.markdownlint-cli2.yaml @@ -0,0 +1,5 @@ +--- +config: + line-length: false # MD013 +ignores: + - .github/copilot-instructions.md diff --git a/.rubocop.yml b/.rubocop.yml index 050a1f38..f7116496 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,2 +1,3 @@ +--- AllCops: TargetRubyVersion: 2.7 diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..cf171a37 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,8 @@ +{ + "recommendations": [ + "chef-software.chef", + "Shopify.ruby-lsp", + "editorconfig.editorconfig", + "DavidAnson.vscode-markdownlint" + ] +} diff --git a/.vscode/mcp.json b/.vscode/mcp.json new file mode 100644 index 00000000..3ac540eb --- /dev/null +++ b/.vscode/mcp.json @@ -0,0 +1,9 @@ +{ + "servers": { + "atlassian-mcp-server": { + "url": "https://mcp.atlassian.com/v1/sse", + "type": "http" + } + }, + "inputs": [] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..2bedfeea --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "editor.tabSize": 2, + "editor.insertSpaces": true, + "files.trimTrailingWhitespace": true, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "files.eol": "\n" +} diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 00000000..576abb6b --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,4 @@ +--- + +rules: + line-length: disable From 2e891c60aca37df1448ea019da504cf654a27149 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:09:25 -0600 Subject: [PATCH 20/64] fix typo Signed-off-by: Corey Hemminger --- .github/workflows/integration.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 054356d4..39230eb9 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -11,7 +11,7 @@ concurrency: jobs: integration-tests: - runs-on: ${{ matrix.runner } + runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: From c04b02272936271f291a53be436346f352a8df79 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:10:27 -0600 Subject: [PATCH 21/64] fix typo Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b7347d44..8158202d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -77,7 +77,7 @@ jobs: - chefstyle - jsonlint - yamllint - runs-on: ${{ matrix.runner } + runs-on: ${{ matrix.runner }} strategy: fail-fast: false matrix: From 2aa9ce7134d21e1228855f7e3700b1672db66aa4 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:15:29 -0600 Subject: [PATCH 22/64] fix cookstyle job Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 8158202d..c68f83fa 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -26,6 +26,10 @@ jobs: ruby-version: ${{ matrix.ruby }} bundler-cache: true - uses: r7kamura/rubocop-problem-matchers-action@v1 + - name: Setup Machine + run: | + bundle config set --local with 'chefstyle' + bundle install - name: Chef Style run: bundle exec rake style From 1dfbbc9c6e60ed406c8d6e4a1d5b52fa9fe73230 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:18:22 -0600 Subject: [PATCH 23/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c68f83fa..2e51d622 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -28,8 +28,7 @@ jobs: - uses: r7kamura/rubocop-problem-matchers-action@v1 - name: Setup Machine run: | - bundle config set --local with 'chefstyle' - bundle install + bundle install chefstyle - name: Chef Style run: bundle exec rake style From 5a8e82ba53128c88263429c04a529aaea39e314e Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:21:26 -0600 Subject: [PATCH 24/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 3 ++- Gemfile | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2e51d622..47396a6a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -28,7 +28,8 @@ jobs: - uses: r7kamura/rubocop-problem-matchers-action@v1 - name: Setup Machine run: | - bundle install chefstyle + bundel add chefstyle + bundle install - name: Chef Style run: bundle exec rake style diff --git a/Gemfile b/Gemfile index 6efc487d..e38ce3f1 100644 --- a/Gemfile +++ b/Gemfile @@ -35,7 +35,6 @@ group :test do end end -# use old chefstyle to support TargetRubyVersion of 1.9 group :chefstyle do gem "chefstyle", "~> 0.4.0" end From 98d3017991c46440cc234e319b71db9bbf841bd7 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:22:34 -0600 Subject: [PATCH 25/64] fix typo Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 47396a6a..a4fbad86 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -28,7 +28,7 @@ jobs: - uses: r7kamura/rubocop-problem-matchers-action@v1 - name: Setup Machine run: | - bundel add chefstyle + bundle add chefstyle bundle install - name: Chef Style run: bundle exec rake style From 7621ccfe9aaf51a5c7d10c309a10f52ed908a316 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:27:21 -0600 Subject: [PATCH 26/64] switch to cookstyle Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 17 +++++++---------- Gemfile | 4 ++-- Rakefile | 6 +++--- 3 files changed, 12 insertions(+), 15 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a4fbad86..a4eccca4 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,13 +10,14 @@ concurrency: cancel-in-progress: true jobs: - chefstyle: + cookstyle: + env: + BUNDLE_WITH: ${{ inputs.bundle_with }} runs-on: ubuntu-latest strategy: fail-fast: false matrix: - ruby: - - 3.4 + ruby: ["3.4"] steps: - name: Checkout code uses: actions/checkout@v6 @@ -26,12 +27,8 @@ jobs: ruby-version: ${{ matrix.ruby }} bundler-cache: true - uses: r7kamura/rubocop-problem-matchers-action@v1 - - name: Setup Machine - run: | - bundle add chefstyle - bundle install - - name: Chef Style - run: bundle exec rake style + - name: Cook Style + run: bundle exec cookstyle --chefstyle yamllint: runs-on: ubuntu-latest @@ -78,7 +75,7 @@ jobs: test: name: Unit Test with Ruby needs: - - chefstyle + - cookstyle - jsonlint - yamllint runs-on: ${{ matrix.runner }} diff --git a/Gemfile b/Gemfile index e38ce3f1..1561a8e1 100644 --- a/Gemfile +++ b/Gemfile @@ -35,8 +35,8 @@ group :test do end end -group :chefstyle do - gem "chefstyle", "~> 0.4.0" +group :cookstyle do + gem "cookstyle" end group :debug do diff --git a/Rakefile b/Rakefile index 01767e6c..3404b1fa 100644 --- a/Rakefile +++ b/Rakefile @@ -12,13 +12,13 @@ require "rspec/core/rake_task" end begin - require "chefstyle" + require "cookstyle/chefstyle" require "rubocop/rake_task" RuboCop::RakeTask.new(:style) do |task| - task.options += ["--display-cop-names", "--no-color"] + task.options += ["--chefstyle", "--display-cop-names", "--no-color"] end rescue LoadError - puts "chefstyle gem is not installed" + puts "cookstyle/chefstyle is not available. (sudo) gem install cookstyle to do style checking." end desc "Render product matrix documentation" From dd1c0b6afcb866a618dcad3ffa922dc3e147771f Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:34:05 -0600 Subject: [PATCH 27/64] comment out needs for now so all jobs run Signed-off-by: Corey Hemminger --- .github/workflows/ci.yml | 2 +- .github/workflows/lint.yml | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5d5919bb..d8711938 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,5 +19,5 @@ jobs: integration: uses: ./.github/workflows/integration.yml - needs: lint +# needs: lint secrets: inherit diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index a4eccca4..d2a8db6b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -17,7 +17,8 @@ jobs: strategy: fail-fast: false matrix: - ruby: ["3.4"] + ruby: + - 3.4 steps: - name: Checkout code uses: actions/checkout@v6 @@ -74,10 +75,10 @@ jobs: test: name: Unit Test with Ruby - needs: - - cookstyle - - jsonlint - - yamllint +# needs: +# - cookstyle +# - jsonlint +# - yamllint runs-on: ${{ matrix.runner }} strategy: fail-fast: false From 30d49d670e650da980367dda4ce4f5e48cefd892 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:40:07 -0600 Subject: [PATCH 28/64] fix yaml parsing of 3.0 where the .0 is dropped Signed-off-by: Corey Hemminger --- .github/workflows/integration.yml | 2 +- .github/workflows/lint.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 39230eb9..406a0cf3 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -22,7 +22,7 @@ jobs: ruby: - 2.6 - 2.7 - - 3.0 + - "3.0" - 3.1 - 3.2 - 3.3 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index d2a8db6b..b970265d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -90,7 +90,7 @@ jobs: ruby: - 2.6 - 2.7 - - 3.0 + - "3.0" - 3.1 - 3.2 - 3.3 From 7105cf1ce92add7229b145ec547e4be589dbf6b7 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 23 Dec 2025 21:48:57 -0600 Subject: [PATCH 29/64] fix ruby 2.6 cookstyle json dep Signed-off-by: Corey Hemminger --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 1561a8e1..b96e4709 100644 --- a/Gemfile +++ b/Gemfile @@ -37,6 +37,7 @@ end group :cookstyle do gem "cookstyle" + gem "json", "< 2.8.0" if RUBY_VERSION < "2.7.0" # Dep of rubocop which is a dep of cookstyle end group :debug do From 9d740f3aaace9e01b3f6be667500ccb788358035 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 00:32:44 -0600 Subject: [PATCH 30/64] test Signed-off-by: Corey Hemminger --- Gemfile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index b96e4709..8cc18396 100644 --- a/Gemfile +++ b/Gemfile @@ -37,7 +37,10 @@ end group :cookstyle do gem "cookstyle" - gem "json", "< 2.8.0" if RUBY_VERSION < "2.7.0" # Dep of rubocop which is a dep of cookstyle + if RUBY_VERSION < "2.7.0" + gem "json", "< 2.8.0" # Dep of rubocop which is a dep of cookstyle + gem "parallel", "< 1.25.0" + end end group :debug do From 471d26e87dc377592dd986936e5604a2b466d2de Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 00:47:44 -0600 Subject: [PATCH 31/64] revert back to chefstyle Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 8 ++++---- Gemfile | 8 ++------ Rakefile | 6 +++--- 3 files changed, 9 insertions(+), 13 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b970265d..95c31c4d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,7 +10,7 @@ concurrency: cancel-in-progress: true jobs: - cookstyle: + chefstyle: env: BUNDLE_WITH: ${{ inputs.bundle_with }} runs-on: ubuntu-latest @@ -28,8 +28,8 @@ jobs: ruby-version: ${{ matrix.ruby }} bundler-cache: true - uses: r7kamura/rubocop-problem-matchers-action@v1 - - name: Cook Style - run: bundle exec cookstyle --chefstyle + - name: Chef Style + run: bundle exec chefstyle --display-cop-names yamllint: runs-on: ubuntu-latest @@ -76,7 +76,7 @@ jobs: test: name: Unit Test with Ruby # needs: -# - cookstyle +# - chefstyle # - jsonlint # - yamllint runs-on: ${{ matrix.runner }} diff --git a/Gemfile b/Gemfile index 8cc18396..e38ce3f1 100644 --- a/Gemfile +++ b/Gemfile @@ -35,12 +35,8 @@ group :test do end end -group :cookstyle do - gem "cookstyle" - if RUBY_VERSION < "2.7.0" - gem "json", "< 2.8.0" # Dep of rubocop which is a dep of cookstyle - gem "parallel", "< 1.25.0" - end +group :chefstyle do + gem "chefstyle", "~> 0.4.0" end group :debug do diff --git a/Rakefile b/Rakefile index 3404b1fa..01767e6c 100644 --- a/Rakefile +++ b/Rakefile @@ -12,13 +12,13 @@ require "rspec/core/rake_task" end begin - require "cookstyle/chefstyle" + require "chefstyle" require "rubocop/rake_task" RuboCop::RakeTask.new(:style) do |task| - task.options += ["--chefstyle", "--display-cop-names", "--no-color"] + task.options += ["--display-cop-names", "--no-color"] end rescue LoadError - puts "cookstyle/chefstyle is not available. (sudo) gem install cookstyle to do style checking." + puts "chefstyle gem is not installed" end desc "Render product matrix documentation" From e559dfcf222cd84b957aa881a06f80df635b26d4 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:07:26 -0600 Subject: [PATCH 32/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 2 +- Gemfile | 1 + ci/before-script.sh | 0 ci/es-infrastructure.pem.enc | Bin 1680 -> 0 bytes ci/run-acceptance-tests.sh | 0 5 files changed, 2 insertions(+), 1 deletion(-) mode change 100755 => 100644 ci/before-script.sh mode change 100755 => 100644 ci/run-acceptance-tests.sh diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 95c31c4d..cce81261 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -74,7 +74,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} test: - name: Unit Test with Ruby + name: Unit Tests # needs: # - chefstyle # - jsonlint diff --git a/Gemfile b/Gemfile index e38ce3f1..ebc0d2f0 100644 --- a/Gemfile +++ b/Gemfile @@ -37,6 +37,7 @@ end group :chefstyle do gem "chefstyle", "~> 0.4.0" + gem "racc" if RUBY_VERSION >= "3.3.0" # Dep of parser which is a dep of rubocop which is a dep of chefstyle end group :debug do diff --git a/ci/before-script.sh b/ci/before-script.sh old mode 100755 new mode 100644 diff --git a/ci/es-infrastructure.pem.enc b/ci/es-infrastructure.pem.enc index c49dc94fc8e6e6fe306c29d68954bd7fa5d13920..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 1680 zcmV;B25UVJQLd?#%b zp2v1v|4*wC7+O{1&z^Vxvslxuk&Ka2<_9&p6T zH1;Aet~wpOIE)2hyfftGd6$4FQY^;&uPEJ z{DxD-*14eGs<&DAoTIyuJ{>y!oN{!15*2Q~P500Uh6<_!9y+W_>a@F$FcJWHK8tID zDgk~y?~ucePQK)TO6L5bJ7{4`TqLFJ0#$o0x{=|So5=R$9RRd!##?ZP^t{blOqf$# zxNKNJG7iA`!E6~EZ#|qYq$D5lN)cfUH%Pg#!>AulG)qcBgXwm(1aqarGPQxB>7*so z*=P{RW9#F6`g9zxaeBREhVZ19qb8sN!Z;-WWD=oEbF{8JNnw^MwXnrG5nIs6BZgWR zLP<`MG7v6CHlLCLRUs(B8VL_HyYz}R;^{JWDvt3O)#Ms3zrTE=o$>;`7*qhu7ez&( z1+_N4+qd*{rX{wBM`d(MQ_zOQxC-z;jj4v1lTWCk#e_&b;%z@a!B_}OqtE?56 zVD*czp!A6+Qm+D<(oqH6l|hJkI!{P}RrnsCUu9s?)`QmWolmpy=JIg+OsFXJO2d2x zt+7Rs3=Z8@na!u1q33&ec%JUrf1K33!T>9`zXIXT8{xzxW_6-=Y^;xdl;9qju#Oop zyqh9{_+Vozz@BiC5B=DDvYm2%l-|8@z6+F2b#_ukO}bl1cU9Y|Y{>}FcF(bA{rm@V zW&pRtTB332cPv1Cmxih`W7I~%An2%&^wFEaRO``$fgmq@hqU!_>|0entd}#eoT14U zKVyUrC-V8z9nUpELJ&pLW-6;FaM=_r;Ja9X60Ew@k&uK2=XOsmu5=}S47ROQsN375z zt{h6BN^lymi_qpVzT{C=bm`-$K3BoN(N~APjzc6%vtCWYBt0&~ACnwg!|~C#zH*qJ z&}d`#Y_QE>>dp(BN`D6on`PsBf0l$B@U3Ms#7{NH;>jx`eDG$U%H()b5QyJYb;XGe zDUknDA8M7)f@iq8U5gi`z$7(ER_(Yb{e5AM;v+XRxuZ9daJXqSUv)22kZCo4O36A^ z8Ke=OUSAOaV*uPHzKEgVufM@}3RTF!D^=BhfMW?==DR%ZuW zP^-F*ih?{!X{7A)eyt8sG+qPY<$FHp015c{lxhG~J#NR2^j!_nQec8Oa>nB9;dnaQ a$qn@ESia2pzT1Ik&LY?49acS&5P<+fQb!U1 diff --git a/ci/run-acceptance-tests.sh b/ci/run-acceptance-tests.sh old mode 100755 new mode 100644 From 3a8713285fa33f9d2bef4adfcaeb0fb1d5f8451d Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:17:15 -0600 Subject: [PATCH 33/64] test Signed-off-by: Corey Hemminger --- Gemfile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index ebc0d2f0..9fcc1160 100644 --- a/Gemfile +++ b/Gemfile @@ -37,7 +37,16 @@ end group :chefstyle do gem "chefstyle", "~> 0.4.0" - gem "racc" if RUBY_VERSION >= "3.3.0" # Dep of parser which is a dep of rubocop which is a dep of chefstyle + if RUBY_VERSION >= "4.0.0" + gem "base64" # Dep of Rubocop not bundled in ruby 3.4+ + gem "ostruct" # Dep of Rubocop not bundled in ruby 4.0+ + gem "racc" # Dep of Rubocop not bundled in ruby 3.3+ + elsif RUBY_VERSION >= "3.4.0" + gem "base64" # Dep of Rubocop not bundled in ruby 3.4+ + gem "racc" # Dep of Rubocop not bundled in ruby 3.3+ + elsif RUBY_VERSION >= "3.3.0" + gem "racc" # Dep of Rubocop not bundled in ruby 3.3+ + end end group :debug do From 5fad4cfe029b23738aa0f8dd383c12dd161dc7da Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:21:43 -0600 Subject: [PATCH 34/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 1 - Gemfile | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index cce81261..b31c5add 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -27,7 +27,6 @@ jobs: with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - - uses: r7kamura/rubocop-problem-matchers-action@v1 - name: Chef Style run: bundle exec chefstyle --display-cop-names diff --git a/Gemfile b/Gemfile index 9fcc1160..ec14e718 100644 --- a/Gemfile +++ b/Gemfile @@ -39,6 +39,7 @@ group :chefstyle do gem "chefstyle", "~> 0.4.0" if RUBY_VERSION >= "4.0.0" gem "base64" # Dep of Rubocop not bundled in ruby 3.4+ + gem "benchmark" # Dep of Rubocop not bundled in ruby 4.0+ gem "ostruct" # Dep of Rubocop not bundled in ruby 4.0+ gem "racc" # Dep of Rubocop not bundled in ruby 3.3+ elsif RUBY_VERSION >= "3.4.0" From 1ad400c4089678334bf66607f871df965270d0b9 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:27:38 -0600 Subject: [PATCH 35/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b31c5add..b801966a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -27,6 +27,10 @@ jobs: with: ruby-version: ${{ matrix.ruby }} bundler-cache: true + - name: Setup Machine + run: | + bundle update bundler + bundle install --verbose - name: Chef Style run: bundle exec chefstyle --display-cop-names From c6cd8345280018697ba263e58f8070f671bf54b5 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:29:11 -0600 Subject: [PATCH 36/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b801966a..60c2195f 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -29,7 +29,6 @@ jobs: bundler-cache: true - name: Setup Machine run: | - bundle update bundler bundle install --verbose - name: Chef Style run: bundle exec chefstyle --display-cop-names From f1399a3030d0bd281f048fa77d10075f71adaf97 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:30:13 -0600 Subject: [PATCH 37/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 60c2195f..e6cdb8c0 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -18,7 +18,7 @@ jobs: fail-fast: false matrix: ruby: - - 3.4 + - 3.2 steps: - name: Checkout code uses: actions/checkout@v6 @@ -27,9 +27,6 @@ jobs: with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - - name: Setup Machine - run: | - bundle install --verbose - name: Chef Style run: bundle exec chefstyle --display-cop-names From c7578191d973ba2d601f7f2cb37b5e5f12a3b017 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:35:41 -0600 Subject: [PATCH 38/64] switch back to cookstyle Signed-off-by: Corey Hemminger --- .expeditor/verify.pipeline.yml | 8 -------- .github/workflows/lint.yml | 16 ++++++---------- Gemfile | 15 ++------------- Rakefile | 6 +++--- 4 files changed, 11 insertions(+), 34 deletions(-) diff --git a/.expeditor/verify.pipeline.yml b/.expeditor/verify.pipeline.yml index ff835d98..43342c48 100644 --- a/.expeditor/verify.pipeline.yml +++ b/.expeditor/verify.pipeline.yml @@ -10,14 +10,6 @@ expeditor: timeout_in_minutes: 30 steps: -- label: run-specs-ruby-2.6 - command: - - .expeditor/run_linux_tests.sh rake - expeditor: - executor: - docker: - image: ruby:2.6 - - label: run-specs-ruby-2.7 command: - .expeditor/run_linux_tests.sh rake diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index e6cdb8c0..5fcbc44c 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -10,25 +10,21 @@ concurrency: cancel-in-progress: true jobs: - chefstyle: - env: - BUNDLE_WITH: ${{ inputs.bundle_with }} + cookstyle: runs-on: ubuntu-latest strategy: fail-fast: false matrix: ruby: - - 3.2 + - 3.4 steps: - name: Checkout code uses: actions/checkout@v6 - - name: Setup Ruby - uses: ruby/setup-ruby@v1 - with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - - name: Chef Style - run: bundle exec chefstyle --display-cop-names + - uses: r7kamura/rubocop-problem-matchers-action@v1 + - name: Cook Style + run: bundle exec cookstyle --chefstyle yamllint: runs-on: ubuntu-latest @@ -75,7 +71,7 @@ jobs: test: name: Unit Tests # needs: -# - chefstyle +# - cookstyle # - jsonlint # - yamllint runs-on: ${{ matrix.runner }} diff --git a/Gemfile b/Gemfile index ec14e718..1561a8e1 100644 --- a/Gemfile +++ b/Gemfile @@ -35,19 +35,8 @@ group :test do end end -group :chefstyle do - gem "chefstyle", "~> 0.4.0" - if RUBY_VERSION >= "4.0.0" - gem "base64" # Dep of Rubocop not bundled in ruby 3.4+ - gem "benchmark" # Dep of Rubocop not bundled in ruby 4.0+ - gem "ostruct" # Dep of Rubocop not bundled in ruby 4.0+ - gem "racc" # Dep of Rubocop not bundled in ruby 3.3+ - elsif RUBY_VERSION >= "3.4.0" - gem "base64" # Dep of Rubocop not bundled in ruby 3.4+ - gem "racc" # Dep of Rubocop not bundled in ruby 3.3+ - elsif RUBY_VERSION >= "3.3.0" - gem "racc" # Dep of Rubocop not bundled in ruby 3.3+ - end +group :cookstyle do + gem "cookstyle" end group :debug do diff --git a/Rakefile b/Rakefile index 01767e6c..3404b1fa 100644 --- a/Rakefile +++ b/Rakefile @@ -12,13 +12,13 @@ require "rspec/core/rake_task" end begin - require "chefstyle" + require "cookstyle/chefstyle" require "rubocop/rake_task" RuboCop::RakeTask.new(:style) do |task| - task.options += ["--display-cop-names", "--no-color"] + task.options += ["--chefstyle", "--display-cop-names", "--no-color"] end rescue LoadError - puts "chefstyle gem is not installed" + puts "cookstyle/chefstyle is not available. (sudo) gem install cookstyle to do style checking." end desc "Render product matrix documentation" From 4656621de9552060c74b47210b70cd704e0696ac Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Wed, 24 Dec 2025 01:38:41 -0600 Subject: [PATCH 39/64] test Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 5fcbc44c..9e9afc7b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,6 +11,8 @@ concurrency: jobs: cookstyle: + env: + BUNDLE_WITH: ${{ inputs.bundle_with }} runs-on: ubuntu-latest strategy: fail-fast: false @@ -20,6 +22,9 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v6 + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - uses: r7kamura/rubocop-problem-matchers-action@v1 From 524c468c5b03f430724f240352ce52f8983f6f2b Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:03:05 -0600 Subject: [PATCH 40/64] revert cookstyle switch Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 2 +- .rubocop.yml | 22 +++++++++++++++++++++- Gemfile | 4 ++-- Rakefile | 6 +++--- 4 files changed, 27 insertions(+), 7 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9e9afc7b..33874cd5 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -29,7 +29,7 @@ jobs: bundler-cache: true - uses: r7kamura/rubocop-problem-matchers-action@v1 - name: Cook Style - run: bundle exec cookstyle --chefstyle + run: bundle exec rake style yamllint: runs-on: ubuntu-latest diff --git a/.rubocop.yml b/.rubocop.yml index f7116496..0b30c57c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,3 +1,23 @@ --- AllCops: - TargetRubyVersion: 2.7 + TargetRubyVersion: 2.3 + +# The following cops are disabled because their autocorrect features could +# potentially introduce syntax that breaks Ruby 2.3 compatibility, even though +# the cops themselves support Ruby 2.3 + +# Keep encoding comments for Ruby 2.3 compatibility (they're harmless) +Style/Encoding: + Enabled: false + +# Disable unless we're certain all suggestions work in Ruby 2.3 +Style/MutableConstant: + Enabled: false + +# Security cops that use eval - keep disabled for safety +Security/Eval: + Enabled: false + +# Chef-specific cop that suggests require optimizations +Chef/Ruby/UnlessDefinedRequire: + Enabled: false diff --git a/Gemfile b/Gemfile index 1561a8e1..e38ce3f1 100644 --- a/Gemfile +++ b/Gemfile @@ -35,8 +35,8 @@ group :test do end end -group :cookstyle do - gem "cookstyle" +group :chefstyle do + gem "chefstyle", "~> 0.4.0" end group :debug do diff --git a/Rakefile b/Rakefile index 3404b1fa..01767e6c 100644 --- a/Rakefile +++ b/Rakefile @@ -12,13 +12,13 @@ require "rspec/core/rake_task" end begin - require "cookstyle/chefstyle" + require "chefstyle" require "rubocop/rake_task" RuboCop::RakeTask.new(:style) do |task| - task.options += ["--chefstyle", "--display-cop-names", "--no-color"] + task.options += ["--display-cop-names", "--no-color"] end rescue LoadError - puts "cookstyle/chefstyle is not available. (sudo) gem install cookstyle to do style checking." + puts "chefstyle gem is not installed" end desc "Render product matrix documentation" From 402d3d1c7ff1811234bceb9d61350db20d007507 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:10:28 -0600 Subject: [PATCH 41/64] fix job cmd Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 33874cd5..00551c8d 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -29,7 +29,7 @@ jobs: bundler-cache: true - uses: r7kamura/rubocop-problem-matchers-action@v1 - name: Cook Style - run: bundle exec rake style + run: bundle exec chefstyle --display-cop-names yamllint: runs-on: ubuntu-latest From 54df643361a1b9f44b04e885f7fe15e13f5d4ca7 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:30:46 -0600 Subject: [PATCH 42/64] linting fixes Signed-off-by: Corey Hemminger --- .github/workflows/integration.yml | 5 +++++ .github/workflows/lint.yml | 5 +++++ .markdownlint-cli2.yaml | 1 + Gemfile | 8 +++++++ README.md | 37 ++++++++++++++++++++++--------- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 406a0cf3..2c9498cd 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -28,6 +28,11 @@ jobs: - 3.3 - 3.4 steps: + - name: Enable long paths on Windows + if: runner.os == 'Windows' + run: | + New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force + shell: powershell - name: Checkout code uses: actions/checkout@v6 - name: Setup Ruby diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 00551c8d..eb3c64fd 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -96,6 +96,11 @@ jobs: - 3.3 - 3.4 steps: + - name: Enable long paths on Windows + if: runner.os == 'Windows' + run: | + Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 + shell: pwsh - name: Checkout code uses: actions/checkout@v6 - name: Setup Ruby diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index ed65e9f4..3aa894e8 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -3,3 +3,4 @@ config: line-length: false # MD013 ignores: - .github/copilot-instructions.md + - CONTRIBUTING.md diff --git a/Gemfile b/Gemfile index e38ce3f1..a793c2ee 100644 --- a/Gemfile +++ b/Gemfile @@ -29,6 +29,14 @@ group :test do gem "climate_control", "~> 1.0" gem "public_suffix", "< 7.0.0" # Dep of addressable which is a dep of webmock gem "vcr" + elseif RUBY_VERSION < "3.3.0" + gem "climate_control", "~> 1.0" + gem "public_suffix", "< 7.0.0" # Dep of addressable which is a dep of webmock + gem "vcr" + elsif RUBY_VERSION >= "3.3.0" + gem "climate_control", "~> 1.0" + gem "racc" + gem "vcr" else gem "climate_control", "~> 1.0" gem "vcr" diff --git a/README.md b/README.md index 0d710056..f32e49f6 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,14 @@ - Chef 11.6.2+ chef-client upgrades ## Command Line Usage -``` -$ gem install mixlib-install -``` +```bash +gem install mixlib-install ``` + +```bash # Download latest stable chef for current platform -$ mixlib-install download chef +mixlib-install download chef ``` Run `$ mixlib-install help` for additional commands and options. @@ -30,11 +31,13 @@ Run `$ mixlib-install help` for additional commands and options. ## API Usage ### Load mixlib-install + ```ruby require 'mixlib/install' ``` ### Get URL for specific platform and package version + ```ruby options = { channel: :current, @@ -53,6 +56,7 @@ artifact.url ``` ### Get list of artifacts for all platforms given a package version + ```ruby options = { channel: :current, @@ -68,6 +72,7 @@ artifacts.first.url ``` ### Get latest artifacts for a partial version + ```ruby options = { channel: :current, @@ -83,6 +88,7 @@ artifacts.first.version ``` ### Get latest artifact for a partial version + ```ruby options = { channel: :current, @@ -101,6 +107,7 @@ artifact.version ``` ### Detect platform information + ```ruby options = { channel: :current, @@ -115,6 +122,7 @@ artifact.platform_version # => "10.10" ``` ### Use an artifact released for an earlier version of the platform + ```ruby options = { channel: :current, @@ -135,6 +143,7 @@ artifact.platform_version # => "14.04" `platform_version_compatibility_mode` will automatically be enabled if platform options are not specified. If running on Ubuntu 15.04... + ```ruby options = { channel: :current, @@ -148,7 +157,9 @@ artifact.platform_version # => "14.04" ``` ### List the available versions for a product and channel + #### Instance method + ```ruby options = { channel: :stable, @@ -161,6 +172,7 @@ Mixlib::Install.new(options).available_versions ``` #### Class method + ```ruby Mixlib::Install.available_versions("chef", "stable") @@ -168,7 +180,9 @@ Mixlib::Install.available_versions("chef", "stable") ``` ### Download an artifact + Download a specific artifact to a configurable location. All platform options (platform, platform_version, architecture) are required in order to filter a single artifact. + ```ruby # detect platform and download to the operating system’s temporary file path Mixlib::Install.new(product_name: "chefdk", channel: :stable).detect_platform.download_artifact(Dir.tmpdir) @@ -177,13 +191,14 @@ Mixlib::Install.new(product_name: "chefdk", channel: :stable).detect_platform.do # specify platform options and download to current directory Mixlib::Install.new(product_name: "chefdk", channel: :stable, platform: "ubuntu", platform_version: "14.04", architecture: "x86_64").download_artifact # => "~/chefdk-2.3.4-1.deb" - ``` ### User-Agent Request Headers + By default, all requests made by `mixlib-install` will include a `User-Agent` request header as `mixlib-install/`. Additional `User-Agent` request headers can be added by setting the `user_agent_headers` option. When you want to identify a product using mixlib-install as a dependency we recommend the format `product/version`. + ```ruby options = { channel: :stable, @@ -193,9 +208,11 @@ options = { ``` ### Collecting Software Dependencies and License Content + Collecting software dependencies and license content for ArtifactInfo instances requires additional requests to the repository server. By default, collection is disabled. To return data for instance methods `software_dependencies` and `license_content`, the `include_metadata` option must be enabled. + ```ruby options = { channel: :current, @@ -215,11 +232,10 @@ artifact.software_dependencies.class # => Hash # By default, the instance methods return nil - ``` - ### Install Scripts + mixlib-install generates the bootstrap installation scripts known as install.sh and install.ps1. The associated install script will be returned when calling `#install_command` on the Mixlib::Install instance. Mixlib::Install instantiation option `install_command_options` can accept variables (bourne) or parameters (powershell) to modify the behavior of the install scripts. @@ -244,6 +260,7 @@ Mixlib::Install.new(options).install_command ``` #### Proxies + The API uses Ruby's OpenURI module to load proxy environment variables (`http_proxy`, `https_proxy`, `ftp_proxy`, `no_proxy`). When `install.sh` and `install.ps1` are executed as standalone scripts the will rely on environment variables to configure proxy settings. The install scripts will not configure proxy settings by default. @@ -254,12 +271,11 @@ Bourne install script (`install.sh`) supports `http_proxy`, `https_proxy`, `ftp_ Powershell install script (`install.ps1`) supports `http_proxy` passed as a key to `install_command_options`. - ### Extending for other products Create a ruby file in your application and use the product DSL like this (see [product.rb](lib/mixlib/install/product.rb) for available properties): -``` +```ruby product "cinc" do product_name "Cinc Infra Client" package_name "cinc-client" @@ -274,11 +290,12 @@ Then set an environment variable to load them like this on linux: Calls to mixlib-install now allow to target your new product, assuming the api_url match pacakges api for `///versions` and `////artifacts` endpoints. ## Development + VCR is a tool that helps cache and replay http responses. When these responses change or when you add more tests you might need to update cached responses. Check out [spec_helper.rb](https://github.com/chef/mixlib-install/blob/master/spec/spec_helper.rb) for instructions on how to do this. ## Contributing -1. Fork it ( https://github.com/[my-github-username]/mixlib-install/fork ) +1. Fork it ( ) 2. Create your feature branch (`git checkout -b my-new-feature`) 3. Commit your changes (`git commit -am 'Add some feature'`) 4. Push to the branch (`git push origin my-new-feature`) From c1b34572d13bad7238ea0ec3616eef69ea84ee61 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:37:38 -0600 Subject: [PATCH 43/64] more gemfile restrictions Signed-off-by: Corey Hemminger --- .markdownlint-cli2.yaml | 2 ++ Gemfile | 13 ++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml index 3aa894e8..c4bf0c1b 100644 --- a/.markdownlint-cli2.yaml +++ b/.markdownlint-cli2.yaml @@ -4,3 +4,5 @@ config: ignores: - .github/copilot-instructions.md - CONTRIBUTING.md + - CODE_OF_CONDUCT.md + - PRODUCT_MATRIX.md diff --git a/Gemfile b/Gemfile index a793c2ee..3c2d664a 100644 --- a/Gemfile +++ b/Gemfile @@ -29,10 +29,21 @@ group :test do gem "climate_control", "~> 1.0" gem "public_suffix", "< 7.0.0" # Dep of addressable which is a dep of webmock gem "vcr" - elseif RUBY_VERSION < "3.3.0" + elsif RUBY_VERSION < "3.3.0" gem "climate_control", "~> 1.0" gem "public_suffix", "< 7.0.0" # Dep of addressable which is a dep of webmock gem "vcr" + elsif RUBY_VERSION >= "4.0.0" + gem "base64" + gem "climate_control", "~> 1.0" + gem "ostruct" + gem "racc" + gem "vcr" + elsif RUBY_VERSION >= "3.4.0" + gem "base64" + gem "climate_control", "~> 1.0" + gem "racc" + gem "vcr" elsif RUBY_VERSION >= "3.3.0" gem "climate_control", "~> 1.0" gem "racc" From fc62d6547daaed2447572712a21074c651a69c31 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:39:52 -0600 Subject: [PATCH 44/64] test Signed-off-by: Corey Hemminger --- Gemfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 3c2d664a..7ea31cea 100644 --- a/Gemfile +++ b/Gemfile @@ -35,6 +35,7 @@ group :test do gem "vcr" elsif RUBY_VERSION >= "4.0.0" gem "base64" + gem "benchmark" gem "climate_control", "~> 1.0" gem "ostruct" gem "racc" @@ -55,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.4.0" + gem "chefstyle" end group :debug do From 0506dd62cafad3dd6d16295dd33617485e2a5850 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:43:05 -0600 Subject: [PATCH 45/64] linting fixes Signed-off-by: Corey Hemminger --- .rubocop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index 0b30c57c..cf3cb0cb 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,6 +1,6 @@ --- AllCops: - TargetRubyVersion: 2.3 + TargetRubyVersion: 2.5 # The following cops are disabled because their autocorrect features could # potentially introduce syntax that breaks Ruby 2.3 compatibility, even though From 1479151b0761cbf4fbf929664288d545ea31ca04 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:47:18 -0600 Subject: [PATCH 46/64] test Signed-off-by: Corey Hemminger --- .rubocop.yml | 2 +- Gemfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.rubocop.yml b/.rubocop.yml index cf3cb0cb..0b30c57c 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -1,6 +1,6 @@ --- AllCops: - TargetRubyVersion: 2.5 + TargetRubyVersion: 2.3 # The following cops are disabled because their autocorrect features could # potentially introduce syntax that breaks Ruby 2.3 compatibility, even though diff --git a/Gemfile b/Gemfile index 7ea31cea..bcdbb26c 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle" + gem "chefstyle", "~> 0.4.0" end group :debug do From f08826465156efb04bc2919254a990723094dba1 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:52:42 -0600 Subject: [PATCH 47/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index bcdbb26c..bed99deb 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.4.0" + gem "chefstyle", "~> 0.12.0" end group :debug do From 4f0186b0646d0cd46d58b18d37a5c52102aa0c63 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:56:24 -0600 Subject: [PATCH 48/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index bed99deb..c83e8f5c 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.12.0" + gem "chefstyle", "~> 0.5.0" end group :debug do From a01760adc4c5982d6a1f735ecca06a3c94f5eec1 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 17:59:52 -0600 Subject: [PATCH 49/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index c83e8f5c..b33d04f4 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.5.0" + gem "chefstyle", "~> 0.6.0" end group :debug do From 72fec668dbb8613acc857a22110df4b7e92594f7 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 18:01:30 -0600 Subject: [PATCH 50/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index b33d04f4..11d373be 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.6.0" + gem "chefstyle", "~> 0.8.0" end group :debug do From 66e39c55fe0ee5302d1463a7c7b19477c41166e0 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 18:34:27 -0600 Subject: [PATCH 51/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 11d373be..12d1164c 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.8.0" + gem "chefstyle", "~> 0.9.0" end group :debug do From 8672b15b624c8dcc2578ba61c50a263a61dd412b Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 18:35:29 -0600 Subject: [PATCH 52/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 12d1164c..1fb2f34f 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.9.0" + gem "chefstyle", "~> 0.10.0" end group :debug do From 710d229f4c080943f35686d953a72f9362f8dd2e Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 18:36:26 -0600 Subject: [PATCH 53/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 1fb2f34f..c954fee1 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.10.0" + gem "chefstyle", "~> 0.11.0" end group :debug do From ffa81812a7d07d6302697dfd9cbc61f2aa746510 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Mon, 29 Dec 2025 18:37:54 -0600 Subject: [PATCH 54/64] test Signed-off-by: Corey Hemminger --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index c954fee1..bed99deb 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.11.0" + gem "chefstyle", "~> 0.12.0" end group :debug do From 48bc24e880b8fd4c55c947ce2bcf4fb552a64232 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 30 Dec 2025 08:50:39 -0600 Subject: [PATCH 55/64] updating chefstyle version that works Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 1 + .rubocop.yml | 18 ++++++++++++++++++ Gemfile | 2 +- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index eb3c64fd..f657a51a 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -110,6 +110,7 @@ jobs: bundler-cache: true - name: Setup Machine run: | + gem install bundler bundle install - name: Rake Test run: bundle exec rake diff --git a/.rubocop.yml b/.rubocop.yml index 0b30c57c..11489396 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -21,3 +21,21 @@ Security/Eval: # Chef-specific cop that suggests require optimizations Chef/Ruby/UnlessDefinedRequire: Enabled: false + +# Added for Chefstyle 0.12 compatibility, can be removed with switch to cookstyle +Bundler/DuplicatedGem: + Enabled: false +Lint/AmbiguousRegexpLiteral: + Enabled: false +Layout/IndentHeredoc: + Enabled: false +Layout/ClosingHeredocIndentation: + Enabled: false +Lint/UselessAssignment: + Enabled: false +Lint/ShadowingOuterLocalVariable: + Enabled: false +Style/HashSyntax: + Enabled: false +Layout/BlockAlignment: + Enabled: false diff --git a/Gemfile b/Gemfile index bed99deb..f5334757 100644 --- a/Gemfile +++ b/Gemfile @@ -56,7 +56,7 @@ group :test do end group :chefstyle do - gem "chefstyle", "~> 0.12.0" + gem "chefstyle", "~> 0.12.0" # Minimum version that will run without errors on Ruby 3.4 end group :debug do From 7a4fd251747af982072bd54b3dfeeab951311fdf Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 30 Dec 2025 09:09:05 -0600 Subject: [PATCH 56/64] fix windows longpath Signed-off-by: Corey Hemminger --- .github/workflows/integration.yml | 5 ++++- .github/workflows/lint.yml | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml index 2c9498cd..27ff0c78 100644 --- a/.github/workflows/integration.yml +++ b/.github/workflows/integration.yml @@ -31,7 +31,10 @@ jobs: - name: Enable long paths on Windows if: runner.os == 'Windows' run: | - New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force + # Enable Windows long paths + New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force -ErrorAction SilentlyContinue + # Enable Git long paths + git config --global core.longpaths true shell: powershell - name: Checkout code uses: actions/checkout@v6 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index f657a51a..c69e42f1 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -99,7 +99,10 @@ jobs: - name: Enable long paths on Windows if: runner.os == 'Windows' run: | - Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 + # Enable Windows long paths + New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force -ErrorAction SilentlyContinue + # Enable Git long paths + git config --global core.longpaths true shell: pwsh - name: Checkout code uses: actions/checkout@v6 From 70a7ecb7602dc61fc24c70fd2f245c5dd93d18b0 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 30 Dec 2025 09:12:15 -0600 Subject: [PATCH 57/64] remove install of bundler Signed-off-by: Corey Hemminger --- .github/workflows/lint.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index c69e42f1..94860e39 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -113,7 +113,6 @@ jobs: bundler-cache: true - name: Setup Machine run: | - gem install bundler bundle install - name: Rake Test run: bundle exec rake From 128e63448b3044aac34091311e5bf90e628b23df Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 30 Dec 2025 09:19:31 -0600 Subject: [PATCH 58/64] update workflow needs: Signed-off-by: Corey Hemminger --- .github/workflows/ci.yml | 2 +- .github/workflows/lint.yml | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d8711938..5d5919bb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,5 +19,5 @@ jobs: integration: uses: ./.github/workflows/integration.yml -# needs: lint + needs: lint secrets: inherit diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 94860e39..82a1d73b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -75,10 +75,10 @@ jobs: test: name: Unit Tests -# needs: -# - cookstyle -# - jsonlint -# - yamllint + needs: + - cookstyle + - jsonlint + - yamllint runs-on: ${{ matrix.runner }} strategy: fail-fast: false From 135ecae1333a9543feb01c963be96d05de9e97dc Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Tue, 30 Dec 2025 12:25:17 -0600 Subject: [PATCH 59/64] test adding hab pkg install pathing support for install once Signed-off-by: Corey Hemminger --- .../generator/bourne/scripts/check_product.sh | 15 +++++++++------ .../scripts/install_project.ps1.erb | 19 ++++++++++++++----- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/lib/mixlib/install/generator/bourne/scripts/check_product.sh b/lib/mixlib/install/generator/bourne/scripts/check_product.sh index 7e775e18..f2cf2a1d 100644 --- a/lib/mixlib/install/generator/bourne/scripts/check_product.sh +++ b/lib/mixlib/install/generator/bourne/scripts/check_product.sh @@ -1,6 +1,9 @@ -if test -d "/opt/$project" && test "x$install_strategy" = "xonce"; then - echo "$project installation detected" - echo "install_strategy set to 'once'" - echo "Nothing to install" - exit -fi +# Check for chef-client command in various locations +for path in /usr/bin/chef-client /hab/pkgs/chef/chef-infra-client/*/*/bin/chef-client /opt/chef/bin/chef-client; do + if test -x "$path" 2>/dev/null; then + echo "$project installation detected" + echo "install_strategy set to 'once'" + echo "Nothing to install" + exit + fi +done diff --git a/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb b/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb index 87444c3b..44d1d1c5 100644 --- a/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb +++ b/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb @@ -59,11 +59,20 @@ function Install-Project { $install_strategy ) - if ((Test-Path "$env:systemdrive\<%= windows_dir %>\$project\embedded") -and ($install_strategy -eq 'once')) { - Write-Host "$project installation detected" - Write-Host "install_strategy set to 'once'" - Write-Host "Nothing to install" - exit + # Check for chef-client command in various locations + $chef_locations = @( + "$env:systemdrive\hab\pkgs\chef\chef-infra-client\*\*\bin\chef-client.bat" + "$env:systemdrive\<%= windows_dir %>\$project\bin\chef-client.bat", + + ) + foreach ($path in $chef_locations) { + $resolved = Get-Item $path -ErrorAction SilentlyContinue | Select-Object -First 1 + if ($resolved -and (Test-Path $resolved.FullName)) { + Write-Host "$project installation detected" + Write-Host "install_strategy set to 'once'" + Write-Host "Nothing to install" + exit + } } # Set http_proxy as env var From 94765b630d7674ae202f10f9f374ad80c7a937c1 Mon Sep 17 00:00:00 2001 From: Stromweld Date: Wed, 31 Dec 2025 19:15:34 -0600 Subject: [PATCH 60/64] switch openssl to gemfile Signed-off-by: Stromweld --- Gemfile | 14 ++++++++++++++ mixlib-install.gemspec | 15 --------------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/Gemfile b/Gemfile index f5334757..ad64d25f 100644 --- a/Gemfile +++ b/Gemfile @@ -3,6 +3,20 @@ source "https://rubygems.org" gemspec gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" +# OpenSSL version constraints to fix CRL checking issues in OpenSSL 3.6+ +# Ruby 2.6-2.7 bundled openssl needs update to 3.1.2+ +# Ruby 3.0-3.2 bundled openssl needs update to 3.1.2+ +# Ruby 3.3 bundled openssl needs update to 3.2.2+ +# Ruby 3.4 bundled openssl needs update to 3.3.1+ +if RUBY_VERSION < "2.7.0" + spec.add_dependency "openssl", ">= 3.1.2", "< 3.2.0" +elsif RUBY_VERSION < "3.3.0" + spec.add_dependency "openssl", ">= 3.1.2" +elsif RUBY_VERSION < "3.4.0" + spec.add_dependency "openssl", ">= 3.2.2" +elsif RUBY_VERSION < "4.0.0" + spec.add_dependency "openssl", ">= 3.3.1" +end group :test do gem "contracts", "~> 0.16.0" # this entry can go away when ruby < 3 support is gone diff --git a/mixlib-install.gemspec b/mixlib-install.gemspec index 7c9c960e..e7b607f5 100644 --- a/mixlib-install.gemspec +++ b/mixlib-install.gemspec @@ -20,19 +20,4 @@ Gem::Specification.new do |spec| spec.add_dependency "mixlib-shellout" spec.add_dependency "mixlib-versioning" spec.add_dependency "thor" - - # OpenSSL version constraints to fix CRL checking issues in OpenSSL 3.6+ - # Ruby 2.6-2.7 bundled openssl needs update to 3.1.2+ - # Ruby 3.0-3.2 bundled openssl needs update to 3.1.2+ - # Ruby 3.3 bundled openssl needs update to 3.2.2+ - # Ruby 3.4 bundled openssl needs update to 3.3.1+ - if RUBY_VERSION < "2.7.0" - spec.add_dependency "openssl", ">= 3.1.2", "< 3.2.0" - elsif RUBY_VERSION < "3.3.0" - spec.add_dependency "openssl", ">= 3.1.2" - elsif RUBY_VERSION < "3.4.0" - spec.add_dependency "openssl", ">= 3.2.2" - elsif RUBY_VERSION < "4.0.0" - spec.add_dependency "openssl", ">= 3.3.1" - end end From 0fa7329937886254ec1ee2ae70eb48231b8724bb Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Fri, 2 Jan 2026 12:06:20 -0600 Subject: [PATCH 61/64] revert non GHA related changes Signed-off-by: Corey Hemminger --- ci/before-script.sh | 0 ci/es-infrastructure.pem.enc | Bin 0 -> 1680 bytes ci/run-acceptance-tests.sh | 0 .../generator/bourne/scripts/check_product.sh | 15 ++++++-------- .../scripts/install_project.ps1.erb | 19 +++++------------- 5 files changed, 11 insertions(+), 23 deletions(-) mode change 100644 => 100755 ci/before-script.sh mode change 100644 => 100755 ci/run-acceptance-tests.sh diff --git a/ci/before-script.sh b/ci/before-script.sh old mode 100644 new mode 100755 diff --git a/ci/es-infrastructure.pem.enc b/ci/es-infrastructure.pem.enc index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..c49dc94fc8e6e6fe306c29d68954bd7fa5d13920 100644 GIT binary patch literal 1680 zcmV;B25UVJQLd?#%b zp2v1v|4*wC7+O{1&z^Vxvslxuk&Ka2<_9&p6T zH1;Aet~wpOIE)2hyfftGd6$4FQY^;&uPEJ z{DxD-*14eGs<&DAoTIyuJ{>y!oN{!15*2Q~P500Uh6<_!9y+W_>a@F$FcJWHK8tID zDgk~y?~ucePQK)TO6L5bJ7{4`TqLFJ0#$o0x{=|So5=R$9RRd!##?ZP^t{blOqf$# zxNKNJG7iA`!E6~EZ#|qYq$D5lN)cfUH%Pg#!>AulG)qcBgXwm(1aqarGPQxB>7*so z*=P{RW9#F6`g9zxaeBREhVZ19qb8sN!Z;-WWD=oEbF{8JNnw^MwXnrG5nIs6BZgWR zLP<`MG7v6CHlLCLRUs(B8VL_HyYz}R;^{JWDvt3O)#Ms3zrTE=o$>;`7*qhu7ez&( z1+_N4+qd*{rX{wBM`d(MQ_zOQxC-z;jj4v1lTWCk#e_&b;%z@a!B_}OqtE?56 zVD*czp!A6+Qm+D<(oqH6l|hJkI!{P}RrnsCUu9s?)`QmWolmpy=JIg+OsFXJO2d2x zt+7Rs3=Z8@na!u1q33&ec%JUrf1K33!T>9`zXIXT8{xzxW_6-=Y^;xdl;9qju#Oop zyqh9{_+Vozz@BiC5B=DDvYm2%l-|8@z6+F2b#_ukO}bl1cU9Y|Y{>}FcF(bA{rm@V zW&pRtTB332cPv1Cmxih`W7I~%An2%&^wFEaRO``$fgmq@hqU!_>|0entd}#eoT14U zKVyUrC-V8z9nUpELJ&pLW-6;FaM=_r;Ja9X60Ew@k&uK2=XOsmu5=}S47ROQsN375z zt{h6BN^lymi_qpVzT{C=bm`-$K3BoN(N~APjzc6%vtCWYBt0&~ACnwg!|~C#zH*qJ z&}d`#Y_QE>>dp(BN`D6on`PsBf0l$B@U3Ms#7{NH;>jx`eDG$U%H()b5QyJYb;XGe zDUknDA8M7)f@iq8U5gi`z$7(ER_(Yb{e5AM;v+XRxuZ9daJXqSUv)22kZCo4O36A^ z8Ke=OUSAOaV*uPHzKEgVufM@}3RTF!D^=BhfMW?==DR%ZuW zP^-F*ih?{!X{7A)eyt8sG+qPY<$FHp015c{lxhG~J#NR2^j!_nQec8Oa>nB9;dnaQ a$qn@ESia2pzT1Ik&LY?49acS&5P<+fQb!U1 literal 0 HcmV?d00001 diff --git a/ci/run-acceptance-tests.sh b/ci/run-acceptance-tests.sh old mode 100644 new mode 100755 diff --git a/lib/mixlib/install/generator/bourne/scripts/check_product.sh b/lib/mixlib/install/generator/bourne/scripts/check_product.sh index f2cf2a1d..7e775e18 100644 --- a/lib/mixlib/install/generator/bourne/scripts/check_product.sh +++ b/lib/mixlib/install/generator/bourne/scripts/check_product.sh @@ -1,9 +1,6 @@ -# Check for chef-client command in various locations -for path in /usr/bin/chef-client /hab/pkgs/chef/chef-infra-client/*/*/bin/chef-client /opt/chef/bin/chef-client; do - if test -x "$path" 2>/dev/null; then - echo "$project installation detected" - echo "install_strategy set to 'once'" - echo "Nothing to install" - exit - fi -done +if test -d "/opt/$project" && test "x$install_strategy" = "xonce"; then + echo "$project installation detected" + echo "install_strategy set to 'once'" + echo "Nothing to install" + exit +fi diff --git a/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb b/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb index 44d1d1c5..87444c3b 100644 --- a/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb +++ b/lib/mixlib/install/generator/powershell/scripts/install_project.ps1.erb @@ -59,20 +59,11 @@ function Install-Project { $install_strategy ) - # Check for chef-client command in various locations - $chef_locations = @( - "$env:systemdrive\hab\pkgs\chef\chef-infra-client\*\*\bin\chef-client.bat" - "$env:systemdrive\<%= windows_dir %>\$project\bin\chef-client.bat", - - ) - foreach ($path in $chef_locations) { - $resolved = Get-Item $path -ErrorAction SilentlyContinue | Select-Object -First 1 - if ($resolved -and (Test-Path $resolved.FullName)) { - Write-Host "$project installation detected" - Write-Host "install_strategy set to 'once'" - Write-Host "Nothing to install" - exit - } + if ((Test-Path "$env:systemdrive\<%= windows_dir %>\$project\embedded") -and ($install_strategy -eq 'once')) { + Write-Host "$project installation detected" + Write-Host "install_strategy set to 'once'" + Write-Host "Nothing to install" + exit } # Set http_proxy as env var From f689810d6eb02e77aca6ac7b2c12ec930a973408 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Fri, 2 Jan 2026 12:08:28 -0600 Subject: [PATCH 62/64] fix gemfile Signed-off-by: Corey Hemminger --- Gemfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index ad64d25f..aff36891 100644 --- a/Gemfile +++ b/Gemfile @@ -9,13 +9,13 @@ gem "chef-utils", "= 16.6.14" if RUBY_VERSION < "2.6.0" # Ruby 3.3 bundled openssl needs update to 3.2.2+ # Ruby 3.4 bundled openssl needs update to 3.3.1+ if RUBY_VERSION < "2.7.0" - spec.add_dependency "openssl", ">= 3.1.2", "< 3.2.0" + gem "openssl", ">= 3.1.2", "< 3.2.0" elsif RUBY_VERSION < "3.3.0" - spec.add_dependency "openssl", ">= 3.1.2" + gem "openssl", ">= 3.1.2" elsif RUBY_VERSION < "3.4.0" - spec.add_dependency "openssl", ">= 3.2.2" + gem "openssl", ">= 3.2.2" elsif RUBY_VERSION < "4.0.0" - spec.add_dependency "openssl", ">= 3.3.1" + gem "openssl", ">= 3.3.1" end group :test do From d0975906d137c4cdcc8a94e5ecc36bb790efa274 Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Fri, 2 Jan 2026 12:24:50 -0600 Subject: [PATCH 63/64] cleanup Signed-off-by: Corey Hemminger --- .expeditor/verify.pipeline.yml | 11 ----------- .github/workflows/lint.yml | 2 -- 2 files changed, 13 deletions(-) diff --git a/.expeditor/verify.pipeline.yml b/.expeditor/verify.pipeline.yml index 43342c48..a3509bb6 100644 --- a/.expeditor/verify.pipeline.yml +++ b/.expeditor/verify.pipeline.yml @@ -58,17 +58,6 @@ steps: docker: image: ruby:3.4 -- label: run-specs-ruby-2.6-windows - command: - - .expeditor/run_windows_tests.ps1 - expeditor: - executor: - docker: - host_os: windows - shell: ["powershell", "-Command"] - image: rubydistros/windows-2019:2.6 - user: 'NT AUTHORITY\SYSTEM' - - label: run-specs-ruby-2.7-windows command: - .expeditor/run_windows_tests.ps1 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 82a1d73b..9ccc5ea9 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -11,8 +11,6 @@ concurrency: jobs: cookstyle: - env: - BUNDLE_WITH: ${{ inputs.bundle_with }} runs-on: ubuntu-latest strategy: fail-fast: false From 93c0c19d82e55231b32bbd927b29898cf4d45a3d Mon Sep 17 00:00:00 2001 From: Corey Hemminger Date: Fri, 2 Jan 2026 12:46:51 -0600 Subject: [PATCH 64/64] cleanup buildkite build versions Signed-off-by: Corey Hemminger --- .expeditor/verify.pipeline.yml | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/.expeditor/verify.pipeline.yml b/.expeditor/verify.pipeline.yml index a3509bb6..423499eb 100644 --- a/.expeditor/verify.pipeline.yml +++ b/.expeditor/verify.pipeline.yml @@ -58,28 +58,6 @@ steps: docker: image: ruby:3.4 -- label: run-specs-ruby-2.7-windows - command: - - .expeditor/run_windows_tests.ps1 - expeditor: - executor: - docker: - host_os: windows - shell: ["powershell", "-Command"] - image: rubydistros/windows-2019:2.7 - user: 'NT AUTHORITY\SYSTEM' - -- label: run-specs-ruby-3.0-windows - command: - - .expeditor/run_windows_tests.ps1 - expeditor: - executor: - docker: - host_os: windows - shell: ["powershell", "-Command"] - image: rubydistros/windows-2019:3.0 - user: 'NT AUTHORITY\SYSTEM' - - label: run-specs-ruby-3.1-windows command: - .expeditor/run_windows_tests.ps1 @@ -91,17 +69,6 @@ steps: image: rubydistros/windows-2019:3.1 user: 'NT AUTHORITY\SYSTEM' -- label: run-specs-ruby-3.3-windows - command: - - .expeditor/run_windows_tests.ps1 - expeditor: - executor: - docker: - host_os: windows - shell: ["powershell", "-Command"] - image: rubydistros/windows-2019:3.3 - user: 'NT AUTHORITY\SYSTEM' - - label: run-specs-ruby-3.4-windows command: - .expeditor/run_windows_tests.ps1