Membuat dan menambahkan tindakan kustom di CodePipeline - AWS CodePipeline

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

Membuat dan menambahkan tindakan kustom di CodePipeline

AWS CodePipelinemenyertakan sejumlah tindakan yang membantu Anda mengonfigurasi build, menguji, dan menyebarkan sumber daya untuk proses rilis otomatis Anda. Jika proses rilis Anda mencakup aktivitas yang tidak disertakan dalam tindakan default, seperti proses pembangunan yang dikembangkan secara internal atau suite uji, Anda dapat membuat tindakan kustom untuk tujuan itu dan memasukkannya ke dalam saluran Anda. Anda dapat menggunakanAWS CLIuntuk membuat tindakan khusus dalam jaringan pipa yang terkait denganAWSakun.

Anda dapat membuat tindakan kustom untuk berikut iniAWS CodePipelinekategori tindakan:

  • Tindakan pembuatan kustom yang membangun atau mengubah item

  • Tindakan penyebaran kustom yang menyebarkan item ke satu atau lebih server, situs web, atau repositori

  • Tindakan uji khusus yang mengonfigurasi dan menjalankan pengujian otomatis

  • Sebuah tindakan invoke kustom yang menjalankan fungsi

Ketika Anda membuat tindakan kustom, Anda juga harus membuat job worker yang akan polling CodePipeline untuk permintaan pekerjaan untuk tindakan kustom ini, menjalankan pekerjaan, dan mengembalikan hasil status ke CodePipeline. Pekerja kerja ini dapat ditemukan di komputer atau sumber daya apa pun selama memiliki akses ke titik akhir publik untuk CodePipeline. Untuk mengelola akses dan keamanan dengan mudah, pertimbangkan untuk meng-hosting job worker Anda di instans Amazon EC2.

Diagram berikut menunjukkan tampilan garis besar yang mencakup tindakan pembuatan kustom:


            Pandangan tingkat tinggi dari pipa yang mencakup tindakan pembuatan kustom.

Ketika pipa mencakup tindakan kustom sebagai bagian dari tahap, pipa akan membuat permintaan pekerjaan. Seorang pekerja kerja kustom mendeteksi permintaan tersebut dan melakukan pekerjaan itu (dalam contoh ini, proses kustom menggunakan perangkat lunak pembuatan pihak ketiga). Ketika tindakan selesai, pekerja kerja mengembalikan hasil sukses atau hasil kegagalan. Jika hasil sukses diterima, pipa akan memberikan revisi dan artefak ke tindakan berikutnya. Jika kegagalan dikembalikan, pipa tidak akan memberikan revisi ke tindakan berikutnya dalam pipa.

catatan

Petunjuk ini berasumsi bahwa Anda telah menyelesaikan langkah-langkah diMemulai dengan CodePipeline.

Membuat tindakan kustom

Membuat tindakan kustom denganAWS CLI

  1. Buka editor teks dan buat file JSON untuk tindakan khusus Anda yang mencakup kategori tindakan, penyedia tindakan, dan pengaturan apa pun yang diperlukan oleh tindakan khusus Anda. Misalnya, untuk membuat tindakan pembuatan kustom yang hanya memerlukan satu properti, file JSON Anda mungkin terlihat seperti ini:

    { "category": "Build", "provider": "My-Build-Provider-Name", "version": "1", "settings": { "entityUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/", "executionUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/lastSuccessfulBuild/{ExternalExecutionId}/" }, "configurationProperties": [{ "name": "ProjectName", "required": true, "key": true, "secret": false, "queryable": false, "description": "The name of the build project must be provided when this action is added to the pipeline.", "type": "String" }], "inputArtifactDetails": { "maximumCount": integer, "minimumCount": integer }, "outputArtifactDetails": { "maximumCount": integer, "minimumCount": integer }, "tags": [{ "key": "Project", "value": "ProjectA" }] }

    Contoh ini menambahkan penandaan ke tindakan kustom dengan menyertakanProjectkunci tag danProjectAnilai pada tindakan kustom. Untuk informasi lebih lanjut tentang penandaan sumber daya di CodePipeline, lihatPenandaan pada sumber daya .

    Ada dua properti termasuk dalam file JSON,entityUrlTemplatedanexecutionUrlTemplate. Anda dapat merujuk ke nama di properti konfigurasi tindakan kustom dalam template URL dengan mengikuti format{Config:name}, selama properti konfigurasi keduanya diperlukan dan bukan rahasia. Misalnya, pada sampel di atas,entityUrlTemplatenilai mengacu pada properti konfigurasiProjectName.

    • entityUrlTemplate: link statis yang menyediakan informasi tentang penyedia layanan untuk tindakan. Dalam contoh, sistem build menyertakan tautan statis ke setiap proyek build. Format tautan akan bervariasi, tergantung pada penyedia build Anda (atau, jika Anda membuat jenis tindakan yang berbeda, seperti pengujian, penyedia layanan lainnya). Anda harus menyediakan format tautan ini sehingga ketika tindakan kustom ditambahkan, pengguna dapat memilih tautan ini untuk membuka browser ke halaman di situs web Anda yang menyediakan spesifik untuk proyek pembangunan (atau lingkungan pengujian).

    • executionUrlTemplate: tautan dinamis yang akan diperbarui dengan informasi tentang tindakan saat ini atau yang terbaru. Ketika pekerja kerja kustom Anda memperbarui status pekerjaan (misalnya, keberhasilan, kegagalan, atau sedang berlangsung), itu juga akan memberikanexternalExecutionIdyang akan digunakan untuk menyelesaikan link. Tautan ini dapat digunakan untuk memberikan rincian tentang menjalankan tindakan.

    Misalnya, saat Anda melihat tindakan di pipeline, Anda melihat dua tautan berikut ini:

    
                        Link di konsol CodePipeline mengarah ke informasi lebih lanjut tentang menjalankan pipa.

    Tautan statis ini muncul setelah Anda menambahkan tindakan kustom Anda dan menunjuk ke alamat dientityUrlTemplate, yang Anda tentukan saat membuat tindakan kustom Anda.

    Tautan dinamis ini diperbarui setelah setiap menjalankan tindakan dan menunjuk ke alamat diexecutionUrlTemplate, yang Anda tentukan saat membuat tindakan kustom Anda.

    Untuk informasi lebih lanjut tentang jenis tautan ini, sertaRevisionURLTemplatedanThirdPartyURL, lihatActionTypeSettingsdanCreateCustomActionTypedi dalamReferensi CodePipeline. Untuk informasi selengkapnya tentang persyaratan struktur tindakan dan cara membuat tindakan, lihatReferensi struktur pipa CodePipeline.

  2. Simpan file JSON dan berikan nama yang dapat Anda ingat dengan mudah (misalnya,MyCustomAction.json).

  3. Buka sesi terminal (Linux, OS X, Unix) atau command prompt (Windows) di komputer tempat Anda menginstalAWS CLI.

  4. GunakanAWS CLImenjalankanaws codepipeline create-custom-action-typeperintah, menentukan nama file JSON yang baru saja Anda buat.

    Misalnya, untuk membuat tindakan kustom build:

    penting

    Pastikan untuk menyertakan file:// sebelum nama file. Hal ini diperlukan dalam perintah ini.

    aws codepipeline create-custom-action-type --cli-input-json file://MyCustomAction.json
  5. Perintah ini mengembalikan seluruh struktur tindakan kustom yang Anda buat, sertaJobListproperti konfigurasi tindakan, yang ditambahkan untuk Anda. Ketika Anda menambahkan tindakan kustom ke pipeline, Anda dapat menggunakanJobListuntuk menentukan proyek mana dari penyedia yang dapat Anda polling untuk pekerjaan. Jika Anda tidak mengonfigurasi ini, semua pekerjaan yang tersedia akan dikembalikan ketika pekerjaan pekerja kustom Anda melakukan polling untuk pekerjaan.

    Misalnya, perintah sebelumnya mungkin mengembalikan struktur yang mirip dengan yang berikut ini:

    { "actionType": { "inputArtifactDetails": { "maximumCount": 1, "minimumCount": 1 }, "actionConfigurationProperties": [ { "secret": false, "required": true, "name": "ProjectName", "key": true, "description": "The name of the build project must be provided when this action is added to the pipeline." } ], "outputArtifactDetails": { "maximumCount": 0, "minimumCount": 0 }, "id": { "category": "Build", "owner": "Custom", "version": "1", "provider": "My-Build-Provider-Name" }, "settings": { "entityUrlTemplate": "https://my-build-instance/job/{Config:ProjectName}/", "executionUrlTemplate": "https://my-build-instance/job/mybuildjob/lastSuccessfulBuild/{ExternalExecutionId}/" } } }
    catatan

    Sebagai bagian dari output daricreate-custom-action-typeperintah, yangidbagian termasuk"owner": "Custom". CodePipeline secara otomatis menugaskanCustomsebagai pemilik jenis tindakan kustom. Nilai ini tidak dapat ditetapkan atau diubah saat Anda menggunakancreate-custom-action-typeperintah atauupdate-pipelineperintah.

Buat job worker untuk tindakan kustom Anda

Tindakan khusus memerlukan job worker yang akan memilih CodePipeline untuk permintaan pekerjaan untuk tindakan kustom, menjalankan pekerjaan, dan mengembalikan hasil status ke CodePipeline. Pekerja kerja dapat ditemukan di komputer atau sumber daya apa pun selama memiliki akses ke endpoint publik untuk CodePipeline.

Ada banyak cara untuk merancang pekerja pekerjaan Anda. Bagian berikut memberikan beberapa panduan praktis untuk mengembangkan pekerja kerja kustom Anda untuk CodePipeline.

Pilih dan konfigurasikan strategi manajemen izin untuk pekerja pekerjaan Anda

Untuk mengembangkan pekerja kerja khusus untuk tindakan kustom Anda di CodePipeline, Anda akan memerlukan strategi untuk integrasi pengguna dan manajemen izin.

Strategi paling sederhana adalah menambahkan infrastruktur yang Anda butuhkan untuk pekerja kerja kustom Anda dengan membuat instans Amazon EC2 dengan peran instans IAM, yang memungkinkan Anda untuk dengan mudah meningkatkan sumber daya yang Anda butuhkan untuk integrasi Anda. Anda dapat menggunakan integrasi bawaan denganAWSuntuk menyederhanakan interaksi antara pekerja kerja kustom Anda dan CodePipeline.

Menyiapkan instans Amazon EC2

  1. Pelajari lebih lanjut tentang Amazon EC2 dan tentukan apakah itu pilihan yang tepat untuk integrasi Anda. Untuk informasi, lihatAmazon EC2 - Hosting Server Virtual.

  2. Mulai membuat instans Amazon EC2 Anda. Untuk informasi, lihatMemulai dengan Instans Linux Amazon EC2.

Strategi lain yang perlu dipertimbangkan adalah menggunakan federasi identitas dengan IAM untuk mengintegrasikan sistem dan sumber daya penyedia identitas Anda yang ada. Strategi ini sangat berguna jika Anda sudah memiliki penyedia identitas perusahaan atau sudah dikonfigurasi untuk mendukung pengguna menggunakan penyedia identitas web. Federasi identitas memungkinkan Anda untuk memberikan akses yang amanAWSsumber daya, termasuk CodePipeline, tanpa harus membuat atau mengelola pengguna IAM. Anda dapat menggunakan fitur dan kebijakan untuk persyaratan keamanan kata sandi dan rotasi kredenensial. Anda dapat menggunakan contoh aplikasi sebagai template untuk desain Anda sendiri.

Untuk mengatur federasi identitas

  1. Pelajari lebih lanjut tentang federasi identitas IAM. Untuk informasi, lihatMengelola Federasi.

  2. Meninjau contoh diSkenario untuk Memberikan Akses Sementarauntuk mengidentifikasi skenario untuk akses sementara yang paling sesuai dengan kebutuhan tindakan kustom Anda.

  3. Tinjau contoh kode federasi identitas yang relevan dengan infrastruktur Anda, seperti:

  4. Mulai mengkonfigurasi federasi identitas. Untuk informasi, lihatPenyedia Identitas dan FederasidiPanduan Pengguna IAM.

Strategi ketiga yang perlu dipertimbangkan adalah membuat pengguna IAM untuk digunakan di bawah AndaAWSakun saat menjalankan tindakan kustom dan pekerja kerja Anda.

Menyiapkan pengguna IAM

  1. Pelajari praktik terbaik IAM dan kasus penggunaan diPraktik Terbaik IAM.

  2. Mulai membuat pengguna IAM dengan mengikuti langkah-langkahMembuat Pengguna IAM di AndaAWSAkun.

Berikut ini adalah contoh kebijakan yang mungkin Anda buat untuk digunakan dengan job worker Anda. Kebijakan ini dimaksudkan sebagai contoh saja dan disediakan sebagaimana adanya.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "codepipeline:PollForJobs", "codepipeline:AcknowledgeJob", "codepipeline:GetJobDetails", "codepipeline:PutJobSuccessResult", "codepipeline:PutJobFailureResult" ], "Resource": [ "arn:aws:codepipeline:us-east-2::actionType:custom/Build/MyBuildProject/1/" ] } ] }
catatan

Pertimbangkan untuk menggunakanAWSCodePipelineCustomActionAccesskebijakan terkelola untuk pengguna IAM.

Mengembangkan pekerja kerja untuk tindakan kustom Anda

Setelah Anda memilih strategi manajemen izin Anda, Anda harus mempertimbangkan bagaimana pekerja kerja Anda akan berinteraksi dengan CodePipeline. Diagram tingkat tinggi berikut menunjukkan alur kerja tindakan kustom dan pekerja kerja untuk proses membangun.


                    Alur kerja tindakan kustom dan pekerja kerja untuk proses membangun.
  1. Jajak pendapat pekerja kerja Anda CodePipeline untuk pekerjaan yang menggunakanPollForJobs.

  2. Ketika pipa dipicu oleh perubahan dalam tahap sumbernya (misalnya, ketika pengembang melakukan perubahan), proses rilis otomatis dimulai. Proses berlanjut sampai tahap di mana tindakan kustom Anda telah dikonfigurasi. Ketika mencapai tindakan Anda pada tahap ini, CodePipeline mengantrian pekerjaan. Pekerjaan ini akan muncul jika pekerja pekerjaan Anda meneleponPollForJobslagi untuk mendapatkan status. Ambil detail pekerjaan dariPollForJobsdan menyebarkannya kembali ke pekerja pekerjaan Anda.

  3. Pekerja pekerjaan panggilanAcknowledgeJobuntuk mengirim CodePipeline pengakuan pekerjaan. CodePipeline mengembalikan pengakuan yang menunjukkan pekerja kerja harus melanjutkan pekerjaan (InProgress), atau, jika Anda memiliki lebih dari satu pemungutan suara pekerja kerja untuk pekerjaan dan pekerja kerja lain telah mengklaim pekerjaan itu,InvalidNonceExceptionrespon kesalahan akan dikembalikan. SetelahInProgresspengakuan, CodePipeline menunggu hasil yang akan dikembalikan.

  4. Job worker memulai tindakan kustom Anda pada revisi, dan kemudian tindakan Anda berjalan. Seiring dengan tindakan lain, tindakan kustom Anda mengembalikan hasil kepada pekerja kerja. Dalam contoh tindakan kustom build, aksi menarik artefak dari bucket Amazon S3, membangunnya, dan mendorong artefak yang berhasil dibangun kembali ke bucket Amazon S3.

  5. Saat aksi berjalan, pekerja kerja bisa meneleponPutJobSuccessResultdengan token kelanjutan (serialisasi status pekerjaan yang dihasilkan oleh job worker, misalnya pengenal build dalam format JSON, atau kunci objek Amazon S3), sertaExternalExecutionIdinformasi yang akan digunakan untuk mengisi link diexecutionUrlTemplate. Ini akan memperbarui tampilan konsol pipa dengan tautan kerja ke detail tindakan tertentu saat sedang berlangsung. Meskipun tidak diperlukan, ini adalah praktik terbaik karena memungkinkan pengguna untuk melihat status tindakan kustom Anda saat berjalan.

    SetelahPutJobSuccessResultdisebut, pekerjaan dianggap lengkap. Pekerjaan baru dibuat di CodePipeline yang mencakup token kelanjutan. Pekerjaan ini akan muncul jika pekerja pekerjaan Anda meneleponPollForJobslagi. Pekerjaan baru ini dapat digunakan untuk memeriksa keadaan tindakan, dan baik kembali dengan token kelanjutan, atau kembali tanpa tanda kelanjutan setelah tindakan selesai.

    catatan

    Jika pekerja kerja Anda melakukan semua pekerjaan untuk tindakan khusus, Anda harus mempertimbangkan untuk memecahkan pemrosesan pekerja kerja Anda menjadi setidaknya dua langkah. Langkah pertama menetapkan halaman rincian untuk tindakan Anda. Setelah Anda membuat halaman rincian, Anda dapat membuat serial status job worker dan mengembalikannya sebagai tanda kelanjutan, tunduk pada batas ukuran (lihatQuota dalamAWSCodePipeline). Misalnya, Anda bisa menulis status tindakan ke dalam string yang Anda gunakan sebagai token kelanjutan. Langkah kedua (dan langkah selanjutnya) dari pemrosesan pekerja kerja Anda melakukan pekerjaan aktual dari tindakan tersebut. Langkah terakhir mengembalikan kesuksesan atau kegagalan CodePipeline, tanpa tanda kelanjutan pada langkah terakhir.

    Untuk informasi lebih lanjut tentang cara menggunakan token kelanjutan, lihat spesifikasi untukPutJobSuccessResultdi dalamReferensi CodePipeline.

  6. Setelah tindakan kustom selesai, job worker mengembalikan hasil tindakan kustom ke CodePipeline dengan memanggil salah satu dari dua API:

    • PutJobSuccessResulttanpa tanda kelanjutan, yang menunjukkan tindakan kustom berhasil berlari

    • PutJobFailureResult, yang menunjukkan tindakan kustom tidak berjalan dengan sukses

    Bergantung pada hasilnya, pipa akan terus berlanjut ke tindakan berikutnya (sukses) atau berhenti (kegagalan).

Arsitektur dan contoh pekerja kerja khusus

Setelah Anda memetakan alur kerja tingkat tinggi Anda, Anda dapat membuat job worker Anda. Meskipun spesifik tindakan kustom Anda pada akhirnya akan menentukan apa yang dibutuhkan untuk pekerja kerja Anda, sebagian besar pekerja kerja untuk tindakan khusus mencakup fungsionalitas berikut:

  • Polling untuk pekerjaan dari CodePipeline menggunakanPollForJobs.

  • Mengakui pekerjaan dan mengembalikan hasil ke CodePipeline menggunakanAcknowledgeJob,PutJobSuccessResult, danPutJobFailureResult.

  • Mengambil artefak dari dan/atau memasukkan artefak ke dalam bucket Amazon S3 untuk pipa. Untuk mengunduh artefak dari bucket Amazon S3, Anda harus membuat klien Amazon S3 yang menggunakan penandatanganan Signature Version 4 (Sig V4). Sig V4 diperlukan untukAWS KMS.

    Untuk mengunggah artefak ke bucket Amazon S3, Anda juga harus mengonfigurasi Amazon S3PutObjectmeminta untuk menggunakan enkripsi. Saat ini hanyaAWSLayanan Manajemen Kunci (AWS KMS) didukung untuk enkripsi.AWS KMSmenggunakanAWS KMS keys. Untuk mengetahui apakah akan menggunakanKunci terkelola AWSatau kunci yang dikelola pelanggan untuk mengunggah artefak, pekerja kerja kustom Anda harus melihatdata pekerjaandan periksakunci enkripsiproperti. Jika properti diatur, Anda harus menggunakan ID kunci yang dikelola pelanggan saat mengonfigurasiAWS KMS. Jika properti kunci adalah null, Anda menggunakanKunci terkelola AWS. CodePipeline menggunakanKunci terkelola AWSkecuali dikonfigurasi lain.

    Untuk contoh yang menunjukkan cara membuatAWS KMSparameter di Jawa atau NET, lihatMenentukanAWS Key Management Servicedi Amazon S3 MenggunakanAWSSDK. Untuk informasi selengkapnya tentang bucket Amazon S3 untuk CodePipeline, lihatKonsep CodePipeline.

Contoh yang lebih kompleks dari pekerja kerja khusus tersedia di GitHub. Sampel ini open source dan disediakan apa adanya.

Menambahkan tindakan khusus ke pipeline

Setelah Anda memiliki job worker, Anda dapat menambahkan tindakan kustom Anda ke pipeline dengan membuat yang baru dan memilihnya saat Anda menggunakan wizard Create Pipeline, dengan mengedit pipeline yang ada dan menambahkan tindakan kustom, atau dengan menggunakanAWS CLI, SDK, atau API.

catatan

Anda dapat membuat pipeline di wizard Create Pipeline yang menyertakan tindakan khusus jika itu adalah tindakan build atau deploy. Jika tindakan kustom Anda ada dalam kategori pengujian, Anda harus menambahkannya dengan mengedit pipa yang ada.

Menambahkan tindakan kustom ke pipeline (konsol)

Untuk membuat pipeline dengan tindakan kustom Anda dengan menggunakan konsol CodePipeline, ikuti langkah-langkah diBuat pipa di CodePipelinedan pilih tindakan kustom Anda dari tahapan sebanyak yang ingin Anda uji. Untuk menambahkan tindakan kustom Anda ke pipeline yang ada dengan menggunakan konsol CodePipeline, ikuti langkah-langkah diMengedit pipa di CodePipelinedan tambahkan tindakan kustom Anda ke satu atau lebih tahap dalam pipa.

Tambahkan tindakan khusus ke pipeline yang ada (CLI)

Anda dapat menggunakanAWS CLIuntuk menambahkan tindakan khusus ke pipeline yang ada.

  1. Buka sesi terminal (Linux, macOS, atau Unix) atau command prompt (Windows) dan jalankanget-pipelineperintah untuk menyalin struktur pipa yang ingin Anda edit ke dalam file JSON. Misalnya, untuk pipa bernamaMyFirstPipeline, Anda akan mengetikkan perintah berikut:

    aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json

    Perintah ini tidak mengembalikan apa pun, tapi file yang Anda buat akan muncul di direktori tempat Anda menjalankan perintah tersebut.

  2. Buka file JSON di editor teks dan modifikasi struktur file untuk menambahkan tindakan kustom Anda ke tahap yang ada.

    catatan

    Jika Anda ingin tindakan Anda berjalan secara paralel dengan tindakan lain di tahap itu, pastikan Anda menetapkannya samarunOrdernilai sebagai tindakan itu.

    Misalnya, untuk memodifikasi struktur pipeline untuk menambahkan tahap bernama Build dan menambahkan tindakan kustom build ke tahap itu, Anda mungkin memodifikasi JSON untuk menambahkan tahap Build sebelum tahap penyebaran sebagai berikut:

    , { "name": "MyBuildStage", "actions": [ { "inputArtifacts": [ { "name": "MyApp" } ], "name": "MyBuildCustomAction", "actionTypeId": { "category": "Build", "owner": "Custom", "version": "1", "provider": "My-Build-Provider-Name" }, "outputArtifacts": [ { "name": "MyBuiltApp" } ], "configuration": { "ProjectName": "MyBuildProject" }, "runOrder": 1 } ] }, { "name": "Staging", "actions": [ { "inputArtifacts": [ { "name": "MyBuiltApp" } ], "name": "Deploy-CodeDeploy-Application", "actionTypeId": { "category": "Deploy", "owner": "AWS", "version": "1", "provider": "CodeDeploy" }, "outputArtifacts": [], "configuration": { "ApplicationName": "CodePipelineDemoApplication", "DeploymentGroupName": "CodePipelineDemoFleet" }, "runOrder": 1 } ] } ] }
  3. Untuk menerapkan perubahan Anda, jalankanupdate-pipelineperintah, menentukan file JSON pipa, mirip dengan yang berikut ini:

    penting

    Pastikan untuk menyertakan file:// sebelum nama file. Hal ini diperlukan dalam perintah ini.

    aws codepipeline update-pipeline --cli-input-json file://pipeline.json

    Perintah ini mengembalikan seluruh struktur pipa diedit.

  4. Buka konsol CodePipeline dan pilih nama pipa yang baru saja Anda edit.

    Pipa menunjukkan perubahan Anda. Lain kali Anda membuat perubahan ke lokasi sumber, pipa akan menjalankan revisi melalui struktur revisi pipa.