From 022fb3dd999dec7c83f225446b42a5abe0c3689b Mon Sep 17 00:00:00 2001 From: benya Date: Sat, 17 Jan 2026 23:37:17 +0300 Subject: [PATCH] =?UTF-8?q?chore(ci):=20=D0=BD=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B0=20CI/CD,=20release=20=D0=B8=20Android-?= =?UTF-8?q?=D1=81=D0=B1=D0=BE=D1=80=D0=BE=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - GitHub Actions для сборки APK - Docker и F-Droid packaging - Подпись, keystore и release pipeline - Исправления CI и тегов --- .gitea/workflows/release.yml | 98 +++++++++++++++++++++++++++++++++++ app/build.gradle | 24 ++++++--- assets/app_icon.png | Bin 0 -> 7694 bytes assets/icon.png | Bin 0 -> 7694 bytes 4 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 .gitea/workflows/release.yml create mode 100644 assets/app_icon.png create mode 100644 assets/icon.png diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..2149f71 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,98 @@ +name: Android Release + +on: + push: + branches: + - master + +jobs: + release: + runs-on: ubuntu-latest + + steps: + # ------------------- Checkout ------------------- + - name: Checkout + uses: https://git.daemonlord.ru/actions/checkout@v4 + with: + fetch-depth: 0 + tags: true + + # ------------------- Setup JDK ------------------- + - name: Set up JDK 17 + uses: https://git.daemonlord.ru/actions/setup-java@v4 + with: + distribution: temurin + java-version: 17 + + # ------------------- Install Node.js ------------------- + - name: Install Node.js + run: | + curl -fsSL https://deb.nodesource.com/setup_22.x | bash - + apt-get install -y nodejs + + # ------------------- Extract version ------------------- + - name: Extract versionName + id: extract_version + run: | + VERSION=$(grep -oP 'versionName\s+"[^"]+"' app/build.gradle | head -n1 | cut -d'"' -f2 | tr -d '\r\n') + echo "version=$VERSION" >> $GITHUB_OUTPUT + echo "Detected version: $VERSION" + + # ------------------- Stop if already released ------------------- + - name: Stop if version already released + id: stop + run: | + VERSION=${{ steps.extract_version.outputs.version }} + if git show-ref --tags --quiet --verify "refs/tags/$VERSION"; then + echo "Version $VERSION already released, stopping job." + echo "CONTINUE=false" >> $GITHUB_ENV + else + echo "Version $VERSION not released yet, continuing workflow..." + echo "CONTINUE=true" >> $GITHUB_ENV + fi + + # ------------------- Decode keystore ------------------- + - name: Decode keystore + if: env.CONTINUE == 'true' + run: | + echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > app/release.keystore + + - name: Make Gradlew executable + if: env.CONTINUE == 'true' + run: chmod +x ./gradlew + + # ------------------- Set up Android SDK ------------------- + - name: Set up Android SDK + if: env.CONTINUE == 'true' + uses: https://git.daemonlord.ru/actions/setup-android@v3 + + # ------------------- Build Release APK ------------------- + - name: Build Release APK + if: env.CONTINUE == 'true' + env: + KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }} + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + run: ./gradlew --no-daemon assembleRelease + + # ------------------- Git tag ------------------- + - name: Create git tag + if: env.CONTINUE == 'true' + run: | + git tag $VERSION + git push origin $VERSION + + # ------------------- Gitea release ------------------- + - name: Create Gitea Release + if: env.CONTINUE == 'true' + uses: https://git.daemonlord.ru/actions/gitea-release-action@v1 + with: + server_url: https://git.daemonlord.ru + repository: ${{ gitea.repository }} + token: ${{ secrets.API_TOKEN }} + tag_name: ${{ steps.extract_version.outputs.version }} + name: Release ${{ steps.extract_version.outputs.version }} + body: | + Android release ${{ steps.extract_version.outputs.version }} + files: | + app/build/outputs/apk/release/*.apk diff --git a/app/build.gradle b/app/build.gradle index 563d3e6..412b2ed 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,26 +4,39 @@ plugins { android { namespace 'com.anabasis.vkchatmanager' - compileSdk { - version = release(36) - } + compileSdk 36 defaultConfig { applicationId "com.anabasis.vkchatmanager" minSdk 26 targetSdk 36 - versionCode 3 - versionName "1.1.1" + versionCode 10103 + versionName "1.1.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } + // --- Настройка signingConfigs --- + signingConfigs { + release { + // Путь к keystore — от корня проекта + storeFile file("release.keystore") + storePassword System.getenv("KEYSTORE_PASSWORD") ?: "change_me" + keyAlias System.getenv("KEY_ALIAS") ?: "change_me" + keyPassword System.getenv("KEY_PASSWORD") ?: "change_me" + } + } + buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + + // Используем signingConfig release + signingConfig signingConfigs.release } } + compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 @@ -31,7 +44,6 @@ android { } dependencies { - implementation libs.recyclerview implementation libs.viewpager2 implementation libs.material diff --git a/assets/app_icon.png b/assets/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..41bcf7640003c957e6c9863af3095fece3c52b17 GIT binary patch literal 7694 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 N*C8A3eHHny{{yj2@gV>J literal 0 HcmV?d00001 diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..41bcf7640003c957e6c9863af3095fece3c52b17 GIT binary patch literal 7694 zcmeHM`(G1h)*mjepaNEFaTSQSg33(=MQ#aJD=13r>Vh{2UJ5E|Py!i|9M{?YW?R^Zu}!0=Bj zjc{^!gKnVaf~Twu+U4X3yqyIwHdZTIIZ#$ywCMsjlYrABYpiZoQLYEkt411x1u?UM z6PCbNjr7SzzCmbzP2~laScl;1ESyOQ-+!b5?Gc$q6e~JYNO+daH6&0?^?p#5vbq>~|*LFof=bUI8 z(Bp0l9&^p_^jIOD>gh^QX4A=<5=wno|S9f-yp}aXC#(V|JgNKt2mYq8x!mvjLZEmKYj& zGVVFHnB6=|C8Ef9F3$d2dq2miUGwXeTq!+@OXR=&U`&@RxYA*6@Qs0caPz2=5O%B2 zESqsN(II=w`WqhD^3i$%&WmO70|6ByFE4odttrt&_cs-I;jzE@ZO|6(dlajY&CiX1 zmB*u0AJG5f-m6uqV~P78FmW`aY_Abad~wanOp=&Fz4hcXzM*;aA`#l>jbVsT|MFl$ zV%ss$!El$-(Hh zbSP^z7dI0dkx6$5Qd7>Xu=+XS2{$YJH4(w7hE^3cG+yud2BT=alWY0ne-*Uq}N`i@)cev5CLS0RHt*|MS@OWEs9F~l}l#rW?NzJZE)@qME8F(@S z@)gI>9Cb>5N=oi-Sa~F>>?p1_d79W6&6e2*Z?D71RrY{bYbfZs@7{;BoxYZvMT1Xa zvZKWMkAtDn^a*xdAW$PLFzkzm8G42>B{5))NSoJaO*F(q6}b%@tw?|MwQ%n5&ZV5z?@h12nB zaP%$L+oNPA5&qA*_o`nfUQp~p1~?d4Uodfow5^LSf&-oK=S1RprLg??Qp50&HRv(& z2jThp>atids-bwp%>}+6G_6e(Q*fdWH8#175<+GQ5ju#ngc!}@j^m1E?j^%qO*DQ| zo+6%Kb#}YkA=(D;wTK?ocO9pqdEDgFbd-vS**GF01bU_wM-A1b%Cp526Vn4bszrwv zTrECVB6&6ezb$ELA@H$SI<+Q_X&=P&_c1Y_ph9ck#(AH|9RrfTkN01jf!vop`;Rbi zCo2jt00I7D$p1qv~c3G+*f=oz~m4?MYN}3RG4y;216;opHd%~E&0*aEV$aS!0%&e=9S>xOVT9#($n7q z(lA5j=qZqHE&EtqTUya{XX?lD9=^%aP$r+g^z=wf7?))qaRho70}aF}%Lu8Ka*N;? zGORQYNc@lKo-+QJ00GG+Z4Uo76*(x$=EsTPjc* z_;JO8u6!y&M>6dY?5h5cvG2;pyF?RBjoS~aZq|b1Mh5S9$^1@fDisv9(PC;fTZv3O zrKdbnKs83|vG*SB0}~|bx{i8p4tm}wn(t0dPOh)26{e&A<;-GI6vQ6c9)@5?q4cwl zC*4=&iryy^I$!RsN87DYte;X@BrAyKsIZY6!v(W^;OwoRB0ALh?T9*`siyL_E3MI6 zMv8V%=GLOW8HHK8h^CcMRt(6Y?~Jv^YG^v6DE^sV1ox?Exke&)9id*~bR>gb1!(R8 zht2^@iMHhaa)lmNx^Lm23Moqd66js@F?j{$tnA+PNg1GNp1)}x3%^The#Dv;w2x$u zIIsMayvXN+)X7Bc z>($qD+21yZplQbP%^8Bg1PpP z$hsn1d*rVFCkt=VjtYF=%jt)WeEhnRgKl@Xi_`EujRb!?3LOy1LF5q8$|#TDHQLN8 z#t1KMfF_N=y)Ml8XFMw!1JhD36QB62o6*(3k8-tm2oR!+%?V&A8}GV&>yHIyNm zXdkKTxSld$Weme9g5zQ<4rptHC+pq&5l(yK^e_Z@C%j~&$UjUvcXJVBIDE}lESEJP zO38VkJOn6R_pu&>!XkXH_Ot3l!iS&U3J|*q{Zf&&v5Rs}YM94Ag|@A@5$o^u-}5@| zoWUG03UH3V%daF>7HMBl{LmyA!#l;zUa26(`{d)|Ld!eEXvp4fi^X7acc-xR-HlkRc^tcs5 zjgVoxPz1sOwx0P(M;lMU(}`_VCp2oAkyAEo4D=U<>$q%qk?S!$;1J>wfV}tt}rHiL?&>h!u;xyg&C0W`DCAv1Py7WwBJv1dW7g#EQ zS?|MtVZ{mFq!lfc&IZ_TdixejdNO%%GnCfs#^Qq5xm_C9I-CYhFR(V*R>u4r&$c>r zpo*93hRkcn&fXIO)z3F+kY}gw=LKjc)Jlb7J&!@PBB7&6tSE=fekX^Nmn}J9q-kEQ zVxhdL(Hh;ILDvsCgB(zAUZc&V>mlvfh0-C>cxn6%$~Rv-0zO9s{VykI?jiYCBIIGu zqoVp$DI0+6ptg8GE2qJ$7dv2mukV=MRw~|+Zo7}rlJ-R-NkhYXVEWm3i{$)9(rSgO zhJk<3l}4R&M%`ut_E&6B*b59p;#^3GHl(%7zklPL3xEbz2w`D@Y(uYJzF{{;jTt6w z3$@c$&@6r6k)27$0)MV@t+Yp8S|qp1`hJy^syVZRt3#e)J}!df&NRykDXmVS*7k(m zYJVrNM?SMm_Gon1G#05^`G)ReC&j|mrg>(HbTH{5%G=P9))1hc3q&eR0Gl85SHm#Bh`%XKSHG^MFXL z92`r>Q;q9ed|k=&c0>39E~}>oBs~$@QN1(U94|I*eP|=9s$Is-lD11_}x3 zetjRra{u;@H=rV2-Q?BhTQ(T;mD(aXSuyo7tax-IR~}aXE+l7+y}!4!TYnI`cY7tE zNJn2i>FG!Hy;i}HBO?W{IMi|Pa{t*#1GF8Z*L)f4+Pz+pT$VP^ERwN*O&^O}3vn@( z<^lG;tHBEOt3REKCcn88zI_j1M_x7Lu~e4|SOftRDE8ISk4PBWDEHsq|F+w7fl!6Y z2Ocpxs;08;Q%SP`6U$^If()yzsEPU=oX%N5AU0od<)>))y*%@P0Mk5>d4!xVD(?AG zc&Z}*dtmKKe_`U>^jZkC#I1wa=jl)_c**vgxCjVC=kqvZ_%Ir(&nB!3Tl!TrxawB6 z&Kpp8EW;u=e`obf!e(!eE&M3GmxAq7#|(zxxmdPpPtl&NIDW@OP^NE)$u^B>9^%+05awGSBcdKq8 zK;F9+=1cA41kird1q)2tnsW?6LfPw8j|USsgOUV*B^T|jm^^zzrYyRS$I75kc;pNs1Q-?g-KJFRsOS>W za_&v3X*-+65D0%tTrh{b7zc8ksgeuJx<#}bZc}PrXpZXoQye?4Sy_W*Dh|nhcgkw1 z#Fp2t^7Zq}4-L0SW(mN^gFb!AR|hNhU*vuB;1@iqXW>atXjoII=h=e7+kv*G3rGl) zvPRU2T+bx-v2R$=(Edx^tyyH?`;F1m18@WMns*2bt%U#Mq@ zL-~eB*w8B#_~9Y^FACqFJ@t)QWaL4|KJ~M8e8aLuxa%k4Rh>wLypDSjBY+&uhWv*I zc*`8|t(6(*J6U1U_25$AG#zDBpqn_9W&$`o{ili?l&PeaW&Z$1DJwdBVgEtSEh4>r zljK)J4?Q^Ow?i5v;1^)7UCt&OgY?P79CyvYBI5nTY~Q$da^c`Pc6qXeNviODCQZ(K z{zVwF*A930P&5y#i!kBZ+%>u&T6KWHBsTJ78B-t>wdNCq?xZ2vXbjzfIzm68Q9kdT zkqjS2r-BJ9*xzOgkiGM8B|G~j@4>d#D80WNtXG@1H#7&?lGw&b{37^`1gN zbMXBRU9~e9`U9TWg4b9dH@pQKHMAG`{<8ZLaMg#*9n<`Z?f*>dHz`DvHQpogp|nB< zu%)$$*GHL4&D8Ipgc7-TL0cS<7%$EFhWtJCzzc4`nbrfdbEU065=9`+5g;!7^l8Z* zyzLcYq!_!FYPso7c!nGKEX@!#_>`vPdgyXMaSUYM+3AW`;C(;rp!2En^^|rZE|p^I zWR_Uy3x{hYqG+_ zmy696R~4QTQ>PP~Z@n@powC9K$-Guo^c2@Xz)sJoR;Q9=N*-Z2_5?Pm2K5{&`*)J_ z*gwqP3>R;gR699!%-LgyV4pfzHC>Z61?rNnb;;}^6qDbHLdA zhS~=xzN2!d8F<>4?n%=BNssW&C>wLwrC9x4`k$VFHOV_GX+l{m`Q1L^`er*EEctV+ z97>9|&owI-LXY^Jo2pr*ZFTd@?B)Rx=s(-PWP&4+GdJ znujWqbQQH+?0CnpgR}k5_!xBgcS;9Zz6nE0Z!G~Ft+B2E)g@Kv5;&BV_&reb2rCzi zPEuyMf)`Hv9Ix9-P+udW9wKtb(6W)%>XR;PwHt>bt=tA|vGd775RjdE@6i*pJ3nm2 zAtFO80h*P`OW;5$lVAQzIi+S08-7s`*n=}7v+WVaMZn^=3V7kJNhDK5^b{xfvyL7>Gb)Fk-?%MtFqyfn*(8-KSHG1hM6w2M z`ANXf@DziCaSgB--s2^uLK<;kmGe)%ev?mk^fI!Y!TpU)p32X!8vA#Ef>((_i4B#9 z*`?ArCh7LitwFr$UB_Q#c9pOHy3P^+Zl?l3^0dEx{11cB2AUnNXJ2?Y`Rq3Ke_mkI N*C8A3eHHny{{yj2@gV>J literal 0 HcmV?d00001