Menjalankan Ujian Shell dalam Saluran Paip CI
Sambungkan ShellCheck dan Bats ke GitHub Actions supaya setiap perubahan shell hanya diterima selepas semua pemeriksaan lulus
Menjalankan Ujian Shell dalam Saluran Paip CI ialah pelajaran Kem Intensif DevOps percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Kem Intensif DevOps, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Kem Intensif DevOps merangkumi sejumlah 4 pelajaran.
Mengapa CI Penting untuk Skrip Cangkerang
Skrip cangkerang ialah kod — dan seperti semua kod, skrip ini wajar mempunyai pengawal kualiti automatik. Tanpa CI, kesilapan taip dalam skrip penerapan boleh sampai ke persekitaran produksi secara senyap dan menyebabkan gangguan pada pukul 3 pagi.
Saluran paip CI yang kukuh untuk projek Bash menguatkuasakan dua perkara pada setiap permintaan tarik:
- Analisis statik melalui
ShellCheck— mengesan ralat sintaks, corak tidak selamat dan isu kebolehlihatan POSIX sebelum skrip dijalankan. - Ujian unit/integrasi melalui
Bats(Sistem Pengujian Automatik Bash) — melaksanakan fungsi anda dan mengesahkan tingkah laku yang betul.
Secara bersama, kedua-duanya membentuk jaringan keselamatan yang membolehkan pemfaktoran semula dilakukan dengan yakin dan mempercepat proses penyesuaian ahli baharu. Pelajaran ini menghubungkan kedua-dua alat tersebut ke GitHub Actions, iaitu platform CI percuma yang paling lazim untuk projek sumber terbuka dan pasukan kecil.
Pengenalan GitHub Actions untuk Projek Cangkerang
GitHub Actions ialah CI/CD dipacu peristiwa yang terbina dalam GitHub. Aliran kerja ialah fail YAML yang disimpan di bawah .github/workflows/. Aliran ini dicetuskan oleh peristiwa (push, pull_request dan sebagainya) dan menjalankan tugas pada pelancar yang dihoskan.
Konsep utama yang perlu anda ketahui:
on:— pencetus (contohnyapush,pull_request)jobs:— unit kerja selari, setiap satunya pada VM baharusteps:— perintah cangkerang berjujukan atau tindakan boleh guna semula dalam sesuatu tugasruns-on:— imej pelancar (kami menggunakanubuntu-latest)
Fail aliran kerja mesti dilakukan commit ke repositori. GitHub mengesannya secara automatik — tiada persediaan luaran diperlukan.
# Minimal skeleton — .github/workflows/ci.yml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
shell-checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: echo "Steps go here"Memasang ShellCheck dalam Aliran Kerja
ShellCheck telah dipasang terlebih dahulu pada pelancar ubuntu-latest, jadi dalam kebanyakan kes anda tidak perlu melakukan sebarang langkah pemasangan. Walau bagaimanapun, versi yang dipasang mungkin ketinggalan daripada keluaran terkini. Untuk binaan yang boleh dihasilkan semula, tetapkan versi tertentu.
Dua strategi pemasangan:
- Gunakan binari yang telah dipasang — paling mudah dan memadai untuk kebanyakan projek.
- Pasang versi yang ditetapkan melalui arkib tar keluaran rasmi GitHub — menjamin versi penganalisis yang sama secara setempat dan dalam CI.
Langkah di bawah menunjukkan pendekatan versi ditetapkan menggunakan rentetan versi tetap yang disimpan sebagai pemboleh ubah persekitaran, supaya peningkatan hanya memerlukan perubahan satu baris.
# .github/workflows/ci.yml — ShellCheck install step
- name: Install ShellCheck
env:
SC_VERSION: v0.10.0
run: |
curl -sSfL \
"https://github.com/koalaman/shellcheck/releases/download/${SC_VERSION}/shellcheck-${SC_VERSION}.linux.x86_64.tar.xz" \
| tar -xJf - --strip-components=1 -C /usr/local/bin shellcheck-${SC_VERSION}/shellcheck
shellcheck --versionMenjalankan ShellCheck pada Setiap Skrip
Selepas pemasangan, anda memerlukan langkah yang mencari dan menganalisis semua skrip cangkerang dalam repositori. Gunakan find untuk mencari fail, kemudian salurkan hasilnya kepada shellcheck.
Pilihan penting yang perlu diketahui:
-e SC2034— kecualikan peraturan tertentu (gunakan secara berhemat dan sertakan komen).--severity=warning— gagalkan hanya untuk amaran dan ke atas (abaikan cadangan gaya).-x— ikuti arahansourceuntuk menganalisis fail yang dipanggil sumber juga.
Jika shellcheck menemui sebarang isu, ia keluar dengan kod bukan sifar, lalu langkah CI gagal secara automatik — tiada logik tambahan diperlukan.
# .github/workflows/ci.yml — ShellCheck lint step
- name: Lint shell scripts
run: |
# Find all .sh files and files with a bash/sh shebang
mapfile -t scripts < <(
find . -type f -name '*.sh' -not -path './.git/*'
)
if [[ ${#scripts[@]} -eq 0 ]]; then
echo 'No shell scripts found — skipping.'
exit 0
fi
echo "Linting ${#scripts[@]} file(s)..."
shellcheck --severity=warning -x "${scripts[@]}"Apakah Bats dan Bagaimanakah Ia Berfungsi
Bats (Sistem Pengujian Automatik Bash) ialah rangka kerja pengujian untuk Bash yang mematuhi TAP. Setiap fail ujian ialah fail .bats yang mengandungi blok @test.
Ujian lulus apabila badannya keluar dengan kod 0 dan gagal apabila keluar dengan kod bukan sifar. Bats menyediakan pemboleh ubah dan fungsi pembantu:
$status— kod keluar bagi perintahrunyang terakhir.$output— stdout+stderr gabungan daripada perintahrunyang terakhir.$lines— tatasusunan baris output.run <cmd>— jalankan perintah tanpa menggagalkan ujian apabila keluar dengan kod bukan sifar.
Pembantu run adalah penting — tanpanya, perintah yang gagal akan menghentikan ujian sebelum anda dapat memeriksa $status.
#!/usr/bin/env bats
# tests/greet.bats
setup() {
# Runs before every @test block
source "${BATS_TEST_DIRNAME}/../lib/greet.sh"
}
@test "greet outputs hello with the given name" {
run greet "Alice"
[ "$status" -eq 0 ]
[ "$output" = "Hello, Alice!" ]
}
@test "greet fails when no argument is provided" {
run greet
[ "$status" -eq 1 ]
[[ "$output" == *"Usage"* ]]
}Memasang Bats-Core melalui Submodul Git
Cara piawai untuk menambahkan Bats ke dalam projek ialah sebagai submodul Git. Cara ini menetapkan commit tertentu, memastikan versi pelancar sama dengan versi pembangunan setempat dan mengelakkan kebergantungan pada pengurus pakej.
Jalankan perintah ini sekali secara setempat, kemudian lakukan commit terhadap hasilnya:
git submodule add https://github.com/bats-core/bats-core test/batsgit submodule add https://github.com/bats-core/bats-support test/test_helper/bats-supportgit submodule add https://github.com/bats-core/bats-assert test/test_helper/bats-assert
Dalam CI, pulihkan submodul dengan actions/checkout@v4 dan pilihan submodules: recursive. Langkah di bawah menunjukkan konfigurasi daftar keluar yang lengkap.
# .github/workflows/ci.yml — checkout with submodules
- name: Checkout repository
uses: actions/checkout@v4
with:
submodules: recursive # restores bats-core + helpersMenjalankan Ujian Bats dalam CI
Setelah Bats tersedia (melalui submodul atau pemasangan pakej), menjalankan ujian hanya memerlukan satu perintah. Halakan perintah kepada direktori dan Bats akan mencari setiap fail .bats secara rekursif dengan pilihan --recursive.
Pilihan --formatter tap menghasilkan format TAP (Protokol Uji Apa Sahaja), yang boleh dihuraikan oleh banyak sistem CI untuk pelaporan ujian. Pemformat pretty lalai lebih sesuai untuk bacaan manusia dalam log mentah.
Gunakan --timing untuk mengesan ujian yang perlahan lebih awal — ujian yang mengambil masa lebih daripada 5 saat biasanya menandakan panggilan rangkaian yang tidak dikehendaki atau mock yang tiada.
# .github/workflows/ci.yml — Bats test step
- name: Run Bats tests
run: |
# If installed as a submodule:
./test/bats/bin/bats \
--recursive \
--timing \
tests/
# If installed via apt or brew (alternative):
# bats --recursive --timing tests/Aliran Kerja Lengkap: ShellCheck + Bats
Sekarang gabungkan semuanya ke dalam satu fail aliran kerja yang sedia untuk produksi. Amalan terbaik yang digunakan di sini:
- Dua tugas berasingan (
lintdantest) berjalan secara selari untuk memberikan maklum balas yang lebih pantas. - Tugas
testmengisytiharkanneeds: lintsupaya ujian hanya dijalankan selepas penganalisisan lulus — ini mengelakkan pembaziran minit pelancar pada kod yang jelas rosak. - Versi tindakan yang ditetapkan (
@v4) menghalang kerosakan mengejut akibat kemas kini huluan. - Blok
permissions:mengehadkan token aliran kerja kepada keizinan minimum yang diperlukan.
# .github/workflows/ci.yml
name: Shell CI
on:
push:
branches: [main]
pull_request:
permissions:
contents: read
jobs:
lint:
name: ShellCheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run ShellCheck
run: |
mapfile -t scripts < <(find . -name '*.sh' -not -path './.git/*')
[[ ${#scripts[@]} -gt 0 ]] && shellcheck --severity=warning -x "${scripts[@]}"
test:
name: Bats Tests
runs-on: ubuntu-latest
needs: lint
steps:
- uses: actions/checkout@v4
with:
submodules: recursive
- name: Run tests
run: ./test/bats/bin/bats --recursive --timing tests/Menyimpan Kebergantungan dalam Cache untuk Pelaksanaan Lebih Pantas
Apabila pembantu Bats atau alat lain dipasang melalui pengurus pakej dalam aliran kerja, penggunaan cache mempercepat pelaksanaan seterusnya dengan ketara. GitHub Actions menyediakan tindakan actions/cache untuk tujuan ini.
Perkara utama untuk penggunaan cache yang berkesan:
- Gunakan kunci cache yang merangkumi OS, nama alat dan cincangan fail kunci — supaya cache dibatalkan secara automatik apabila kebergantungan berubah.
- Sandaran
restore-keysmembolehkan aliran kerja menggunakan cache lama dan bukannya bermula dari awal apabila cache tidak ditemui. - Untuk submodul Git, cache jarang diperlukan kerana daftar keluar submodul adalah pantas. Cache paling berguna untuk
npm,pipatau pemasangan alat terkompil.
# .github/workflows/ci.yml — cache step example
- name: Cache Bats npm helpers
uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-bats-${{ hashFiles('package-lock.json') }}
restore-keys: |
${{ runner.os }}-bats-
- name: Install helpers
run: npm ci # uses cache when availablePerlindungan Cabang: Menguatkuasakan Pemeriksaan Berjaya
Aliran kerja CI yang tidak menyekat penggabungan paling baik pun hanya bersifat nasihat. Peraturan Perlindungan Cabang GitHub mengubah pemeriksaan anda menjadi pengawal wajib.
Untuk mengkonfigurasinya: pilih Settings → Branches → Add rule untuk main, kemudian aktifkan:
- Require status checks to pass before merging — pilih ShellCheck dan Bats Tests mengikut nama.
- Require branches to be up to date before merging — menghalang PR yang lulus pemeriksaan pada asas lama daripada memasukkan kod yang rosak.
- Do not allow bypassing the above settings — menguatkuasakan peraturan walaupun terhadap pentadbir repositori.
Dengan peraturan ini, satu-satunya laluan untuk menggabungkan kod ialah PR dengan semua tugas CI yang berjaya — tepatnya jaringan keselamatan yang anda perlukan.
Menyahpepijat Langkah CI yang Gagal Secara Setempat
Apabila pelaksanaan CI gagal, kitaran pembaikan terpantas ialah menghasilkan semula kegagalan itu secara setempat sebelum menghantar commit lain. Dua teknik:
- Jalankan perintah tepat daripada langkah yang gagal dalam terminal anda — CI menjalankan cangkerang biasa, jadi perintah tersebut boleh disalin dan ditampal untuk dihasilkan semula.
- Gunakan
act— alat yang menjalankan aliran kerja GitHub Actions secara setempat dalam Docker, lalu memberikan padanan yang paling hampir dengan persekitaran pelancar yang dihoskan.
Sumber biasa kegagalan yang hanya berlaku dalam CI ialah ketidakpadanan versi alat antara Mac anda (contohnya find BSD pada macOS berbanding find GNU pada Ubuntu). Sentiasa uji dengan pilihan --posix atau gunakan act untuk menjalankan imej Ubuntu secara setempat.
#!/usr/bin/env bash
# run_ci_locally.sh — mimic the CI lint step on your machine
set -euo pipefail
echo '=== ShellCheck ==='
mapfile -t scripts < <(find . -name '*.sh' -not -path './.git/*')
if [[ ${#scripts[@]} -eq 0 ]]; then
echo 'No .sh files found.'
else
shellcheck --severity=warning -x "${scripts[@]}"
echo "Linted ${#scripts[@]} file(s) — OK"
fi
echo '=== Bats ==='
./test/bats/bin/bats --recursive --timing tests/Semakan Pengetahuan: Konsep Saluran Paip CI
Uji pemahaman anda tentang menghubungkan ShellCheck dan Bats ke GitHub Actions.
Ulang Kaji: CI Cangkerang dengan ShellCheck dan Bats
Dalam pelajaran ini, anda membina saluran paip CI lengkap untuk projek Bash menggunakan GitHub Actions. Berikut ialah perkara yang telah anda pelajari:
- Asas GitHub Actions — YAML aliran kerja berada dalam
.github/workflows/, dicetuskan oleh push dan pull_request, serta menjalankan tugas pada pelancarubuntu-latest. - ShellCheck — telah dipasang terlebih dahulu pada pelancar Ubuntu; gunakan
finduntuk mencari skrip dan--severity=warning -xsebagai pengawal analisis praktikal. - Bats melalui submodul — tetapkan bats-core dan pembantu sebagai submodul Git; pulihkannya dalam CI dengan
submodules: recursivepada tindakan daftar keluar. - Susunan tugas — gunakan
needs:supaya ujian hanya dijalankan selepas penganalisisan lulus, sekali gus mengekalkan maklum balas pantas dan mengelakkan pembaziran pengiraan. - Perlindungan cabang — kuatkuasakan pemeriksaan status dalam tetapan GitHub supaya tiada PR boleh digabungkan tanpa CI yang berjaya.
- Penghasilan semula secara setempat — salin perintah CI terus ke terminal anda atau gunakan
actuntuk menyahpepijat kegagalan tanpa commit tambahan.
Dengan saluran paip ini tersedia, setiap perubahan cangkerang disahkan secara automatik sebelum menyentuh cabang utama anda.
Pelajari Kem Intensif DevOps dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 142
- Pelajaran
- 568
Soalan Lazim
Adakah pelajaran “Menjalankan Ujian Shell dalam Saluran Paip CI” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Kem Intensif DevOps, termasuk “Menjalankan Ujian Shell dalam Saluran Paip CI”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Kem Intensif DevOps merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Menjalankan Ujian Shell dalam Saluran Paip CI”?
Sambungkan ShellCheck dan Bats ke GitHub Actions supaya setiap perubahan shell hanya diterima selepas semua pemeriksaan lulus Anda berlatih Kem Intensif DevOps menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Kem Intensif DevOps?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Kem Intensif DevOps di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “Menjalankan Ujian Shell dalam Saluran Paip CI” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Kem Intensif DevOps ini?
Ya. Setiap pelajaran Kem Intensif DevOps menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengujian Unit Fungsi dengan Bats-core
- Meniru Perintah dan Menyediakan Alat Luaran Palsu
- Lekapan Ujian, Persekitaran Sementara dan Liputan
- Menjalankan Ujian Shell dalam Saluran Paip CI