diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6191a7f..848805d 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -50,5 +50,205 @@ jobs: run: | echo "Checking PSA_VERSION constant..." if grep -q "define( 'PSA_VERSION'" peptide-search-ai.php; then - version=$(grep "define( 'PSA_VERSION'" peptide-search-ai.php | sed "s/.*'|\([5ujVκK±qΫ -}[]i\υiW-ΝΡ(ν%θόυ1 %9Υ aΩ5ΜΕPΑ½E΅YQ9₯E9Y%© ΐΝ9YQ8¨½pΔΌˆ€(€€€€€€€€€€€•‘Ό€‹ŠrLAM}YIM%=8™½ΥΉθ€‘Ω•ΙΝ₯½Έˆ(€€€€€€€€€•±Ν”(€€€€€€€€€€€•‘Ό€‹Šv0AM}YIM%=8½ΉΝΡ…ΉΠΉ½Π™½ΥΉ₯ΈΑ•ΑΡ₯‘”΅Ν•…ɍ ΅…€ΉΑ‘ΐˆ(€€€€€€€€€€€•α₯Π€Δ(€€€€€€€€€™€((€€€€€€΄Ή…΅”θM•ЁΥΐA!@(€€€€€€€ΥΝ•ΜθΝ‘₯Ω…΅΅…Ρ‘ΥΘ½Ν•ΡΥΐ΅Α‘ΑΨΘ(€€€€€€€έ₯Ρ θ(€€€€€€€€€Α‘ΐ΅Ω•ΙΝ₯½Έθ€œΰΈΔœ((€€€€€€΄Ή…΅”θY…±₯‘…Ρ”A!@ΝεΉΡ…ΰ½Έ…±°™₯±•Μ(€€€€€€€ΙΥΈθπ(€€€€€€€€€•‘Ό€‰Y…±₯‘…Ρ₯ΉœA!@ΝεΉΡ…ΰΈΈΈˆ(€€€€€€€€€™₯Ή€Έ€΅Ή…΅”€œ¨ΉΑ‘ΐœ€΅Ή½Π€΅Α…Ρ €œΈ½Ω•Ή‘½ΘΌ¨œ€΅Ή½Π€΅Α…Ρ €œΈ½Ή½‘•}΅½‘Υ±•ΜΌ¨œ€΅ΑΙ₯ΉΠΐπp(€€€€€€€€€α…ɝ̀΄ΐ€΅ΈΔΑ‘ΐ€΅°€ψ€½‘•Ψ½ΉΥ±°€˜˜•‘Ό€‹ŠrL±°A!@™₯±•́…Ι”Ω…±₯ˆ((€€€€€€΄Ή…΅”θ ‘•¬™½ΘΝ•ΉΝ₯Ρ₯Ω”™₯±•Μ(€€€€€€€ΙΥΈθπ(€€€€€€€€€•‘Ό€‰M…ΉΉ₯Ήœ™½ΘΝ•ΉΝ₯Ρ₯Ω”™₯±•ΜΈΈΈˆ(€€€€€€€€€™½ΥΉ‘}Ν•ΉΝ₯Ρ₯Ω”τΐ((€€€€€€€€€Ν•ΉΝ₯Ρ₯Ω•}Α…ΡΡ•ΙΉΜτ (€€€€€€€€€€€€‰pΉ•ΉΨˆ(€€€€€€€€€€€€‰pΉ•ΉΩpΈˆ(€€€€€€€€€€€€‰Ι•‘•ΉΡ₯…±Μˆ(€€€€€€€€€€€€‰pΉ­•δˆ(€€€€€€€€€€€€‰pΉΑ•΄ˆ(€€€€€€€€€€€€‰ΑΙ₯Ω…Ρ•}­•δˆ(€€€€€€€€€€€€‰pΉΝΕ°ˆ(€€€€€€€€€€€((€€€€€€€€€™½ΘΑ…ΡΡ•ΙΈ₯Έ€ˆ‘νΝ•ΉΝ₯Ρ₯Ω•}Α…ΡΡ•ΙΉΝmuτˆμ‘Ό(€€€€€€€€€€€₯˜™₯Ή€Έ€΅Ή…΅”€ˆ‘Α…ΡΡ•ΙΈˆ€΅Ή½Π€΅Α…Ρ €œΈ½Ω•Ή‘½ΘΌ¨œ€΅Ή½Π€΅Α…Ρ €œΈΌΉ₯ΠΌ¨œ€Θψ½‘•Ψ½ΉΥ±°πΙ•ΐ€΅Δ€ΈμΡ‘•Έ(€€€€€€€€€€€€€•‘Ό€‹Šv0½ΥΉΝ•ΉΝ₯Ρ₯Ω”™₯±”΅…э‘₯ΉœΑ…Ρѕɸ耑Α…ΡΡ•ΙΈˆ(€€€€€€€€€€€€€™₯Ή€Έ€΅Ή…΅”€ˆ‘Α…ΡΡ•ΙΈˆ€΅Ή½Π€΅Α…Ρ €œΈ½Ω•Ή‘½ΘΌ¨œ€΅Ή½Π€΅Α…Ρ €œΈΌΉ₯ΠΌ¨œ€Θψ½‘•Ψ½ΉΥ±°(€€€€€€€€€€€€€™½ΥΉ‘}Ν•ΉΝ₯Ρ₯Ω”τΔ(€€€€€€€€€€€™€(€€€€€€€€€‘½Ή”((€€€€€€€€€₯˜l€‘™½ΥΉ‘}Ν•ΉΝ₯Ρ₯Ω”€΅•ĀātμΡ‘•Έ(€€€€€€€€€€€•α₯Π€Δ(€€€€€€€€€™€(€€€€€€€€€•‘Ό€‹ŠrL9ΌΝ•ΉΝ₯Ρ₯Ω”™₯±•́‘•Ρ•Ρ•ˆ((€€Œ€΄΄AΥΝ ±•…ΈΑ±Υ₯Έ™₯±•́ѼΡ‘”‘•Α±½δ‰Ι…Ή €΄΄(€Ν幌΅‘•Α±½δ΅‰Ι…Ή θ(€€€Ή…΅”θM幌‘•Α±½δ‰Ι…Ή (€€€ΙΥΉΜ΅½ΈθΥ‰ΥΉΡΤ΅±…Ρ•ΝΠ(€€€Ή••‘ΜθmΡ•ΝΠ°Ω…±₯‘…Ρ•t(€€€•ΉΩ₯Ι½Ή΅•ΉΠθΑΙ½‘ՍΡ₯½Έ(€€€ΝΡ•ΑΜθ(€€€€€€΄ΥΝ•Μ聅Ρ₯½ΉΜ½‘•­½ΥΡΨΠ(€€€€€€€έ₯Ρ θ(€€€€€€€€€™•э ΅‘•ΑΡ θ€ΐ((€€€€€€΄Ή…΅”θM幌‘•Α±½δ‰Ι…Ή (€€€€€€€ΙΥΈθπ(€€€€€€€€€₯Ё½Ή™₯œΥΝ•ΘΉΉ…΅”€‰₯ёՈ΅…Ρ₯½ΉΝm‰½Ρtˆ(€€€€€€€€€₯Ё½Ή™₯œΥΝ•ΘΉ•΅…₯°€‰₯ёՈ΅…Ρ₯½ΉΝm‰½ΡuΥΝ•ΙΜΉΉ½Ι•Α±δΉ₯ёՈΉ½΄ˆ((€€€€€€€€€€Œ•э Ρ‘”Ι•΅½Ρ”‘•Α±½δ‰Ι…Ή €‘΅…䁹½Π•α₯ΝЁ½Έ™₯ΙΝЁΙΥΈ€Έ(€€€€€€€€€₯Ё™•э ½Ι₯₯Έ‘•Α±½δι‘•Α±½δ€Θψ½‘•Ψ½ΉΥ±°ρπΡΙΥ”((€€€€€€€€€€Œ%˜‘•Α±½δ‰Ι…Ή •α₯ΝΡΜ°‘•¬₯Ё½ΥΠ쁽ё•Ιέ₯Ν”Ι•…Ρ”₯ΠΈ(€€€€€€€€€₯˜₯ЁɕءΑ…ΙΝ”€΄΅Ω•Ι₯™δ‘•Α±½δ€ψ½‘•Ψ½ΉΥ±°€Θψ˜ΔμΡ‘•Έ(€€€€€€€€€€€₯Ё‘•­½ΥЁ‘•Α±½δ(€€€€€€€€€•±Ν”(€€€€€€€€€€€₯Ё‘•­½ΥΠ€΄΅½ΙΑ‘…Έ‘•Α±½δ(€€€€€€€€€€€₯Ёɴ€΅Ι˜€΄΅…‘•€Έ€ψ€½‘•Ψ½ΉΥ±°€Θψ˜ΔρπΡΙΥ”(€€€€€€€€€™€((€€€€€€€€€€ŒI•΅½Ω”…±°ΡΙ…­•™₯±•́ͼέ”ΝΡ…ΙЁ±•…Έ•… Ρ₯΅”Έ(€€€€€€€€€₯Ёɴ€΅Ι˜€Έ€ψ€½‘•Ψ½ΉΥ±°€Θψ˜ΔρπΡΙΥ”((€€€€€€€€€€Œ ‘•­½ΥЁ½Ή±δΡ‘”Α±Υ₯ΈΙΥΉΡ₯΅”™₯±•́™Ι½΄΅…₯ΈΈ(€€€€€€€€€₯Ё‘•­½ΥЁ΅…₯Έ€΄΄p(€€€€€€€€€€€…ΝΝ•ΡΜΌp(€€€€€€€€€€€₯Ή±Υ‘•ΜΌp(€€€€€€€€€€€Α•ΑΡ₯‘”΅Ν•…ɍ ΅…€ΉΑ‘ΐp(€€€€€€€€€€€Ι•…‘΅”ΉΡαΠ((€€€€€€€€€€Œ ½΅΅₯Ё½Ή±δ₯˜Ρ‘•Ι”…Ι”…ΡΥ…°‘…Ή•ΜΈ(€€€€€€€€€₯Ё…‘€΅(€€€€€€€€€₯˜₯Ё‘₯™˜΅₯Ή‘•ΰ€΄΅ΕΥ₯•Ё!€΄΄€Θψ½‘•Ψ½ΉΥ±°μΡ‘•Έ(€€€€€€€€€€€•‘Ό€‰9Ό‘…Ή•́Ѽ‘•Α±½δΈˆ(€€€€€€€€€•±Ν”(€€€€€€€€€€€₯Ё½΅΅₯Π€΅΄€‰•Α±½δ€‘ν%Q!U }M!θθέτ™Ι½΄΅…₯Έˆ(€€€€€€€€€™€((€€€€€€€€€€Œ9½Ι΅…°ΑΥΝ €‘™…ΝΠ΅™½Ι݅ɐ€Έ(€€€€€€€€€₯ЁΑΥΝ ½Ι₯₯Έ‘•Α±½δ((€€Œ€΄΄•Α±½δΡΌ!½ΝΡ₯Ή•ȁΩ₯„MM €΄΄(€‘•Α±½δθ(€€€Ή…΅”聕Α±½δΡΌ!½ΝΡ₯Ή•Θ(€€€ΙΥΉΜ΅½ΈθΥ‰ΥΉΡΤ΅±…Ρ•ΝΠ(€€€Ή••‘ΜθΝ幌΅‘•Α±½δ΅‰Ι…Ή (€€€•ΉΩ₯Ι½Ή΅•ΉΠθΑΙ½‘ՍΡ₯½Έ(€€€ΝΡ•ΑΜθ(€€€€€€΄Ή…΅”θAΥ±°‘•Α±½δ‰Ι…Ή ½Έ!½ΝΡ₯Ή•Θ(€€€€€€€ΥΝ•Μ聅ΑΑ±•‰½δ½ΝΝ ΅…Ρ₯½ΉΨΔ(€€€€€€€έ₯Ρ θ(€€€€€€€€€‘½ΝΠ耑νμΝ•Ι•ΡΜΉMM!}!=MPυτ(€€€€€€€€€ΥΝ•ΙΉ…΅”耑νμΝ•Ι•ΡΜΉMM!}UMI95υτ(€€€€€€€€€­•δ耑νμΝ•Ι•ΡΜΉMM!}AI%YQ}-dυτ(€€€€€€€€€Α½ΙΠ耑νμΝ•Ι•ΡΜΉMM!}A=IPυτ(€€€€€€€€€ΝΙ₯ΑΡ}ΝΡ½ΐθΡΙΥ”(€€€€€€€€€•ΉΩΜθA1=e}-d(€€€€€€€€€ΝΙ₯ΑΠθπ(€€€€€€€€€€€€ŒΉΝΥΙ”₯Ρ!Ո‘½ΝЁ­•δ₯́ΡΙΥΝΡ•€‘½Ή”΅Ρ₯΅”Ν•ΡΥΐ€Έ(€€€€€€€€€€€΅­‘₯Θ€΅ΐψΌΉΝΝ (€€€€€€€€€€€ΝΝ ΅­•ε͍…Έ₯ёՈΉ½΄€ψψψΌΉΝΝ ½­Ή½έΉ}‘½ΝΡΜ€Θψ½‘•Ψ½ΉΥ±°((€€€€€€€€€€€€Œ%ΉΝΡ…±°‘•Α±½δ­•δΝΌ!½ΝΡ₯Ή•ȁ…ΈΑΥ±°™Ι½΄Ρ‘”ΑΙ₯Ω…Ρ”Ι•ΑΌΈ(€€€€€€€€€€€₯˜l€„€΅˜ψΌΉΝΝ ½‘•Α±½ε}­•δtμΡ‘•Έ(€€€€€€€€€€€€€•‘Ό€ˆ‘A1=e}-dˆ€ψψΌΉΝΝ ½‘•Α±½ε}­•δ(€€€€€€€€€€€€€‘΅½€ΨΐΐψΌΉΝΝ ½‘•Α±½ε}­•δ(€€€€€€€€€€€™€((€€€€€€€€€€€€Œ ½Ή™₯ΥΙ”MM ΡΌΥΝ”Ρ‘”‘•Α±½δ­•䁙½Θ₯ёՈΉ½΄Έ(€€€€€€€€€€€₯˜€„Ι•ΐ€΅Δ€‰₯ёՈΉ½΄ˆψΌΉΝΝ ½½Ή™₯œ€Θψ½‘•Ψ½ΉΥ±°μΡ‘•Έ(€€€€€€€€€€€€€…Π€ψψψΌΉΝΝ ½½Ή™₯œ€ππMM!=œ(€€€€€€€€€€€!½ΝЁ₯ёՈΉ½΄(€€€€€€€€€€€€€%‘•ΉΡ₯Ρε₯±”ψΌΉΝΝ ½‘•Α±½ε}­•δ(€€€€€€€€€€€€€MΡΙ₯Ρ!½ΝΡ-•ε ‘•­₯ΉœΉΌ(€€€€€€€€€€€MM!=(€€€€€€€€€€€€€‘΅½€ΨΐΐψΌΉΝΝ ½½Ή™₯œ(€€€€€€€€€€€™€((€€€€€€€€€€€A1U%9}%Hτˆ‘!=5½‘½΅…₯ΉΜ½Α•ΑΡ₯‘•Ι•ΑΌΉ½΄½ΑΥ‰±₯}‘Ρ΅°½έΐ΅½ΉΡ•ΉΠ½Α±Υ₯ΉΜ½Α•ΑΡ₯‘”΅Ν•…ɍ ΅…€ˆ(€€€€€€€€€€€IA=}UI0τ‰₯ѝ₯ёՈΉ½΄ιΑ•ΑΡ₯‘•Ι•ΑΌ½Α•ΑΡ₯‘”΅Ν•…ɍ ΅…€Ή₯Ј((€€€€€€€€€€€₯˜l€΅€ˆ‘A1U%9}%HΌΉ₯ЈtμΡ‘•Έ(€€€€€€€€€€€€€€Œα₯ΝΡ₯Ήœ±½Ή”€΄΄©ΥΝЁΑΥ±°±…Ρ•ΝΠΈ(€€€€€€€€€€€€€€ˆ‘A1U%9}%Hˆ(€€€€€€€€€€€€€₯Ё™•э ½Ι₯₯Έ‘•Α±½δ(€€€€€€€€€€€€€₯Ёɕ͕Ѐ΄΅‘…ɐ½Ι₯₯Έ½‘•Α±½δ(€€€€€€€€€€€•±Ν”(€€€€€€€€€€€€€€Œ₯ΙΝЁ‘•Α±½δ€΄΄±½Ή”Ρ‘”‘•Α±½δ‰Ι…Ή Έ(€€€€€€€€€€€€€Ι΄€΅Ι˜€ˆ‘A1U%9}%Hˆ(€€€€€€€€€€€€€₯Ё±½Ή”€΅ˆ‘•Α±½δ€ˆ‘IA=}UI0ˆ€ˆ‘A1U%9}%Hˆ(€€€€€€€€€€€™€((€€€€€€€€€€€•‘Ό€‰•Α±½ε•ΡΌ€‘A1U%9}%Hˆ(€€€€€€€€€€€±Μ€΅±„€ˆ‘A1U%9}%Hˆ(€€€€€€€•ΉΨθ(€€€€€€€€€A1=e}-d耑νμΝ•Ι•ΡΜΉA1=e}-dυτ((€€€€€€΄Ή…΅”θY•Ι₯™δ‘•Α±½ε΅•ΉΠ½ΈΝ•ΙΩ•Θ(€€€€€€€ΥΝ•Μ聅ΑΑ±•‰½δ½ΝΝ ΅…Ρ₯½ΉΨΔ(€€€€€€€έ₯Ρ θ(€€€€€€€€€‘½ΝΠ耑νμΝ•Ι•ΡΜΉMM!}!=MPυτ(€€€€€€€€€ΥΝ•ΙΉ…΅”耑νμΝ•Ι•ΡΜΉMM!}UMI95υτ(€€€€€€€€€­•δ耑νμΝ•Ι•ΡΜΉMM!}AI%YQ}-dυτ(€€€€€€€€€Α½ΙΠ耑νμΝ•Ι•ΡΜΉMM!}A=IPυτ(€€€€€€€€€ΝΙ₯ΑΡ}ΝΡ½ΐθΡΙΥ”(€€€€€€€€€ΝΙ₯ΑΠθπ(€€€€€€€€€€€A1U%9}%Hτˆ‘!=5½‘½΅…₯ΉΜ½Α•ΑΡ₯‘•Ι•ΑΌΉ½΄½ΑΥ‰±₯}‘Ρ΅°½έΐ΅½ΉΡ•ΉΠ½Α±Υ₯ΉΜ½Α•ΑΡ₯‘”΅Ν•…ɍ ΅…€ˆ((€€€€€€€€€€€•‘Ό€‰Y•Ι₯™ε₯Ήœ‘•Α±½ε΅•ΉΠΈΈΈˆ(€€€€€€€€€€€₯˜l€„€΅€ˆ‘A1U%9}%HˆtμΡ‘•Έ(€€€€€€€€€€€€€•‘Ό€‹Šv0A±Υ₯Έ‘₯Ι•Ρ½Ι䁹½Π™½ΥΉ…Π€‘A1U%9}%Hˆ(€€€€€€€€€€€€€•α₯Π€Δ(€€€€€€€€€€€™€((€€€€€€€€€€€€Œ ‘•¬™½ΘΙ•ΕΥ₯Ι•™₯±•Μ(€€€€€€€€€€€Ι•ΕΥ₯Ι•‘}™₯±•Μτ (€€€€€€€€€€€€€€‰Α•ΑΡ₯‘”΅Ν•…ɍ ΅…€ΉΑ‘ΐˆ(€€€€€€€€€€€€€€‰₯Ή±Υ‘•Μˆ(€€€€€€€€€€€€€€‰…ΝΝ•Ρ̈(€€€€€€€€€€€€€€‰Ι•…‘΅”ΉΡαЈ(€€€€€€€€€€€€€((€€€€€€€€€€€™½Θ™₯±”₯Έ€ˆ‘νΙ•ΕΥ₯Ι•‘}™₯±•Νmuτˆμ‘Ό(€€€€€€€€€€€€€₯˜l€„€΅”€ˆ‘A1U%9}%HΌ‘™₯±”ˆtμΡ‘•Έ(€€€€€€€€€€€€€€€•‘Ό€‹Šv05₯ΝΝ₯Ήœ™₯±”耑™₯±”ˆ(€€€€€€€€€€€€€€€•α₯Π€Δ(€€€€€€€€€€€€€™€(€€€€€€€€€€€€€•‘Ό€‹ŠrL½ΥΉθ€‘™₯±”ˆ(€€€€€€€€€€€‘½Ή”((€€€€€€€€€€€€ŒαΡΙ…Π…Ή±½œ‘•Α±½ε•Ω•ΙΝ₯½Έ(€€€€€€€€€€€₯˜l€΅˜€ˆ‘A1U%9}%H½Α•ΑΡ₯‘”΅Ν•…ɍ ΅…€ΉΑ‘ΐˆtμΡ‘•Έ(€€€€€€€€€€€€€Ω•ΙΝ₯½Έτ‘Ι•ΐ€‰Y•ΙΝ₯½Έθˆ€ˆ‘A1U%9}%H½Α•ΑΡ₯‘”΅Ν•…ɍ ΅…€ΉΑ‘ΐˆπ‘•…€΄ΔπΝ•€ΜΌΈ©Y•ΙΝ₯½Έθ€¨ΌΌμΜΌ€¨Έ¨ΌΌœ€(€€€€€€€€€€€€€•‘Ό€‹ŠrL•Α±½ε•Ω•ΙΝ₯½Έθ€‘Ω•ΙΝ₯½Έˆ(€€€€€€€€€€€•±Ν”(€€€€€€€€€€€€€•‘Ό€‹Šv0A±Υ₯Έ™₯±”Ή½Π™½ΥΉˆ(€€€€€€€€€€€€€•α₯Π€Δ(€€€€€€€€€€€™€((€€€€€€€€€€€•‘Ό€‹ŠrL•Α±½ε΅•ΉΠΩ•Ι₯™₯…Ρ₯½ΈΝՍ•ΝΝ™Υ°ˆ((€€€€€€΄Ή…΅”聕Α±½δΝΥ΅΅…Ιδ(€€€€€€€ΙΥΈθπ(€€€€€€€€€•‘Ό€ˆŒŒ•Α±½ε΅•ΉΠ ½΅Α±•Ρ”ˆ€ψψ€‘%Q!U }MQA}MU55Id(€€€€€€€€€•‘Ό€ˆˆ€ψψ€‘%Q!U }MQA}MU55Id(€€€€€€€€€•‘Ό€ˆ΄€¨© Ι…Ή θ¨¨q€‘ν쁝₯ёՈΉΙ•™}Ή…΅”υυq€ˆ€ψψ€‘%Q!U }MQA}MU55Id(€€€€€€€€€•‘Ό€ˆ΄€¨© ½΅΅₯Π訨q€‘ν%Q!U }M!θθέυq€ˆ€ψψ€‘%Q!U }MQA}MU55Id(€€€€€€€€€•‘Ό€ˆ΄€¨©5•Ρ‘½θ¨¨MM ‘₯Ι•Π‘•Α±½δ€‘₯ЁΑΥ±°½Έ!½ΝΡ₯Ή•Θ€ˆ€ψψ€‘%Q!U }MQA}MU55Id(€€€€€€€€€•‘Ό€ˆ΄€¨©•Α±½ε•ΡΌθ¨¨Α•ΑΡ₯‘•Ι•ΑΌΉ½΄ˆ€ψψ€‘%Q!U }MQA}MU55Id( \ No newline at end of file + version=$(grep "define( 'PSA_VERSION'" peptide-search-ai.php | sed "s/.*'\([^']*\)'.*/\1/") + echo "βœ“ PSA_VERSION found: $version" + else + echo "❌ PSA_VERSION constant not found in peptide-search-ai.php" + exit 1 + fi + + - name: Set up PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.1' + + - name: Validate PHP syntax on all files + run: | + echo "Validating PHP syntax..." + find . -name '*.php' -not -path './vendor/*' -not -path './node_modules/*' -print0 | \ + xargs -0 -n1 php -l > /dev/null && echo "βœ“ All PHP files are valid" + + - name: Check for sensitive files + run: | + echo "Scanning for sensitive files..." + found_sensitive=0 + + sensitive_patterns=( + "\.env" + "\.env\." + "credentials" + "\.key$" + "\.pem$" + "private_key" + "\.sql$" + ) + + for pattern in "${sensitive_patterns[@]}"; do + if find . -name "$pattern" -not -path './vendor/*' -not -path './.git/*' 2>/dev/null | grep -q .; then + echo "❌ Found sensitive file matching pattern: $pattern" + find . -name "$pattern" -not -path './vendor/*' -not -path './.git/*' 2>/dev/null + found_sensitive=1 + fi + done + + if [ $found_sensitive -eq 1 ]; then + exit 1 + fi + echo "βœ“ No sensitive files detected" + + # -- Push clean plugin files to the deploy branch -- + sync-deploy-branch: + name: Sync deploy branch + runs-on: ubuntu-latest + needs: [test, validate] + environment: production + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Sync deploy branch + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + + # Fetch the remote deploy branch (may not exist on first run). + git fetch origin deploy:deploy 2>/dev/null || true + + # If deploy branch exists, check it out; otherwise create it. + if git rev-parse --verify deploy >/dev/null 2>&1; then + git checkout deploy + else + git checkout --orphan deploy + git rm -rf --cached . > /dev/null 2>&1 || true + fi + + # Remove all tracked files so we start clean each time. + git rm -rf . > /dev/null 2>&1 || true + + # Checkout only the plugin runtime files from main. + git checkout main -- \ + assets/ \ + includes/ \ + peptide-search-ai.php \ + readme.txt + + # Commit only if there are actual changes. + git add -A + if git diff-index --quiet HEAD -- 2>/dev/null; then + echo "No changes to deploy." + else + git commit -m "Deploy ${GITHUB_SHA::7} from main" + fi + + # Normal push (fast-forward). + git push origin deploy + + # -- Deploy to Hostinger via SSH -- + deploy: + name: Deploy to Hostinger + runs-on: ubuntu-latest + needs: sync-deploy-branch + environment: production + steps: + - name: Pull deploy branch on Hostinger + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: ${{ secrets.SSH_PORT }} + script_stop: true + envs: DEPLOY_KEY + script: | + # Ensure GitHub host key is trusted (one-time setup). + mkdir -p ~/.ssh + ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null + + # Install deploy key so Hostinger can pull from the private repo. + if [ ! -f ~/.ssh/deploy_key ]; then + echo "$DEPLOY_KEY" > ~/.ssh/deploy_key + chmod 600 ~/.ssh/deploy_key + fi + + # Configure SSH to use the deploy key for github.com. + if ! grep -q "github.com" ~/.ssh/config 2>/dev/null; then + cat >> ~/.ssh/config <<'SSHEOF' + Host github.com + IdentityFile ~/.ssh/deploy_key + StrictHostKeyChecking no + SSHEOF + chmod 600 ~/.ssh/config + fi + + PLUGIN_DIR="$HOME/domains/peptiderepo.com/public_html/wp-content/plugins/peptide-search-ai" + REPO_URL="git@github.com:peptiderepo/peptide-search-ai.git" + + if [ -d "$PLUGIN_DIR/.git" ]; then + # Existing clone -- just pull latest. + cd "$PLUGIN_DIR" + git fetch origin deploy + git reset --hard origin/deploy + else + # First deploy -- clone the deploy branch. + rm -rf "$PLUGIN_DIR" + git clone -b deploy "$REPO_URL" "$PLUGIN_DIR" + fi + + echo "Deployed to $PLUGIN_DIR" + ls -la "$PLUGIN_DIR" + env: + DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} + + - name: Verify deployment on server + uses: appleboy/ssh-action@v1 + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USERNAME }} + key: ${{ secrets.SSH_PRIVATE_KEY }} + port: ${{ secrets.SSH_PORT }} + script_stop: true + script: | + PLUGIN_DIR="$HOME/domains/peptiderepo.com/public_html/wp-content/plugins/peptide-search-ai" + + echo "Verifying deployment..." + if [ ! -d "$PLUGIN_DIR" ]; then + echo "❌ Plugin directory not found at $PLUGIN_DIR" + exit 1 + fi + + # Check for required files + required_files=( + "peptide-search-ai.php" + "includes" + "assets" + "readme.txt" + ) + + for file in "${required_files[@]}"; do + if [ ! -e "$PLUGIN_DIR/$file" ]; then + echo "❌ Missing file: $file" + exit 1 + fi + echo "βœ“ Found: $file" + done + + # Extract and log deployed version + if [ -f "$PLUGIN_DIR/peptide-search-ai.php" ]; then + version=$(grep "Version:" "$PLUGIN_DIR/peptide-search-ai.php" | head -1 | sed 's/.*Version: *//; s/ *.*//') + echo "βœ“ Deployed version: $version" + else + echo "❌ Plugin file not found" + exit 1 + fi + + echo "βœ“ Deployment verification successful" + + - name: Deploy summary + run: | + echo "## Deployment Complete" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + echo "- **Branch:** \`${{ github.ref_name }}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Commit:** \`${GITHUB_SHA::7}\`" >> $GITHUB_STEP_SUMMARY + echo "- **Method:** SSH direct deploy (git pull on Hostinger)" >> $GITHUB_STEP_SUMMARY + echo "- **Deployed to:** peptiderepo.com" >> $GITHUB_STEP_SUMMARY