
Habr sedikit terkejut bahwa ada sangat sedikit artikel yang diterbitkan dengan topik fitur (beta) GitHub - Actions.
Tampaknya pernyataan ini dapat dijelaskan oleh fakta bahwa fungsionalitasnya masih dalam pengujian, meskipun "beta". Tetapi ini adalah fitur beta yang berguna yang memungkinkan Anda untuk menggunakan alat ini di repositori pribadi. Ini tentang bekerja dengan teknologi ini yang akan saya bahas dalam artikel ini.
Prasejarah
Jika Anda memulai secara berurutan, Anda mungkin harus menyebutkan momen bahwa dalam proses mencari opsi yang cepat, nyaman, mudah dan gratis untuk menyimpan situs pribadi Anda "Tentang Saya" Saya harus menghabiskan beberapa malam dan membaca banyak artikel.
Seseorang memilih hosting, seseorang server cloud, dan mereka yang tidak ingin memahami pekerjaan, interaksi, dan pembayaran semua ini - seperti mengunggah situs statis ke repositori, karena sekarang ini dapat dilakukan pada GitHub dan GitLab .
Tentu saja, ini adalah pilihan pribadi semua orang.
Pilihan terakhir saya mendukung Halaman GitHub.
Tentang HalamanSiapa pun yang tidak tahu, gh-pages
adalah opsi untuk menyimpan dokumentasi dalam bentuk situs web dan disediakan secara gratis, dan di samping dokumentasi itu diusulkan untuk menyimpan situs pribadi. Fungsionalitas ini disediakan oleh GitHub untuk semua pengguna dan tersedia dalam pengaturan repositori.
Untuk repositori proyek, cabang gh-pages
digunakan, untuk situs pengguna, repositori terpisah yang disebut username.imtqy.com
dengan kode sumber situs di cabang master
digunakan.
Anda dapat melihat dokumentasi untuk detail lebih lanjut, tetapi saya hanya akan mencatat bahwa GitHub dengan kemurahan hati yang luar biasa memungkinkan setiap orang untuk mengikat domain mereka sendiri ke situs tersebut dengan hanya menambahkan file CNAME
dengan nama domain dan mengatur DNS penyedia domainnya di server GitHub.
Saya yakin ada banyak artikel tentang cara menyebarkan situs semacam itu, jadi ini bukan tentang itu.
Terjadinya masalah
Masalahnya adalah bahwa ketika menggunakan generator statis ada kebutuhan untuk menulis tambahan kruk skrip dan gunakan perpustakaan untuk menyederhanakan proses menghasilkan halaman dan memuatnya ke dalam repositori. Sederhananya, jika Anda menyimpan kode sumber dalam repositori pribadi yang terpisah, maka setiap kali Anda membuat perubahan apa pun pada situs, Anda perlu menggunakan lingkungan lokal untuk pembuatan halaman statis berikutnya dan publikasi dalam repositori situs utama.
Ada banyak generator statis dan mereka semua memiliki masalah yang sama. Tindakan ini mengambil terlalu banyak waktu dan usaha, dan sebagai akibatnya berhenti bekerja di situs, terutama setelah beberapa migrasi dari OS ke OS atau insiden dengan kehilangan data pada hard drive (ini adalah kasus dalam kasus saya) .
Baru-baru ini, baik dalam notifikasi pop-up di situs, atau dalam buletin dari GitHub, sebuah CI / CD yang baru dibuat diperhatikan, yang memungkinkan melakukan tindakan ini dengan upaya minimal.
Tentang generator halaman statisSaya tidak akan fokus pada sub-ayat ini, tetapi saya akan membagikan beberapa tesis yang saya sampaikan selama pemilihan dan penggunaan ini:
1) ada baiknya memilih generator untuk bahasa pemrograman Anda, atau yang sejelas mungkin. Saya datang ke ide ini pada saat saya sendiri harus menambahkan beberapa fungsionalitas untuk situs, meletakkan kruk untuk stabilitas dan otomasi yang lebih besar. Selain itu, ini adalah alasan bagus untuk menulis fungsionalitas tambahan dalam bentuk plugin;
2) generator mana yang dipilih adalah pilihan pribadi, tetapi perlu dipertimbangkan bahwa untuk pencelupan awal dalam fungsi fungsionalitas GitHub Pages, Anda harus menginstal Jekyll terlebih dahulu. Untungnya, ini memungkinkan Anda untuk membuat situs dari sumber langsung di repositori (saya akan mengulanginya dengan pilihan saya) .
Generator pilihan saya didasarkan pada poin pertama. Pelican, yang ditulis dalam Python, dengan mudah menggantikan orang asing itu dengan saya Jekyll (digunakan selama hampir setahun) . Hasilnya, bahkan membuat dan mengedit artikel, robot di atas situs memberi pengalaman tambahan dalam bahasa yang menarik bagi saya.
__
Pernyataan masalah
Tugas utamanya adalah menulis skrip seperti itu (sebenarnya file konfigurasi) yang secara otomatis akan menghasilkan halaman statis dari repositori pribadi. Solusinya akan menggunakan fungsionalitas lingkungan virtual. Script itu sendiri akan menambahkan halaman jadi ke repositori publik.
Alat solusi
Alat yang akan kita gunakan untuk menyelesaikan masalah:
- Tindakan GitHub;
- Python 3.7
- Pelikan;
- Git
- Halaman GitHub.
Pemecahan masalah
Secara total, setelah berkenalan dengan dokumentasi sedikit dan menemukan cara menulis skrip untuk Aksi, menjadi jelas bahwa mekanisme ini akan sepenuhnya menyelesaikan masalah. Pada saat penulisan, untuk menggunakan fungsi ini, Anda harus berlangganan pengujian beta !

Deskripsi fungsionalitas baru oleh Github
Menulis skrip Tindakan dimulai dengan membuat file bernama di folder .github
dan workflows
subfoldernya. Anda dapat melakukan ini secara manual atau dari editor di tab Tindakan di halaman repositori.

Contoh formulir skrip kosong
Beri komentar singkat pada formulir 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.
Mari kita tulis sendiri berdasarkan template:
0) Nama bisa dibiarkan dan "CI". Ini masalah selera.
1) Selanjutnya, Anda perlu memilih tindakan / pemicu yang akan mengarah pada peluncuran skrip, dalam kasus kami ini adalah dorongan biasa dari komit baru ke repositori.
on: push
2) Gambar yang menjadi dasar skrip akan diluncurkan juga akan dibiarkan sebagai contoh, karena Ubuntu cukup puas dengan fungsionalitas yang diperlukan. Melihat alat yang tersedia , menjadi jelas bahwa ini bisa berupa gambar yang diperlukan atau hanya nyaman (atau wadah buruh pelabuhan berdasarkan itu).
build: runs-on: ubuntu-latest
3) Dalam langkah-langkahnya, pertama-tama atur lingkungan untuk mempersiapkan pekerjaan utama.
3.1) buka cabang yang kami butuhkan (langkah checkout
standar):
- uses: actions/checkout@v1
3.2) instal Python:
- name: Set up Python uses: actions/setup-python@v1 with: python-version: 3.7
3.3) mengatur dependensi generator kami:
- name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt
3.4) membuat direktori di mana halaman situs akan dihasilkan:
- name: Make output folder run: mkdir output
4) Agar pekerjaan di situs konsisten, yaitu tidak menghapus perubahan sebelumnya dan menambahkan perubahan ke repositori situs tanpa konflik, langkah selanjutnya adalah mengkloning repositori situs setiap kali:
- name: Clone master branch run: git clone "https://${{ secrets.ACCESS_TOKEN }}@github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.imtqy.com.git" --branch master --single-branch ./output
Langkah ini memanggil variabel sistem:
GITHUB_ACTOR
GitHub menetapkan variabel itu sendiri, dan ini adalah nama pengguna yang menyebabkan skrip dijalankan;secrets.ACCESS_TOKEN
adalah token yang dihasilkan untuk mengendalikan Github , kita dapat mentransfernya sebagai variabel lingkungan dengan mengatur pengaturan repositori kami di tab Secrets
. Harap perhatikan, saat membuat token, kami akan diberikan sekali, tidak akan ada lagi akses ke sana. Serta nilai-nilai Rahasia.
5) Kami melanjutkan ke generasi halaman kami:
- name: Generate static pages run: pelican content -o output -s publishconf.py
Parameter yang diteruskan ke generator bertanggung jawab untuk direktori tempat file yang dihasilkan akan dikirim ( -o output
) dan file konfigurasi yang kami gunakan untuk pembuatan ( -s publishconf.py
; Anda dapat membaca tentang pendekatan untuk berbagi konfigurasi lokal dan konfigurasi untuk publikasi dalam dokumentasi Pelican ) .
Biarkan saya mengingatkan Anda bahwa repositori situs telah dikloning ke folder output
.
6) Konfigurasikan git dan indeks file kami yang dimodifikasi:
- 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
Paragraf ini menggunakan variabel yang sudah dikenal, dan menunjukkan direktori yang berfungsi di mana perintah dari langkah ini akan diluncurkan. Perintah untuk pergi ke direktori kerja akan terlihat seperti - cd output
.
7) Hasilkan pesan komit, komit perubahan dan dorong ke repositori. Untuk memastikan bahwa komit tidak disia-siakan, dan karenanya tidak menghasilkan kesalahan dalam bash (outputnya bukan 0
), pertama-tama kita periksa apakah komit perlu dan mendorong sesuatu. Untuk melakukan ini, kita menggunakan perintah git diff-index --quiet --cached HEAD --
yang akan menghasilkan 0
jika tidak ada perubahan relatif terhadap versi situs sebelumnya, dan ada 1
perubahan seperti itu. Kemudian kami memproses hasil dari perintah ini. Dengan demikian, kami akan menulis informasi yang berguna tentang keadaan situs pada tahap ini dalam informasi tentang pelaksanaan skrip, alih-alih secara otomatis menabrak dan mengirimi kami laporan tentang macetnya skrip.
Kami juga melakukan tindakan ini di direktori kami dengan halaman yang sudah jadi.
- 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}.imtqy.com.git master working-directory: ./output
Hasil
Akibatnya, skrip seperti itu memungkinkan Anda untuk tidak berpikir tentang membuat halaman statis. Dengan menambahkan perubahan langsung ke repositori pribadi, apakah bekerja dengan git dari sistem apa pun atau membuat file melalui antarmuka web GitHub, Tindakan akan melakukan semuanya sendiri. Jika terjadi kerusakan skrip yang tidak terduga dalam surat, pemberitahuan akan datang.
Kode lengkapSaya akan meninggalkan versi kerja saya, itu menambahkan pemberitahuan bahwa komit diluncurkan ke repositori utama di langkah terakhir.
Rahasia yang dijelaskan di atas digunakan di mana token bot dan ID pengguna yang pesannya akan dikirim ditambahkan.
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}.imtqy.com.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}.imtqy.com.git master curl "https://api.telegram.org/bot${{ secrets.BOT_TOKEN }}/sendMessage?text=$COMMIT_MESSAGE %0ALook at ${GITHUB_ACTOR}.imtqy.com %0ARepository%3A github.com/${GITHUB_ACTOR}/${GITHUB_ACTOR}.imtqy.com&chat_id=${{ secrets.ADMIN_ID }}" working-directory: ./output
Tangkapan layar
Hasil dari salah satu peluncuran yang ditampilkan di tab Tindakan repositori dengan sumber

Pesan dari bot tentang penyelesaian skrip
Tautan yang bermanfaat
Ikhtisar Tindakan
Sintaksis Tindakan
Daftar pemicu
Varian lingkungan virtual
Halaman github
Daftar Generator Statis