Secara otomatis mendeteksi perubahan dan memulai CodePipeline jaringan pipa yang berbeda untuk monorepo di CodeCommit - AWS Prescriptive Guidance

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Secara otomatis mendeteksi perubahan dan memulai CodePipeline jaringan pipa yang berbeda untuk monorepo di CodeCommit

Helton Ribeiro, Petrus Batalha, dan Ricardo Morais, Amazon Web Services

Ringkasan

Pemberitahuan: AWS CodeCommit tidak lagi tersedia untuk pelanggan baru. Pelanggan yang sudah ada AWS CodeCommit dapat terus menggunakan layanan seperti biasa. Pelajari selengkapnya

Pemberitahuan: AWS Cloud9 tidak lagi tersedia untuk pelanggan baru. Pelanggan yang sudah ada AWS Cloud9 dapat terus menggunakan layanan seperti biasa. Pelajari selengkapnya

Pola ini membantu Anda secara otomatis mendeteksi perubahan pada kode sumber aplikasi berbasis monorepo AWS CodeCommit dan kemudian memulai pipeline yang menjalankan integrasi berkelanjutan dan pengiriman berkelanjutan (CI/CD) automation for each microservice. This approach means that each microservice in your monorepo-based application can have a dedicated CI/CDpipeline, AWS CodePipeline yang memastikan visibilitas yang lebih baik, berbagi kode yang lebih mudah, dan peningkatan kolaborasi, standardisasi, dan kemampuan ditemukan.

Solusi yang dijelaskan dalam pola ini tidak melakukan analisis ketergantungan apa pun di antara layanan mikro di dalam monorepo. Ini hanya mendeteksi perubahan dalam kode sumber dan memulai pipa yang cocok CI/CD .

Pola ini digunakan AWS Cloud9 sebagai lingkungan pengembangan terintegrasi (IDE) dan AWS Cloud Development Kit (AWS CDK) untuk mendefinisikan infrastruktur dengan menggunakan dua AWS CloudFormation tumpukan: MonoRepoStack danPipelinesStack. MonoRepoStackTumpukan menciptakan monorepo AWS CodeCommit dan AWS Lambda fungsi yang memulai pipeline. CI/CD PipelinesStackTumpukan mendefinisikan infrastruktur pipeline Anda.

penting

Alur kerja pola ini adalah bukti konsep (PoC). Kami menyarankan Anda menggunakannya hanya di lingkungan pengujian. Jika Anda ingin menggunakan pendekatan pola ini di lingkungan produksi, lihat Praktik terbaik keamanan di IAM dalam dokumentasi AWS Identity and Access Management (IAM) dan buat perubahan yang diperlukan pada peran IAM Anda dan. Layanan AWS 

Prasyarat dan batasan

Prasyarat

Arsitektur

Diagram berikut menunjukkan bagaimana menggunakan AWS CDK untuk mendefinisikan infrastruktur dengan dua AWS CloudFormation tumpukan: MonoRepoStack danPipelinesStack.

Alur kerja untuk menggunakan AWS CDK untuk menentukan infrastruktur dengan dua CloudFormation tumpukan.

Diagram menunjukkan alur kerja berikut:

  1. Proses bootstrap menggunakan AWS CDK untuk membuat AWS CloudFormation tumpukan MonoRepoStack danPipelinesStack.

  2. MonoRepoStackTumpukan membuat CodeCommit repositori untuk aplikasi Anda dan fungsi monorepo-event-handler Lambda yang dimulai setelah setiap komit.

  3. PipelinesStackTumpukan membuat pipeline yang diprakarsai oleh fungsi Lambda. CodePipeline Setiap layanan mikro harus memiliki pipa infrastruktur yang ditentukan.

  4. Pipeline untuk microservice-n diprakarsai oleh fungsi Lambda dan memulai tahapan CI/CD terisolasi yang didasarkan pada kode sumber di. CodeCommit

  5. Pipeline untuk microservice-1 diprakarsai oleh fungsi Lambda dan memulai tahapan CI/CD terisolasi yang didasarkan pada kode sumber di. CodeCommit

Diagram berikut menunjukkan penyebaran AWS CloudFormation tumpukan MonoRepoStack dan PipelinesStack dalam akun.

Penerapan CloudFormation tumpukan MonoRepoStack dan PipelinesStack di akun AWS.
  1. Seorang pengguna mengubah kode di salah satu layanan mikro aplikasi.

  2. Pengguna mendorong perubahan dari repositori lokal ke repositori. CodeCommit

  3. Aktivitas push memulai fungsi Lambda yang menerima semua dorongan ke repositori. CodeCommit

  4. Fungsi Lambda membaca parameter di Parameter Store, kemampuan AWS Systems Manager, untuk mengambil ID komit terbaru. Parameter memiliki format penamaan:/MonoRepoTrigger/{repository}/{branch_name}/LastCommit. Jika parameter tidak ditemukan, fungsi Lambda membaca ID komit terakhir dari CodeCommit repositori dan menyimpan nilai yang dikembalikan di Parameter Store.

  5. Setelah mengidentifikasi ID komit dan file yang diubah, fungsi Lambda mengidentifikasi pipeline untuk setiap direktori microservice dan memulai pipeline yang diperlukan. CodePipeline

Alat

  • AWS Cloud Development Kit (AWS CDK)adalah kerangka pengembangan perangkat lunak untuk mendefinisikan infrastruktur cloud dalam kode dan menyediakannya. AWS CloudFormation

  • Python adalah bahasa pemrograman yang memungkinkan Anda bekerja dengan cepat dan mengintegrasikan sistem dengan lebih efektif.

Kode

Kode sumber dan template untuk pola ini tersedia di repositori pemicu multi-pipeline GitHub AWS CodeCommit monorepo.

Praktik terbaik

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Buat lingkungan Python virtual.

Di AWS Cloud9 IDE Anda, buat lingkungan Python virtual dan instal dependensi yang diperlukan dengan menjalankan perintah berikut:

make install

Developer

Bootstrap Akun AWS dan Wilayah AWS untuk AWS CDK.

Bootstrap required Akun AWS dan Region dengan menjalankan perintah berikut:

make bootstrap account-id=<your-AWS-account-ID> region=<required-region>

Developer
TugasDeskripsiKeterampilan yang dibutuhkan

Tambahkan kode sampel Anda ke direktori aplikasi Anda.

Tambahkan direktori yang berisi kode aplikasi sampel Anda ke monorepo-sample direktori di repositori pemicu multi-pipeline GitHub AWS CodeCommit monorepo kloning.

Developer

Edit file monorepo-main.json

Tambahkan nama direktori kode aplikasi Anda dan nama pipeline ke monorepo-main.json file di repositori kloning.

Developer

Buat pipa.

Dalam Pipelines direktori untuk repositori, tambahkan pipeline class untuk aplikasi Anda. Direktori berisi dua file sampel, pipeline_hotsite.py danpipeline_demo.py. Setiap file memiliki tiga tahap: source, build, dan deploy.

Anda dapat menyalin salah satu file dan membuat perubahan sesuai dengan kebutuhan aplikasi Anda. 

Developer

Edit file monorepo_config.py

Diservice_map, tambahkan nama direktori untuk aplikasi Anda dan kelas yang Anda buat untuk pipeline.

Misalnya, kode berikut menunjukkan definisi pipeline dalam Pipelines direktori yang menggunakan file bernama pipeline_mysample.py dengan MySamplePipeline kelas:

... # Pipeline definition imports from pipelines.pipeline_demo import DemoPipeline from pipelines.pipeline_hotsite import HotsitePipeline from pipelines.pipeline_mysample import MySamplePipeline ### Add your pipeline configuration here service_map: Dict[str, ServicePipeline] = { # folder-name -> pipeline-class 'demo': DemoPipeline(), 'hotsite': HotsitePipeline(), 'mysample': MySamplePipeline() }
Developer
TugasDeskripsiKeterampilan yang dibutuhkan

Menyebarkan AWS CloudFormation tumpukan.

Terapkan AWS CloudFormation MonoRepoStack tumpukan dengan nilai parameter default di direktori root dari repositori kloning dengan menjalankan perintah. make deploy-core

Anda dapat mengubah nama repositori dengan menjalankan perintah. make deploy-core monorepo-name=<repo_name>

catatan

Anda dapat secara bersamaan menyebarkan kedua pipeline dengan menggunakan perintah. make deploy monorepo-name=<repo_name>

Developer

Validasi CodeCommit repositori.

Validasi bahwa sumber daya Anda dibuat dengan menjalankan aws codecommit get-repository --repository-name <repo_name> perintah.

penting

Karena AWS CloudFormation tumpukan membuat CodeCommit repositori tempat monorepo disimpan, jangan jalankan cdk destroy MonoRepoStack  perintah jika Anda sudah mulai mendorong modifikasi ke dalamnya.

Developer

Validasi hasil AWS CloudFormation tumpukan.

Validasi bahwa AWS CloudFormation MonoRepoStack tumpukan dibuat dan dikonfigurasi dengan benar dengan menjalankan perintah berikut:

aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE --query 'StackSummaries[?StackName == 'MonoRepoStack']'
Developer
TugasDeskripsiKeterampilan yang dibutuhkan

Menyebarkan AWS CloudFormation tumpukan.

AWS CloudFormation PipelinesStackTumpukan harus digunakan setelah Anda menyebarkan tumpukan. MonoRepoStack Tumpukan bertambah besar ketika layanan mikro baru ditambahkan ke basis kode monorepo dan digunakan kembali saat layanan mikro baru di-onboard.

Menyebarkan PipelinesStack tumpukan dengan menjalankan make deploy-pipelines perintah.

catatan

Anda juga dapat menyebarkan secara bersamaan menyebarkan kedua pipeline dengan menjalankan perintah. make deploy monorepo-name=<repo_name>

Contoh keluaran berikut menunjukkan bagaimana PipelinesStacks penerapan mencetak URLs untuk layanan mikro di akhir implementasi:

Outputs: PipelinesStack.demourl = .cloudfront.net PipelinesStack.hotsiteurl = .cloudfront.net
Developer

Validasi hasil AWS CloudFormation tumpukan.

Validasi bahwa AWS CloudFormation PipelinesStacks tumpukan dibuat dan dikonfigurasi dengan benar dengan menjalankan perintah berikut:

aws cloudformation list-stacks --stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE --query 'StackSummaries[?StackName == 'PipelinesStack']'
Developer
TugasDeskripsiKeterampilan yang dibutuhkan

Hapus AWS CloudFormation tumpukan Anda.

Jalankan perintah make destroy.

Developer

Hapus bucket S3 untuk pipeline Anda.

  1. Masuk ke AWS Management Consoledan buka konsol Amazon Simple Storage Service (Amazon S3).

  2. Hapus bucket S3 yang terkait dengan pipeline Anda dan gunakan nama berikut: pipelinesstack-codepipeline*

Developer

Pemecahan Masalah

IsuSolusi

Saya mengalami AWS CDK masalah.

Lihat Memecahkan AWS CDK masalah umum dalam dokumentasi AWS CDK.

Saya mendorong kode layanan mikro saya, tetapi pipa layanan mikro tidak berjalan.

Validasi pengaturan

Verifikasi konfigurasi cabang:

  • Pastikan Anda mendorong kode Anda ke cabang yang benar. Pipeline ini dikonfigurasi untuk berjalan hanya ketika perubahan dilakukan ke main cabang. Dorongan ke cabang lain tidak memulai pipeline kecuali jika dikonfigurasi secara khusus.

  • Setelah Anda mendorong kode Anda, periksa apakah komit terlihat AWS CodeCommit untuk memastikan bahwa push berhasil dan bahwa koneksi antara lingkungan lokal Anda dan repositori masih utuh. Segarkan kredensyal Anda jika ada masalah dalam mendorong kode.

Validasi file konfigurasi:

  • Konfirmasikan bahwa service_map variabel secara monorepo_config.py akurat mencerminkan struktur direktori layanan mikro Anda saat ini. Variabel ini memainkan peran penting dalam memetakan push kode Anda ke pipeline masing-masing.

  • Pastikan monorepo-main.json itu diperbarui untuk menyertakan pemetaan baru untuk layanan mikro Anda. File ini penting agar pipeline mengenali dan menangani perubahan pada layanan mikro Anda dengan benar.

Pemecahan masalah di konsol

AWS CodePipeline cek:

  • Pada AWS Management Console, konfirmasikan bahwa Anda berada di Wilayah AWS tempat pipeline Anda di-host. Buka CodePipeline konsol dan periksa apakah pipeline yang sesuai dengan layanan mikro Anda telah dimulai.

    Analisis kesalahan: Jika pipeline dimulai tetapi gagal, tinjau pesan kesalahan atau log yang disediakan oleh CodePipeline untuk memahami apa yang salah.

AWS Lambda pemecahan masalah:

  • Di AWS Lambda konsol, buka fungsi monorepo-event-handler Lambda. Verifikasi bahwa fungsi dimulai sebagai respons terhadap push kode.

    Analisis log: Periksa log fungsi Lambda untuk masalah apa pun. Log dapat memberikan wawasan terperinci tentang apa yang terjadi saat fungsi dijalankan dan membantu mengidentifikasi apakah fungsi memproses peristiwa seperti yang diharapkan.

Saya perlu memindahkan semua layanan mikro saya.

Ada dua pendekatan untuk memaksa pemindahan semua layanan mikro. Pilih opsi yang sesuai dengan kebutuhan Anda.

Pendekatan 1: Hapus parameter di Parameter Store

Metode ini melibatkan penghapusan parameter tertentu dalam Systems Manager Parameter Store yang melacak ID komit terakhir yang digunakan untuk penerapan. Saat Anda menghapus parameter ini, sistem dipaksa untuk menerapkan kembali semua layanan mikro pada pemicu berikutnya, karena ia menganggapnya sebagai keadaan baru.

Langkah:

  1. Temukan entri Parameter Store tertentu yang menyimpan ID komit atau penanda penerapan terkait untuk monorepo Anda. Nama parameter mengikuti format: "/MonoRepoTrigger/{repository}/{branch_name}/LastCommit"

  2. Pertimbangkan untuk mencadangkan nilai parameter jika penting atau jika Anda ingin mempertahankan catatan status penerapan sebelum mengatur ulang.

  3. Gunakan AWS Management Console, AWS CLI, atau SDKs untuk menghapus parameter yang diidentifikasi. Tindakan ini mengatur ulang penanda penerapan.

  4. Setelah penghapusan, dorongan berikutnya ke repositori akan menyebabkan sistem menerapkan semua layanan mikro, karena mencari komit terbaru untuk dipertimbangkan untuk penerapan.

Kelebihan:

  • Sederhana dan cepat diimplementasikan dengan langkah-langkah minimal.

  • Tidak perlu membuat perubahan kode arbitrer untuk memulai penerapan.

Kontra:

  • Kurang kontrol granular atas proses penyebaran.

  • Berpotensi berisiko jika Parameter Store digunakan untuk mengelola konfigurasi penting lainnya.

Pendekatan 2: Dorong komit di setiap subfolder monorepo

Metode ini melibatkan membuat perubahan kecil dan mendorongnya di setiap subfolder layanan mikro di dalam monorepo untuk memulai jaringan pipa masing-masing.

Langkah:

  1. Buat daftar semua layanan mikro dalam monorepo yang perlu dipindahkan.

  2. Untuk setiap layanan mikro, buat perubahan minimal dan tidak berdampak pada subfoldernya. Ini mungkin memperbarui README file, menambahkan komentar dalam file konfigurasi, atau perubahan apa pun yang tidak memengaruhi fungsionalitas layanan.

  3. Komit perubahan ini dengan pesan yang jelas (seperti “Inisiate redeployment of microservices”) dan dorong mereka ke repositori. Pastikan Anda mendorong perubahan ke cabang yang memulai penerapan.

  4. Pantau saluran pipa untuk setiap layanan mikro untuk memastikan bahwa mereka dimulai dan diselesaikan dengan sukses.

Kelebihan:

  • Memberikan kontrol granular atas layanan mikro mana yang dipindahkan.

  • Lebih aman karena tidak melibatkan penghapusan parameter konfigurasi yang mungkin digunakan untuk tujuan lain.

Kontra:

  • Lebih memakan waktu, terutama dengan sejumlah besar layanan mikro.

  • Membutuhkan membuat perubahan kode yang tidak perlu yang dapat mengacaukan riwayat komit.

Sumber daya terkait