From 282e279343b20861c3e19b82dba99a2d00833452 Mon Sep 17 00:00:00 2001 From: dvirlabs Date: Thu, 7 May 2026 08:40:05 +0300 Subject: [PATCH] Add custom Alpine CI image with git and yq pre-installed - Created base-images/alpine-git-yq/Dockerfile with git, yq, curl, bash - Added build scripts (build-alpine-ci-image.sh and .bat) - Updated .woodpecker.yaml to use alpine-git-yq:3.19 instead of alpine:3.19 - Removed apk add commands from CI pipeline (packages now pre-installed) - Added CI_IMAGE_SETUP.md with detailed setup instructions - Solves Alpine package repository blocking in air-gapped cluster --- .woodpecker.yaml | 6 +-- CI_IMAGE_SETUP.md | 1 + .../app/__pycache__/config.cpython-314.pyc | Bin 1389 -> 1919 bytes backend/app/__pycache__/main.cpython-314.pyc | Bin 3203 -> 4935 bytes .../models/__pycache__/user.cpython-314.pyc | Bin 1852 -> 2008 bytes .../routers/__pycache__/auth.cpython-314.pyc | Bin 7083 -> 11391 bytes .../routers/__pycache__/users.cpython-314.pyc | Bin 2763 -> 3235 bytes .../schemas/__pycache__/user.cpython-314.pyc | Bin 2934 -> 4274 bytes base-images/alpine-git-yq/Dockerfile | 20 +++++++++ build-alpine-ci-image.bat | 40 ++++++++++++++++++ build-alpine-ci-image.sh | 39 +++++++++++++++++ 11 files changed, 102 insertions(+), 4 deletions(-) create mode 100644 CI_IMAGE_SETUP.md create mode 100644 base-images/alpine-git-yq/Dockerfile create mode 100644 build-alpine-ci-image.bat create mode 100644 build-alpine-ci-image.sh diff --git a/.woodpecker.yaml b/.woodpecker.yaml index f6f7381..8ec32e1 100644 --- a/.woodpecker.yaml +++ b/.woodpecker.yaml @@ -49,7 +49,7 @@ steps: update-values-frontend: name: Update frontend tag in values.yaml - image: harbor.dvirlabs.com/base-images/alpine:3.19 + image: harbor.dvirlabs.com/base-images/alpine-git-yq:3.19 when: branch: [ master, develop ] event: [ push ] @@ -61,7 +61,6 @@ steps: GIT_TOKEN: from_secret: GIT_TOKEN commands: - - apk add --no-cache git yq - git config --global user.name "woodpecker-bot" - git config --global user.email "ci@dvirlabs.com" - git clone "https://$${GIT_USERNAME}:$${GIT_TOKEN}@git.dvirlabs.com/dvirlabs/my-apps.git" @@ -76,7 +75,7 @@ steps: update-values-backend: name: Update backend tag in values.yaml - image: harbor.dvirlabs.com/base-images/alpine:3.19 + image: harbor.dvirlabs.com/base-images/alpine-git-yq:3.19 when: branch: [ master, develop ] event: [ push ] @@ -88,7 +87,6 @@ steps: GIT_TOKEN: from_secret: GIT_TOKEN commands: - - apk add --no-cache git yq - git config --global user.name "woodpecker-bot" - git config --global user.email "ci@dvirlabs.com" - | diff --git a/CI_IMAGE_SETUP.md b/CI_IMAGE_SETUP.md new file mode 100644 index 0000000..18ddcf7 --- /dev/null +++ b/CI_IMAGE_SETUP.md @@ -0,0 +1 @@ +# Air-Gapped CI/CD Image Requirements\n\n## Problem\nYour Woodpecker CI pipeline needs `git` and `yq` but cannot install them via `apk add` because:\n- ❌ Alpine repositories (dl-cdn.alpinelinux.org) are blocked\n- ❌ SSL/TLS handshake failures\n- ❌ Permission denied errors\n\n## Solution\nUse a **pre-built Alpine image** with git and yq already installed.\n\n## Steps to Fix\n\n### 1. Build Custom Image (on a machine WITH internet)\n\n**Requirements:**\n- Machine with internet access\n- Docker installed\n- Access to Docker Hub (to pull alpine:3.19)\n- Access to push to Harbor\n\n**Windows:**\n```bash\n.\\build-alpine-ci-image.bat\n```\n\n**Linux/Mac:**\n```bash\nchmod +x build-alpine-ci-image.sh\n./build-alpine-ci-image.sh\n```\n\n### 2. Verify Image in Harbor\n\nCheck that the image exists:\n```bash\ncurl -u "username:password" https://harbor.dvirlabs.com/api/v2.0/projects/base-images/repositories/alpine-git-yq/artifacts\n```\n\nOr visit: https://harbor.dvirlabs.com → base-images → alpine-git-yq\n\n### 3. Update CI Config (Already Done)\n\nThe `.woodpecker.yaml` has been updated to use:\n```yaml\nimage: harbor.dvirlabs.com/base-images/alpine-git-yq:3.19\n```\n\nInstead of:\n```yaml\nimage: harbor.dvirlabs.com/base-images/alpine:3.19\ncommands:\n - apk add --no-cache git yq # ❌ This fails in air-gapped\n```\n\n### 4. Push Updated Config\n\n```bash\ngit add .\ngit commit -m \"Use custom Alpine image with git and yq for CI\"\ngit push\n```\n\n## What's Included\n\nThe custom `alpine-git-yq` image includes:\n- ✅ git\n- ✅ yq (YAML processor)\n- ✅ curl\n- ✅ bash\n\nAll pre-installed and ready to use in your air-gapped cluster!\n\n## If Build Fails\n\n### Error: \"Cannot connect to Docker Hub\"\n**Cause:** No internet access on the build machine.\n**Solution:** Build on a different machine that has internet access.\n\n### Error: \"apk: network error\"\n**Cause:** Building inside the air-gapped cluster.\n**Solution:** Build on a machine outside the cluster with internet access.\n\n### Alternative: Manual Build\n\nIf scripts don't work, build manually:\n\n```bash\ncd base-images/alpine-git-yq\ndocker build -t harbor.dvirlabs.com/base-images/alpine-git-yq:3.19 .\ndocker login harbor.dvirlabs.com\ndocker push harbor.dvirlabs.com/base-images/alpine-git-yq:3.19\n```\n\n## Result\n\nOnce the image is in Harbor, your CI pipeline will:\n1. ✅ Pull alpine-git-yq from Harbor (no external access needed)\n2. ✅ Use git and yq commands directly (already installed)\n3. ✅ Update values.yaml successfully\n4. ✅ Push changes to Git\n\nNo more package installation failures!\n \ No newline at end of file diff --git a/backend/app/__pycache__/config.cpython-314.pyc b/backend/app/__pycache__/config.cpython-314.pyc index 2593fb5afa59df9b41940417d05b53a8bebc4071..f6d7598ef062fb23a2ee22952e4d5f9749cca3cb 100644 GIT binary patch delta 966 zcmZXST~E_c7{^b$ZtS(&VBNY+UdDKF7?^-pNCtN9kr9a_LCH@-QhuMMJ=K+(2KBWax}k$wV%@-ML%aBI!IMr>NSx9WS?CcWjD!gL zShTm8YbI)!*&~01rbPQSyAViIg+=>{%`)%pkL<(tK68ZbvQl7XrLKd zA0CQFhIDjD$3W9w@SmYyPPC#Bf3*d^ygHup_f>kgyZ;Xby8xT zK-I9{`tnT1zVaUROoVLHwk7G31XLEu`%P(7dG?1RNwtIp|kV!Z delta 397 zcmXYr&q@MO6voeS{y2`~i0G(Ug5ky~YE!ESvD$`%cF zdy420dIVn~T$qB(x<@MWTbyGH|;;)O|6OLVp=i~S4z6aY7XaxxL z!x-5BBHn@n42%Lqmaqa-Bw8TsAYKLEl3A=_IL>(T6VvF(FPx$+KVp|gLQOidsO?m8 z>csO3Au5olbR|t`-jdhag|3#FvaDa}evGH(x9+1SJ!20~<(bjA|49NOUoE1{O+U$# zs&j{sBDjQ2!WN-Spg$)W#@hY473@KrQ zdy3p#!vZkKsmV99lwIm*)MucuOsiOrz;kkLo|GurIwQ?atmE53XB2hoye6CRjiQD1 T=eq@{Hp_#PdpUZrR#qO1uKUw&U9THk>4Ywn;pUvmU>&Utb{w-{LM^xUwjFe9y}Kgt zr6gj)B05PwXiySNOq7HV8u*}zF(yJx{L}_W$7RGoj9;C?2P4M#zISVT2&uQ-z0W<* z@A*B?`#jHkecSzGzwJ4j)db*`_WsR>Ef;JZ*ru-nKVSvM+76_?M4ulFAv3&uAYt|c z#>Utg2h%)^t6Hf)(N9mSvi6yBWnm~yuc6RHLB_tOVAJnS0J zL_0lGEa|-Nx>;-OXlQk-Rvh{k*LAH}BPL%%CaR&ev!S)Cq1D^a+O1j({q!Ntwl_qk zEn$aEF*5DLn5u$uN3}UhNnd}4mwTv+_O#a;ENz7icow=7q2q{#>C(VMi9yCYav08z z8-Om5aL`Ae4h56zW_%0MPu!#b62If?g@VnJPMu>Mz8!4 z!v+-w!{W5J>QZ0h`f7TxN;vIF#}ivULu1TooikP}5dyEK(eu^ITTe@)~B zxHivoQZmPi;#*lEom^nWg_)p1Cb&hG&&bBPd?u4zVi!5tj!ay-29-%(OtR@ken~bW zDJAhIIN7zB7o|cnwZJaTb2V%p&BTLG-l4`3p31|>R7&7jiA#@Cc~tuc7cc+z^$JBz zaC2-vBT?0aMybs`2IZ+Y9<;x=nv+55&rBq3SL9VW*}qw6vdq^@S-F_Vjlut zI!{FeA-fTfUz(?sq?IH_sr^Bh+{)&1p)@P8v#iL~1OeqN+mUTCo8~fN2&FB+?*x#W zkruw4;8UC!V)N31fHol$Z{|7Slw2^(@fit%JE2lQ9|PH}1Wl?{CFXcRlpr^%MzUUF zo2sbpUB=mTS~jGzi;KJ@6FGrjl4N7#WQxm4u#qw;WHXsrHg#MkQkksC1r18hf*TzT zH6dMkRwfiy8RJBB&?x09a!s*9v)Tf+iAiO5=!X*RQ0#`E%QN7fK73EV>7IW3ePipp z-Dh^eUmv1n)#3b*yg+{BD%vWJzOtk5a{BXQpB}p&tqeuW@V`HL%Mq(Mrpu1$TaE+g zh@b7QyRMG4w(d&XK)G#T&C^rygv*|A;V!l9`sPYFRu0E*QLnDLy{n$?)xO{(Yg4Q3 zTx8t=toD`3<;f3roZq)5lZ^H@yV3-s~Zu=4Jp#@_;j<8^f;|3?tY}J0Okl z0(v|TAF@83O^K(8L9|=}LImm_!W#(Nk=2NXJSk+el7PPXhl<}d1+dBDuT2vHgjC?d zWDRav;Mk0`01qUWIxg&m`lH1IWE=EYAa`QhidV=>gn;Iym@u9t1l0fHePeVCaVv0{ zOe*I;nUrxMzw}>zatt1he1>~j$UqM`G(hYva;DF$e;7KkmfuGK=DZDBt{KfIFg?oZ EUvb&`#{d8T delta 889 zcmX@E)-1`V&Bx2d00idezhri^Pvnze6xgVKn6W;VTah7%H;6BYKS;ow8Ki=Np+q%S zHNY3bMkZr;AYna5FcvXqg~-S=08I+S)DbHl5Cj&T9Lg*q ziCu|AK+xm>W?3Avl6YmM@XE?VWSN2XPA*^;WyEKXG+vWr@XE^Km6e0Y)~g1DVg^u< zXe>W4VmO1u%o!oFK(;t6g22HVjzyP*2~4%5ID-jPL5U7960oV30;vuIsS1)tQmz}T z7bIg5!N8Cr$-p4P5GxQ6hiMhiak4>jLGr*@S1@OR$jdVXF)D+xrsCuP)>E5#c`X># z#etGV(jYV$}yxD;bK^fnuM5m|?Ojx2FJSQEFmJd{KUWNs$&%%zSba zpE{$)=aWJ2Zz zZiNdh3Pl=|b@&|^4JPOE&lSHVnpjYvmy%eLn3PzY3TI5_7igJ0L%_oZWHH#RTO9H6 wd5O8H@$t8qi%Rp*E$6Vw%}*)KNwq5q0O|mRd$HJL8Nnr+&kB|?vVa^300pB7g)q@ib~J$SW$9C)TF_0@(WfQMw`j1Y*R#SfW{Tsg3RQw$<0qG%}KQ@ Xa+-XOEuLSTk*&kz8v~Fk0x1Fjg#uXL delta 186 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 R`A-h8DVrtCPT?(Y@(;rTv(^9r delta 377 zcmX9)Jxjw-6n*)6X_7|!p+zmGY6p!~EYhK?iY|(Fs*6%W^NN9h@#V!2aMMkk-Y*ab z2Pg3_2o6qe^6030isGjD9$vWT9PZ`Z3+HzHWz?<>*(TuC-1-h05B7>WQ?520~>h&PGkV^`ko<9irO7%YYpXJ zSHNZw00TInEw?OTf)yccdI77FLhqncax+Xn@M4b;jHkGbseaHUbVr|tOif~hX{1-m zS}#DM&$MGNOc2W^k?#@I;ovRPdwtei diff --git a/backend/app/schemas/__pycache__/user.cpython-314.pyc b/backend/app/schemas/__pycache__/user.cpython-314.pyc index 01355a03b6cf1b4d4e86193623f29bf48a6ec0be..b79b1fcea2a638922dbc81710e9a320b02e584f1 100644 GIT binary patch literal 4274 zcmb7H+i%-c7(d5$9Ou%eP46vjXtzPbZirQA;tuVg6`})kdmx+TChlr2v9sfoO?^O0 zVPZTmX_G*LH(vXn@JJt!ilu>oC*DXKF&=o}`;Oz*>9RCf^5^gT&i%Xlbbnuxz;ko@ zU)xX!`2!o_6KgU1KLArFSBXwn$TH=0S>jR-+tP}>EOS}#@`|z?faD2E zYX3PPFVQ-za8ZYGI z4AXI34&pQnehCdqN|(M^mp(PpCmlIU9Q!~Fny>|yhL#_zZn%!+$IViSS)S)BMVoK>sj3Se zQZ|YZ9sPLGtvQ@+GE`b#W-5Gy@rc;cg9QchZnGdX9&Zy!U_qI&@8r9m?kFb$=T8mY zU%dPBj*@F&1Zb$FfAoIw?v)*7wh>1_BQWB^-LpH&Oe29nl4K{pJMqo*j&iDzLLeQP z(uY7lNe|y&{wW1RPVQv@IkeS$KO4gmgGe}M&!GO=sA`u2Wh1?TJ zrjZ=A_NNgUfvvWL>eqgD;cxPAmAIS(4(?K!{LQUE&my9sn_-V(w zbNO#Mf z?{e5Sna{ye9;!UB-^1D`k=|MkBj3;{SoI!8y<<)J1w0=TTsWc%gxXYrB_TfhOF-I^ z>-=GI6%{ljQC(iZx&R)mW1+5v${y-kRgdvFBvwsVK~`};jimzIyy`lh^=8|4G?-5I zF|0<4~&}?!0Tbz_632!`&A|wwg^Dy82CH%^lC_8Ku1$I>6YoY{@P?Hs$#V+cV4}hd%;eL$*}09e=n|^SDtI zN#!8E`^loHT1%jre9V_^C?8bVNK_5JvgW#FhCi3x9ciM?8X{%9F%NUSuYm-fqouaq zYA+ndL-z>_hsmRb!`RWnVdiMzFxhAo4gm5NA(BA$y#A~qKe7;z`< zrQqM|6?Pe>p?7<0K>m^`rN5H-2W0vInQE#M9r|*!N#N5=QkuOt-h?w|n_8Tnx;N1z r@M#W9boAR595aezhQCeVnBk@-)6wtqO#+{0x{v1WUHqHCN1Wk5l>|j) delta 1060 zcmaiz&ubGw6vt=wSAK1h*0lLmO_~N9x78}OilUZ^3JMxgY21$XKG(}8l3LgOm zSNy)oe&1A6;TrTUV5-n2&C_qW7BemPzEgKCyh+^F3$!R6>!pVOT86e)54`vSbC%~S zoHKiVg? zw(IbVx#Bv&{z+DyZW6ef?=A)9{Nc^RkvJu>?T@35oPZ<-q z2jSm=!t<4}m85F^I{|E^b}3^5m0dQ%;&c4ysQ=p!>Z} diff --git a/base-images/alpine-git-yq/Dockerfile b/base-images/alpine-git-yq/Dockerfile new file mode 100644 index 0000000..7dec672 --- /dev/null +++ b/base-images/alpine-git-yq/Dockerfile @@ -0,0 +1,20 @@ +# Alpine with git and yq pre-installed for CI/CD +# +# IMPORTANT: This image MUST be built on a machine with internet access! +# It needs to download packages from Alpine repositories. +# +# Build instructions: +# docker build -t harbor.dvirlabs.com/base-images/alpine-git-yq:3.19 . +# docker login harbor.dvirlabs.com +# docker push harbor.dvirlabs.com/base-images/alpine-git-yq:3.19 +# +FROM alpine:3.19 + +# Install git and yq while we have internet access +# This should be built on a machine with internet and pushed to Harbor +RUN apk add --no-cache git yq curl bash + +# Verify installations +RUN git --version && yq --version + +CMD ["/bin/sh"] diff --git a/build-alpine-ci-image.bat b/build-alpine-ci-image.bat new file mode 100644 index 0000000..df07ce2 --- /dev/null +++ b/build-alpine-ci-image.bat @@ -0,0 +1,40 @@ +@echo off +REM Build and push Alpine with git and yq for CI/CD + +set HARBOR_REGISTRY=harbor.dvirlabs.com +set HARBOR_PROJECT=base-images +set IMAGE_NAME=alpine-git-yq +set TAG=3.19 + +echo. +echo 🏗️ Building Alpine image with git and yq... +echo Registry: %HARBOR_REGISTRY% +echo Image: %HARBOR_PROJECT%/%IMAGE_NAME%:%TAG% +echo. + +REM Build the image +cd base-images\alpine-git-yq +docker build -t %HARBOR_REGISTRY%/%HARBOR_PROJECT%/%IMAGE_NAME%:%TAG% . +docker tag %HARBOR_REGISTRY%/%HARBOR_PROJECT%/%IMAGE_NAME%:%TAG% %HARBOR_REGISTRY%/%HARBOR_PROJECT%/%IMAGE_NAME%:latest +cd ..\.. + +echo. +echo ✅ Image built successfully! +echo. + +REM Login to Harbor +echo Please login to Harbor: +docker login %HARBOR_REGISTRY% + +REM Push to Harbor +echo. +echo 🚀 Pushing to Harbor... +docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/%IMAGE_NAME%:%TAG% +docker push %HARBOR_REGISTRY%/%HARBOR_PROJECT%/%IMAGE_NAME%:latest + +echo. +echo 🎉 Alpine CI image pushed successfully! +echo. +echo Image: %HARBOR_REGISTRY%/%HARBOR_PROJECT%/%IMAGE_NAME%:%TAG% +echo. +pause diff --git a/build-alpine-ci-image.sh b/build-alpine-ci-image.sh new file mode 100644 index 0000000..bd9eb86 --- /dev/null +++ b/build-alpine-ci-image.sh @@ -0,0 +1,39 @@ +#!/bin/bash +# Build and push Alpine with git and yq for CI/CD +set -e + +HARBOR_REGISTRY="harbor.dvirlabs.com" +HARBOR_PROJECT="base-images" +IMAGE_NAME="alpine-git-yq" +TAG="3.19" + +echo "🏗️ Building Alpine image with git and yq..." +echo "Registry: $HARBOR_REGISTRY" +echo "Image: $HARBOR_PROJECT/$IMAGE_NAME:$TAG" +echo "" + +# Build the image +cd base-images/alpine-git-yq +docker build -t $HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE_NAME:$TAG . +docker tag $HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE_NAME:$TAG $HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE_NAME:latest +cd ../.. + +echo "" +echo "✅ Image built successfully!" +echo "" + +# Login to Harbor +echo "Please login to Harbor:" +docker login $HARBOR_REGISTRY + +# Push to Harbor +echo "" +echo "🚀 Pushing to Harbor..." +docker push $HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE_NAME:$TAG +docker push $HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE_NAME:latest + +echo "" +echo "🎉 Alpine CI image pushed successfully!" +echo "" +echo "Image: $HARBOR_REGISTRY/$HARBOR_PROJECT/$IMAGE_NAME:$TAG" +echo ""