CodeCommit: Nguồn Code Cho Pipeline

K
Kai··5 min read

Nền đã xong: có service role và bucket artifact. Giờ tới mảnh đầu của dây chuyền — nguồn code. Pipeline phải lấy code từ đâu đó, và trong series này nơi đó là CodeCommit: dịch vụ Git hosting của AWS. Bài này tạo repo, kết nối Git để push, đẩy một ứng dụng mẫu lên, rồi làm quen branch và pull request — tất cả bằng AWS CLI và Git, không đụng tới console.

Một lưu ý thật thà ngay từ đầu: AWS đã ngừng nhận khách hàng mới cho CodeCommit từ 2024, nên nếu tài khoản của bạn chưa từng dùng CodeCommit thì có thể không tạo được repo. Ta dùng nó ở đây vì nó là mảnh source gốc của bộ Code* và tích hợp gọn nhất với CodeBuild/CodePipeline.

Mục tiêu

Tạo được repo CodeCommit, kết nối Git an toàn (không lưu mật khẩu riêng), push code thật, và đi qua luồng branch → pull request → merge bằng CLI.

Tạo repo

$ aws codecommit create-repository --repository-name awscicd-demo-app \
    --repository-description "Sample app for awscicd CI/CD series" \
    --region ap-southeast-1 \
    --query 'repositoryMetadata.[repositoryName,cloneUrlHttp]' --output text
awscicd-demo-app    https://git-codecommit.ap-southeast-1.amazonaws.com/v1/repos/awscicd-demo-app

Repo đã có, kèm một URL clone HTTPS. Nhưng để push qua URL đó cần xác thực, và đây là chỗ đáng dừng lại.

Kết nối Git: git-remote-codecommit

CodeCommit có vài cách xác thực Git. Cách cũ là tạo Git credentials (cặp username/password riêng cho CodeCommit) trong IAM rồi nhập vào Git. Cách được khuyến nghị hiện nay là git-remote-codecommit (gọi tắt grc) — một tiện ích mở rộng Git, ký mỗi request bằng chính credential AWS bạn đang dùng. Tài liệu nói rõ: "khác các cách kết nối HTTPS khác, git-remote-codecommit không cần thiết lập Git credentials cho user". Không có mật khẩu Git nào để tạo, lưu hay rò rỉ — Git mượn luôn danh tính AWS của bạn.

   máy bạn: git push
        │  remote = codecommit::ap-southeast-1://awscicd-demo-app
        ▼
   git-remote-codecommit (grc)
        │  ký request bằng AWS credentials (SigV4) — không cần username/password Git
        ▼
   CodeCommit  ──▶ IAM kiểm quyền (codecommit:GitPush / GitPull)

Cài grc (cần Python + pip):

$ pip install git-remote-codecommit

Sau khi cài, Git hiểu được URL dạng codecommit::<region>://<repo>. grc dùng credential AWS từ profile mặc định, nên không cần cấu hình gì thêm nếu aws CLI đã chạy được.

Đẩy ứng dụng mẫu lên

Tạo một app tối thiểu — một trang tĩnh, ta sẽ thêm buildspec và appspec ở các bài sau:

$ mkdir awscicd-demo-app && cd awscicd-demo-app
$ cat > index.html <<'HTML'
<!doctype html>
<html lang="en">
  <head><meta charset="utf-8"><title>awscicd demo</title></head>
  <body><h1>Hello from the awscicd demo app — v1</h1></body>
</html>
HTML
$ git init -q -b main && git add -A && git commit -q -m "Initial commit: static demo app v1"

Trỏ remote tới CodeCommit qua grc rồi push:

$ git remote add origin codecommit::ap-southeast-1://awscicd-demo-app
$ git push -u origin main
remote: Validating objects: 100%
To codecommit::ap-southeast-1://awscicd-demo-app
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Push chạy mà không hỏi mật khẩu — grc đã ký bằng credential AWS, IAM kiểm quyền codecommit:GitPush. Code giờ đã ở trên CodeCommit.

Branch và pull request

CodeCommit hỗ trợ đầy đủ luồng làm việc theo nhánh và review qua pull request, điều khiển được hoàn toàn bằng CLI. Tạo một nhánh tính năng, sửa, push:

$ git checkout -b feature/v2-heading
$ sed -i '' 's/v1/v2/' index.html
$ git commit -am "Update heading to v2"
$ git push origin feature/v2-heading

Mở pull request đề nghị gộp nhánh đó vào main:

$ aws codecommit create-pull-request --title "Bump heading to v2" \
    --description "Demo PR for the series" \
    --targets repositoryName=awscicd-demo-app,sourceReference=feature/v2-heading,destinationReference=main \
    --query 'pullRequest.[pullRequestId,pullRequestStatus,title]' --output text
1   OPEN    Bump heading to v2

PR số 1 đang OPEN. Trong nhóm thật, đây là lúc người khác review và comment; ở đây ta gộp luôn bằng fast-forward:

$ aws codecommit merge-pull-request-by-fast-forward --pull-request-id 1 \
    --repository-name awscicd-demo-app \
    --query 'pullRequest.pullRequestStatus' --output text
CLOSED

PR chuyển sang CLOSED (đã merge). Kiểm chứng main giờ đã có thay đổi, đọc thẳng file qua API không cần pull về:

$ aws codecommit get-file --repository-name awscicd-demo-app --file-path index.html \
    --query 'fileContent' --output text | base64 -d | grep -o 'v[0-9]'
v2

main đã là v2. Đây cũng là điểm quan trọng cho phần sau: pipeline sẽ lắng nghe nhánh main, nên mỗi lần một PR được merge vào main, dây chuyền build–deploy sẽ tự khởi động (ta nối ở Part V).

🧹 Dọn dẹp

Repo này là nguồn code cho cả series — pipeline ở các bài sau lấy code từ đây, nên giữ lại tới khi học xong. Khi muốn xóa (cuối series):

$ aws codecommit delete-repository --repository-name awscicd-demo-app

Repo CodeCommit nằm trong free-tier ở mức nhỏ (5 người dùng hoạt động, 50 GB), nên giữ qua các bài gần như không tốn gì.

Tổng kết

CodeCommit là repo Git riêng tư trên AWS, tích hợp IAM. Cách kết nối Git nên dùng là git-remote-codecommit: nó ký request bằng credential AWS nên không cần tạo hay lưu mật khẩu Git riêng, và IAM kiểm quyền GitPush/GitPull. Ta đã tạo repo, push một app mẫu, và đi trọn luồng branch → pull request → merge bằng CLI, xác nhận main cập nhật. Nguồn code đã sẵn sàng làm điểm khởi đầu cho pipeline.

Part I khép lại với nền và nguồn đã có. Part II bước vào chặng build: bài tới tạo một CodeBuild project, viết buildspec.yml, chạy build thật trên đoạn code vừa push, và đọc log để thấy từng phase chạy ra sao.