GitHub Actions ΠΊΠ°ΠΊ CI/CD для сайта Π½Π° статичСском Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΈ GitHub Pages

GitHub Actions ΠΊΠ°ΠΊ CI/CD для сайта Π½Π° статичСском Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΈ GitHub Pages

НСмного ΠΏΡ€ΠΎΡˆΠ΅Ρ€ΡΡ‚ΠΈΠ² Habr удивился Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»ΠΎ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ΠΎ статСй Π½Π° Ρ‚Π΅ΠΌΡƒ (beta-)Ρ„ΠΈΡ‡ΠΈ GitHub’Π° β€” Actions.

Казалось Π±Ρ‹, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ Π½Π΅Π΄ΠΎΡΠΊΠ°Π·Π°Π½Π½ΠΎΡΡ‚ΡŒ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π΅Ρ‰Π΅ Π² тСстировании, ΠΏΡƒΡΡ‚ΡŒ ΠΈ «beta». Но ΠΈΠΌΠ΅Π½Π½ΠΎ полСзная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ Π±Π΅Ρ‚Ρ‹ позволяСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот инструмСнт Π² ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹Ρ… рСпозиториях. ИмСнно ΠΏΡ€ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ с Π΄Π°Π½Π½ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠ΅ΠΉ я расскаТу Π² этой ΡΡ‚Π°Ρ‚ΡŒΠ΅.

ΠŸΡ€Π΅Π΄ΠΈΡΡ‚ΠΎΡ€ΠΈΡ

Если Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΠΏΠΎ порядку, Ρ‚ΠΎ стоит, Π½Π°Π²Π΅Ρ€Π½ΠΎΠ΅, ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚ΡŒ Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, Ρ‡Ρ‚ΠΎ Π² процСссС поиска быстрого, ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ, Π»Π΅Π³ΠΊΠΎΠ³ΠΎ ΠΈ бСсплатного Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° хранСния ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ сайта «ΠžΠ±ΠΎ ΠΌΠ½Π΅» ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ нСсколько Π½ΠΎΡ‡Π΅ΠΉ ΠΈ ΠΏΡ€ΠΎΡˆΠ΅Ρ€ΡΡ‚ΠΈΡ‚ΡŒ мноТСство статСй.

ΠšΡ‚ΠΎ-Ρ‚ΠΎ Π½Π° Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ хостинг, ΠΊΡ‚ΠΎ-Ρ‚ΠΎ ΠΎΠ±Π»Π°Ρ‡Π½Ρ‹ΠΉ сСрвСр, Π° Ρ‚Π΅ΠΌ, ΠΊΠΎΠΌΡƒ Π½Π΅ хочСтся Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² Ρ€Π°Π±ΠΎΡ‚Π΅, взаимодСйствии ΠΈ ΠΎΠΏΠ»Π°Ρ‚Π΅ всСго этого β€” приходится ΠΏΠΎ Π΄ΡƒΡˆΠ΅ Π²Ρ‹Π³Ρ€ΡƒΠ·ΠΊΠ° статичСских сайтов Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π±Π»Π°Π³ΠΎ сСйчас это ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈ Π½Π° GitHub, ΠΈ Π½Π° GitLab.

ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, это Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ.

Мой ΠΎΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€ Π±Ρ‹Π» Π² ΠΏΠΎΠ»ΡŒΠ·Ρƒ GitHub Pages.

ΠŸΡ€ΠΎ Pages

ΠšΡ‚ΠΎ Π½Π΅ Π² курсС, gh-pages β€” это Ρ‚Π°ΠΊΠΎΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ хранСния Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Π² Π²ΠΈΠ΄Π΅ сайта ΠΈ прСдоставляСтся ΠΎΠ½ бСсплатно, Π° ΠΊΡ€ΠΎΠΌΠ΅ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ прСдлагаСтся Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠ΅Ρ€ΡΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ сайты. Π­Ρ‚ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» прСдоставляСтся GitHub’ом всСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΈ доступСн Π² настройках рСпозитория.

Для рСпозитория ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π²Π΅Ρ‚ΠΊΠ° gh-pages, для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ сайта β€” ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ username.github.io с исходниками сайта Π² master Π²Π΅Ρ‚ΠΊΠ΅.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Ρƒ лишь Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ GitHub с ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Ρ‰Π΅Π΄Ρ€ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ собствСнный Π΄ΠΎΠΌΠ΅Π½ ΠΊ Ρ‚Π°ΠΊΠΎΠΌΡƒ сайту, просто Π΄ΠΎΠ±Π°Π²ΠΈΠ² Ρ„Π°ΠΉΠ» CNAME c Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΎΠΌΠ΅Π½Π° ΠΈ настроив DNS своСго Π΄ΠΎΠΌΠ΅Π½-ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π° Π½Π° сСрвСра GitHub.

Π£Π²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ статСй ΠΎ Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ сайт здСсь найдСтся мноТСство, поэтому дальшС Π½Π΅ ΠΎΠ± этом.

Π’ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° состояла Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ использовании статичСского Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΡΠΎΡ‡ΠΈΠ½ΡΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ костыли скрипты ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для упрощСния процСсса Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ страниц ΠΈ ΠΈΡ… Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. ΠŸΠΎΠΏΡ€ΠΎΡΡ‚Ρƒ, Ссли Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ исходники Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ, Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΡ€ΠΈ любом ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ Π½Π° сайтС Π±Ρ‹Π»ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ локальноС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ для ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ статичСских страниц ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² основном Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ сайта.

БущСствуСт ΠΎΠ±ΠΈΠ»ΠΈΠ΅ статичСских Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈ всС ΠΎΠ½ΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΡƒΡŽ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Π­Ρ‚ΠΈ дСйствия Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ слишком ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΈ сил, Π° ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Ρƒ стопорят Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ сайтом, особСнно послС Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΉ с ОБ Π½Π° ОБ ΠΈΠ»ΠΈ ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚ΠΎΠ² с ΠΏΠΎΡ‚Π΅Ρ€Π΅ΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π° ТСстких дисках (Ρ‚Π°ΠΊ Π±Ρ‹Π»ΠΎ Π² ΠΌΠΎΠ΅ΠΌ случаС).

Π‘ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ, Ρ‚ΠΎ Π»ΠΈ Π² Π²ΡΠΏΠ»Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΌ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠΈ Π½Π° сайтС, Ρ‚ΠΎ Π»ΠΈ Π² рассылкС ΠΎΡ‚ GitHub Π±Ρ‹Π»ΠΎ Π·Π°ΠΌΠ΅Ρ‡Π΅Π½ΠΎ нововстроСнный CI/CD, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ эти дСйствия с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ усилиями.

ΠŸΡ€ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ статичСских страниц

НС Π±ΡƒΠ΄Ρƒ Π·Π°ΠΎΡΡ‚Ρ€ΡΡ‚ΡŒ Π½Π° этом ΠΏΠΎΠ΄ΠΏΡƒΠ½ΠΊΡ‚Π΅ особоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π½ΠΎ подСлюсь ΠΏΠ°Ρ€ΠΎΠΉ тСзисов ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΡ€ΠΈΡˆΠ΅Π» Π·Π° врСмя Π²Ρ‹Π±ΠΎΡ€Π° ΠΈ использования Ρ‚Π°ΠΊΠΈΡ…:

1) Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ стоит ΠΏΠΎΠ΄ свой язык программирования, ΠΈΠ»ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹Π» максимально понятСн. К этой ΠΈΠ΄Π΅Π΅ я ΠΏΡ€ΠΈΡˆΠ΅Π» Π² Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΊΠΎΠ³Π΄Π° самому ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π΄ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» для Ρ€Π°Π±ΠΎΡ‚Ρ‹ сайта, ΠΏΡ€ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ костыли для Π΅Π³ΠΎ большСй устойчивости ΠΈ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, это Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΏΠΎΠ²ΠΎΠ΄ самому Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π² Π²ΠΈΠ΄Π΅ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²;

2) Π½Π° ΠΊΠ°ΠΊΠΎΠΌ ΠΈΠΌΠ΅Π½Π½ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ это Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π²Ρ‹Π±ΠΎΡ€, Π½ΠΎ стоит ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ для Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ погруТСния Π² Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° GitHub Pages Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ сначала ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сСбС Jekyll. Π‘Π»Π°Π³ΠΎ, ΠΎΠ½ позволяСт Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сайт ΠΈΠ· исходников прямо Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ (это я ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡŽ со своим Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ).

Мой Π²Ρ‹Π±ΠΎΡ€ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° основываСтся Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΌ ΠΏΡƒΠ½ΠΊΡ‚Π΅. Pelican ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ написан Π½Π° Python с Π»Π΅Π³ΠΊΠΎΡΡ‚ΡŒΡŽ Π·Π°ΠΌΠ΅Π½ΠΈΠ» Ρ‡ΡƒΠΆΠΎΠΉ для мСня Jekyll (пользовался ΠΏΠΎΡ‡Ρ‚ΠΈ Π³ΠΎΠ΄). Π’ ΠΈΡ‚ΠΎΠ³Π΅ Π΄Π°ΠΆΠ΅ созданиС ΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ статСй, Ρ€ΠΎΠ±ΠΎΡ‚Π° Π½Π°Π΄ сайтом Π΄Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠΏΡ‹Ρ‚ Π² интСрСсном для мСня языкС.

__

ΠŸΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Ρ‡ΠΈ

Главная Π·Π°Π΄Π°Ρ‡Π° Π±ΡƒΠ΄Π΅Ρ‚ β€” Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ скрипт (Π½Π° самом Π΄Π΅Π»Π΅ Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π±Ρ‹ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС страницы ΠΈΠ· ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½ΠΎΠ³ΠΎ рСпозитория. Π’ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π±ΡƒΠ΄Π΅Ρ‚ задСйствован Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π» Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ окруТСния. Π‘ΠΊΡ€ΠΈΠΏΡ‚ сам Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ страницы Π² ΠΏΡƒΠ±Π»ΠΈΡ‡Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ:

  • GitHub Actions;
  • Python 3.7;
  • Pelican;
  • Git;
  • GitHub Pages.

РСшСниС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

Π˜Ρ‚ΠΎΠ³ΠΎ, познакомившись Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π²ΡˆΠΈΡΡŒ ΠΊΠ°ΠΊ ΠΏΠΈΡˆΡƒΡ‚ΡΡ скрипты для Actions стало понятно Ρ‡Ρ‚ΠΎ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π΅ΡˆΠΈΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания ΡΡ‚Π°Ρ‚ΡŒΠΈ для использования Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π½Π° Π±Π΅Ρ‚Π°-тСстированиС!

GitHub Actions ΠΊΠ°ΠΊ CI/CD для сайта Π½Π° статичСском Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΈ GitHub Pages
ОписаниС Π½ΠΎΠ²ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Π° самим Github

НачинаСтся написаниС Actions-скрипта с создания ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π² ΠΏΠ°ΠΏΠΊΠ΅ .github ΠΈ Π΅Π΅ ΠΏΠΎΠ΄ΠΏΠ°ΠΏΠΊΠ΅ workflows. Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ°ΠΊ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Ρ‚Π°ΠΊ ΠΈ ΠΈΠ· Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Actions Π½Π° страницС рСпозитория.

GitHub Actions ΠΊΠ°ΠΊ CI/CD для сайта Π½Π° статичСском Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΈ GitHub Pages
ΠŸΡ€ΠΈΠΌΠ΅Ρ€ пустого Π±Π»Π°Π½ΠΊΠ° скрипта

ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΡŽ Π±Π»Π°Π½ΠΊ

name: CI    # Π½Π°Π·Π²Π°Π½ΠΈΠ΅ скрипта: Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Actions

on: [push]  # дСйствиС, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ запускаСтся Π΄Π°Π½Π½Ρ‹ΠΉ скрипт

jobs:       # Ρ€ΠΎΠ±ΠΎΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ
  build:    # сборка, которая..

    runs-on: ubuntu-latest      # ..Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π½Π° основС этого ΠΎΠ±Ρ€Π°Π·Π°

    steps:              # шаги ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Ρ‹ послС запуска ΠΎΠ±Ρ€Π°Π·Π°
    - uses: actions/checkout@v1     # ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² ΡΠ°ΠΌΡƒΡŽ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ‚ΠΊΡƒ
    - name: Run a one-line script   # имя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΠΎΠΌΠ΅Ρ€ 1
      run: echo Hello, world!       # ΡΡƒΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΠΎΠΌΠ΅Ρ€ 1 (bash-ΠΊΠΎΠΌΠ°Π½Π΄Π° записана Π² ΠΎΠ΄Π½Ρƒ строку)
    - name: Run a multi-line script   # имя Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΠΎΠΌΠ΅Ρ€ 2
      run: |                    # ΡΡƒΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½ΠΎΠΌΠ΅Ρ€ 2 (многострочная)
        echo Add other actions to build,
        echo test, and deploy your project.

НапишСм свой на основС шаблона:

0) Имя ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈ β€œCI”. Π’ΡƒΡ‚ Π΄Π΅Π»ΠΎ вкусовщины.

1) Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎ дСйствиС/Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ запуску скрипта, Π² нашСм случаС это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΏΡƒΡˆ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚Π° Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ.

on:
  push

2) ΠžΠ±Ρ€Π°Π· Π½Π° основС ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ скрипт Ρ‚Π°ΠΊΠΆΠ΅ оставим с ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Ubuntu Π²ΠΏΠΎΠ»Π½Π΅ устраиваСт ΠΏΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠΌΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»Ρƒ. Глядя Π½Π° доступныС инструмСнты становится понятно, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любой Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΈΠ»ΠΈ просто ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΉ ΠΎΠ±Ρ€Π°Π· (ΠΈΠ»ΠΈ Π΄ΠΎΠΊΠ΅Ρ€ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π½Π° Π΅Π³ΠΎ основС).

  build:
    runs-on: ubuntu-latest

3) Π’ ΡˆΠ°Π³Π°Ρ… сначала настроим срСду для ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ ΠΊ основной Ρ€Π°Π±ΠΎΡ‚Π΅.

3.1) ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ Π² Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Π½Π°ΠΌ Π²Π΅Ρ‚ΠΊΡƒ (стандартный шаг checkout):

- uses: actions/checkout@v1

3.2) устанавливаСм Python:

    - name: Set up Python
      uses: actions/setup-python@v1
      with:
        python-version: 3.7

3.3) устанавливаСм зависимости нашСго Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π°:

    - name: Install dependencies
      run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

3.4) создаСм Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ Π² ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΡƒΠ΄ΡƒΡ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ страницы сайта:

   - name: Make output folder
      run: mkdir output

4) Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π° Π½Π°Π΄ сайтом Π±Ρ‹Π»Π° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Π°, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π΅ удаляла ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ измСнСния ΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Π΅Π· ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ измСнСния Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ сайта, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ шагом Π±ΡƒΠ΄Π΅ΠΌ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΊΠ»ΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ сайта:

   - name: Clone master branch
      run: git clone "https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git" --branch master --single-branch ./output

Π­Ρ‚ΠΎΡ‚ шаг Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ систСмныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅:

  • ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ GITHUB_ACTOR GitHub устанавливаСт сам, ΠΈ это имя ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΏΠΎ Π²ΠΈΠ½Π΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ запустился Π΄Π°Π½Π½Ρ‹ΠΉ скрипт;
  • пСрСмСнная secrets.ACCESS_TOKEN это сгСнСрированный Ρ‚ΠΎΠΊΠ΅Π½ для управлСния Github’ом, Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ окруТСния ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ установив Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Secrets настроСк нашСго рСпозитория. ΠŸΡ€ΠΎΡˆΡƒ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, ΠΏΡ€ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠΊΠ΅Π½ прСдоставится Π½Π°ΠΌ Π΅Π΄ΠΈΠ½ΠΎΠΆΠ΄Ρ‹, большС доступа ΠΊ Π½Π΅ΠΌΡƒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. Π’Π°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ значСния ΠΏΡƒΠ½ΠΊΡ‚ΠΎΠ² Secrets.

5) ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°ΡˆΠΈΡ… страниц:

   - name: Generate static pages
      run: pelican content -o output -s publishconf.py

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρƒ, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‚ Π·Π° Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ, ΠΊΡƒΠ΄Π° Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ сгСнСрированныС Ρ„Π°ΠΉΠ»Ρ‹ (-o output) ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ (-s publishconf.py; ΠΎΠ± ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π΅ ΠΊ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΡŽ локального ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° ΠΈ ΠΊΠΎΠ½Ρ„ΠΈΠ³Π° для ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Pelican).

Напомню, Ρ‡Ρ‚ΠΎ Ρƒ нас Π² ΠΏΠ°ΠΏΠΊΡƒ output ΡƒΠΆΠ΅ склонирован Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ сайта.

6) Настроим git ΠΈ проиндСксируСм наши ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹:

    - name: Set git config and add changes
      run: |
          git config --global user.email "${GITHUB_ACTOR}@https://users.noreply.github.com/"
          git config --global user.name "${GITHUB_ACTOR}"
          git add --all
      working-directory: ./output

Π’ этом ΠΏΡƒΠ½ΠΊΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΆΠ΅ извСстная пСрСмСнная, ΠΈ указываСтся рабочая дирСктория Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ΡŒ запуск ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ· этого шага. Команда ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π² Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ ΠΈΠ½Π°Ρ‡Π΅ выглядСла Π±Ρ‹ ΠΊΠ°ΠΊ β€” cd output.

7) Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ сообщСниС ΠΊΠΎΠΌΠΌΠΈΡ‚Π°, Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΠΌ измСнСния ΠΈ Π·Π°ΠΏΡƒΡˆΠΈΠΌ ΠΈΡ… Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π½Π΅ Π±Ρ‹Π» Π²ΠΏΡƒΡΡ‚ΡƒΡŽ, ΠΈ соотвСтствСнно Π½Π΅ Π²Ρ‹Π΄Π°Π» ΠΎΡˆΠΈΠ±ΠΊΡƒ Π² bash (Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π½Π΅ 0) β€” сначала ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π»ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ ΠΈ ΠΏΡƒΡˆΠΈΡ‚ΡŒ. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ git diff-index --quiet --cached HEAD -- которая Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π² Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» выдаст 0 Ссли Π½Π΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии сайта, ΠΈ 1 Ρ‚Π°ΠΊΠΈΠ΅ измСнСния Π΅ΡΡ‚ΡŒ. ПослС Ρ‡Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΌΡ‹ Π² ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ скрипта запишСм ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ состоянии сайта Π½Π° этом этапС, вмСсто автоматичСского падСния ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π½Π°ΠΌ ΠΎΡ‚Ρ‡Π΅Ρ‚Π° ΠΎ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ скрипта.

Π­Ρ‚ΠΈ дСйствия Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠΌ Π² нашСй Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ с Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌΠΈ страницами.

   - name: Push and send notification
      run: |
          COMMIT_MESSAGE="Update pages on $(date +'%Y-%m-%d %H:%M:%S')"
          git diff-index --quiet --cached HEAD -- && echo "No changes!" && exit 0 || echo $COMMIT_MESSAGE
          # Only if repo have changes
          git commit -m "${COMMIT_MESSAGE}"
          git push https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git master
      working-directory: ./output

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚

Π’ ΠΈΡ‚ΠΎΠ³Π΅ Ρ‚Π°ΠΊΠΎΠΉ скрипт позволяСт Π½Π΅ Π΄ΡƒΠΌΠ°Ρ‚ΡŒ ΠΎ создании статичСских страниц. Добавляя измСнСния Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π±ΡƒΠ΄ΡŒ Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ с git ΠΈΠ· ΠΏΠΎΠ΄ любой систСмы ΠΈΠ»ΠΈ созданиСм Ρ„Π°ΠΉΠ»Π° Ρ‡Π΅Ρ€Π΅Π· web-интСрфСйс GitHub’а, Actions ΡΠ΄Π΅Π»Π°ΡŽΡ‚ всС сами. Π’ случаС Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΠΎΠ³ΠΎ падСния скрипта Π½Π° ΠΏΠΎΡ‡Ρ‚Ρƒ ΠΏΡ€ΠΈΠ΄Π΅Ρ‚ ΡƒΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΠ΅.

ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

ΠžΡΡ‚Π°Π²Π»ΡŽ свой Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π² Π½Π΅ΠΌ Π² послСдний шаг Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° увСдомлСния ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠΌΠΌΠΈΡ‚ Π±Ρ‹Π» Π·Π°ΠΏΡƒΡˆΠ΅Π½ Π² основной Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π²Ρ‹ΡˆΠ΅ΠΎΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Secrets ΠΊΡƒΠ΄Π° Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ Ρ‚ΠΎΠΊΠ΅Π½ Π±ΠΎΡ‚Π° ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ сообщСниС.

name: Push content to the user's GitHub pages repository

on:
  push

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1
    - name: Set up Python
      uses: actions/setup-python@v1
      with:
        python-version: 3.7
    - name: Install dependencies
      run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt
    - name: Make output folder
      run: mkdir output
    - name: Clone master branch
      run: git clone "https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git" --branch master --single-branch ./output
    - name: Generate static pages
      run: pelican content -o output -s publishconf.py
    - name: Set git config and add changes
      run: |
          git config --global user.email "${GITHUB_ACTOR}@https://users.noreply.github.com/"
          git config --global user.name "${GITHUB_ACTOR}"
          git add --all
      working-directory: ./output
    - name: Push and send notification
      run: |
          COMMIT_MESSAGE="Update pages on $(date +'%Y-%m-%d %H:%M:%S')"
          git diff-index --quiet --cached HEAD -- && echo "No changes!" && exit 0 || echo $COMMIT_MESSAGE
          git commit -m "${COMMIT_MESSAGE}"
          git push https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io.git master
          curl "https://api.telegram.org/bot${{ secrets.BOT_TOKEN }}/sendMessage?text=$COMMIT_MESSAGE %0ALook at ${GITHUB_ACTOR}.github.io %0ARepository%3A github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.github.io&chat_id=${{ secrets.ADMIN_ID }}"
      working-directory: ./output

Π‘ΠΊΡ€ΠΈΠ½ΡˆΠΎΡ‚Ρ‹

GitHub Actions ΠΊΠ°ΠΊ CI/CD для сайта Π½Π° статичСском Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΈ GitHub Pages
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· запусков ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ Π²ΠΎ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ Actions рСпозитория с исходниками

GitHub Actions ΠΊΠ°ΠΊ CI/CD для сайта Π½Π° статичСском Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ ΠΈ GitHub Pages
Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ ΠΎΡ‚ Π±ΠΎΡ‚Π° ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ скрипта

ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ссылки

ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния ΠΎΠ± Actions
Бинтаксис Actions
Бписок Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€ΠΎΠ²
Π’Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΉ
Github Pages
Static Generator list

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ