Blog AWS Indonesia

Migrasi dari Gitlab ke AWS CodeCommit dengan Gitlab Repository Mirroring

Git adalah salah satu alat yang paling populer ketika kita bicara mengenai Software Development Lifecycle (SDLC). Pengembang menggunakan Git untuk berkolaborasi dengan pengembang lainnya, serta untuk melakukan versioning kode sumber (source code). Saat ini, ada beberapa penyedia hosted git yang mungkin sudah kita gunakan, seperti Github, Gitlab, Bitbucket, atau AWS CodeCommit. Namun, ada kemungkinan kita perlu melakukan migrasi dari satu penyedia ke penyedia lainnya, salah satunya karena berkaitan dengan ketersediaan fitur yang kita butuhkan. Sebagai contoh, setelah kita melakukan migrasi ke CodeCommit, maka kita dapat lebih mudah melakukan integrasi dengan AWS Developer Tools lainnya, seperti AWS CodePipeline, AWS CodeBuild, AWS CodeDeploy atau AWS CodeGuru.

Tulisan ini akan memaparkan tentang bagaimana melakukan migrasi dari Gitlab ke CodeCommit dengan memanfaatkan fitur Repository Mirroring yang disediakan oleh Gitlab. Berikut adalah ilustrasi migrasi yang akan kita lakukan.

gitlab-to-codecommit-migration

Prasyarat dan asumsi

Tulisan ini mengasumsikan beberapa hal sebagai berikut, yang harus terpenuhi sebelum dapat melakukan semua langkah pada tulisan ini dengan baik.

  1. Memiliki akses ke akun AWS yang siap digunakan. Lakukan registrasi disini jika belum memiliki akun AWS.
  2. Sudah melakukan konfigurasi AWS CLI pada komputer lokal. Pastikan untuk menggunakan json sebagai format keluaran dari AWS CLI.
  3. Tulisan ini akan menggunakan region ap-southeast-1 (Singapore), tetapi isi dari tulisan ini tetap dapat diaplikasikan pada region lain dengan melakukan perubahan parameter region pada perintah CLI yang dijalankan.
  4. Tulisan ini akan banyak menggunakan CLI. Oleh karena itu, kita perlu melakukan instalasi jq yang akan membantu mengekstrak data dari keluaran perintah-perintah yang dijalankan melalui CLI.

Tentang proyek yang akan dimigrasikan

Berikut adalah proyek yang akan kita migrasikan ke CodeCommit. Proyek ini hanya berisi satu file, yaitu README.md.

$ tree
.
└── README.md

0 directories, 1 file

Berikut adalah isi dari file README.md pada proyek ini.

$ cat README.md
# Example Repo

Version 3

Jika pengembang menjalankan perintah git remote -v dari direktori proyek di komputer lokal, maka akan terlihat remote URL repositori git yang saat ini digunakan. Nantinya, remote URL ini akan kita ubah juga agar mengarah ke repositori kita yang baru di CodeCommit. Remote URL pada proyek ini diberi nama origin, dan nama repositori pada Gitlab adalah example-repo (nama repositori tertera pada bagian paling belakang URL, dan diakhiri dengan .git).

$ git remote -v
origin	https://gitlab.example.com/teddyaryono/example-repo.git (fetch)
origin	https://gitlab.example.com/teddyaryono/example-repo.git (push)

Ini adalah histori dari commit yang sudah dilakukan sebelumnya di Gitlab.

$ git --no-pager log --decorate=short --pretty=oneline --abbrev-commit
f92692c (HEAD -> main, origin/main, origin/HEAD) Version 3
f29c1f5 Version 2
54ada9e Version 1

Membuat repositori di AWS CodeCommit sebagai tujuan migrasi

Pertama-tama, kita perlu menyiapkan sebuah repositori kosong di CodeCommit sebagai tujuan migrasi. Pada tulisan ini, kita akan membuat repositori dengan nama yang sama dengan yang ada di Gitlab, yaitu example-repo.

Jalankan perintah berikut untuk membuat repositori baru di CodeCommit dengan nama example-repo. Keluaran dari perintah tersebut akan disimpan dalam sebuah environment variable yang akan kita gunakan pada langkah selanjutnya.

export REPO_NAME=example-repo
export CODECOMMIT_ARN=$(aws codecommit create-repository --repository-name ${REPO_NAME} | jq -r '.repositoryMetadata.Arn')

Membuat IAM User dengan policy yang tepat

Langkah selanjutnya adalah membuat IAM user dengan policy yang memungkinkan Gitlab untuk melakukan sinkronisasi ke CodeCommit. Namun, sebelum membuat user dan policy, kita perlu membuat policy document. Policy document adalah berkas dengan format json yang mendefinisikan aksi (actions) apa saja yang dapat dilakukan terhadap resources di AWS. Pada tulisan ini, kita mendefinisikan aksi GitPush dan GitPull pada repositori CodeCommit yang kita buat di langkah sebelumnya.

Jalankan perintah berikut untuk menghasilkan policy document yang akan kita gunakan di langkah selanjutnya. Perintah berikut akan menghasilkan berkas policy.json.

cat << EOF > policy.json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "MinimumGitLabPushMirroringPermissions",
      "Action": [
        "codecommit:GitPush",
        "codecommit:GitPull"
      ],
      "Effect": "Allow",
      "Resource": "${CODECOMMIT_ARN}"
    }
  ]
}
EOF

Selanjutnya, kita perlu membuat IAM policy dengan menjalankan perintah berikut. Gunakan berkas policy.json yang sudah kita buat sebelumnya sebagai masukan untuk parameter policy-document.

export POLICY_ARN=$(aws iam create-policy --policy-name gitlab-to-codecommit --policy-document file://policy.json | jq -r '.Policy.Arn')

Setelah itu, kita perlu membuat user, dan menempelkan policy yang sudah kita buat sebelumnya. User yang kita beri nama gitlab ini akan digunakan untuk memberikan izin pada Gitlab agar dapat mengakses repositori kita di CodeCommit. Untuk membuat IAM user, jalankan perintah ini.

export IAM_USER=gitlab
aws iam create-user --user-name ${IAM_USER}
aws iam attach-user-policy --user-name ${IAM_USER} --policy-arn ${POLICY_ARN}

Satu hal terakhir sebelum kita dapat mengonfigurasi Gitlab adalah membuat kredensial git untuk CodeCommit. Kredensial git inilah yang akan kita berikan ke Gitlab agar ia dapat melakukan mirroring ke repositori yang baru di CodeCommit. Jalankan perintah berikut untuk mendapatkan username dan sandi yang akan kita masukkan ke Gitlab. Kita akan menyimpan keduanya di dalam environment variable GIT_USERNAME dan GIT_PASSWORD.

export GIT_CREDS=$(aws iam create-service-specific-credential --user-name ${IAM_USER} --service-name codecommit.amazonaws.com | jq -r '.ServiceSpecificCredential')
export GIT_USERNAME=$(jq -r '.ServiceUserName' <<< ${GIT_CREDS})
export GIT_PASSWORD=$(jq -r '.ServicePassword' <<< ${GIT_CREDS})

Mengonfigurasi Gitlab untuk melakukan push mirroring ke AWS CodeCommit

Kita perlu memasukkan git repository URL (yang mengandung username) dan sandi yang sudah didapatkan sebelumnya ke Gitlab. Jalankan perintah di bawah untuk mencetak keduanya pada layar.

# Git URL
echo "https://${GIT_USERNAME}@git-codecommit.ap-southeast-1.amazonaws.com/v1/repos/example-repo"

# Git Password
echo ${GIT_PASSWORD}

Sesuai pada gambar di bawah ini, pada Gitlab, buka proyek anda, lalu masuk ke Settings > Repository. Pilih Expand pada bagian Mirroring repositories, lalu masukkan URL pada kolom Git repository URL, sedangkan password pada kolom Password. Pastikan Mirror direction yang dipilih adalah Push, dan Authentication method yang dipilih adalah Password.

gitlab-mirrorring-repositories

Setelah kita berhasil mengonfigurasi Gitlab, maka URL CodeCommit akan ditampilkan pada bagian Mirrored repositories seperti pada gambar di bawah ini. Gitlab akan melakukan sinkronisasi ke CodeCommit ketika ada commit yang dilakukan, atau dengan melakukan force update (menekan tombol seperti yang tertera pada gambar di bawah). Kita mungkin perlu menunggu beberapa saat hingga Gitlab berhasil melakukan sinkronisasi ke CodeCommit.

mirrored-repositories

Pada langkah ini, kita sudah berhasil melakukan sinkronisasi repositori kita di Gitlab dengan repositori baru yang ada di CodeCommit. Terlihat pada gambar di bawah bahwa histori commit yang kita lakukan juga ikut dimigrasikan.

codecommit-gitlab-migration-commit-history

Mengubah git remote URL pada komputer lokal

Langkah terakhir adalah mengubah remote URL pada proyek di komputer lokal kita. Pada tulisan ini, nama remote URL kita adalah origin, sehingga perintah yang akan kita gunakan untuk melakukan pengubahan adalah sebagai berikut. Kita perlu menjalankan perintah ini dari direktori tempat proyek kita disimpan (sejajar dengan direktori .git).

git remote set-url origin "https://git-codecommit.ap-southeast-1.amazonaws.com/v1/repos/${REPO_NAME}"

Lalu, lakukan verifikasi untuk memastikan git remote URL kita sudah mengarah ke CodeCommit.

git remote -v
origin	https://git-codecommit.ap-southeast-1.amazonaws.com/v1/repos/example-repo (fetch)
origin	https://git-codecommit.ap-southeast-1.amazonaws.com/v1/repos/example-repo (push)

Menghapus resources (cleaning up)

Untuk menghindari timbulnya biaya di kemudian hari, kita akan menghapus resources yang sudah kita buat sebelumnya. Resources yang akan kita hapus yaitu CodeCommit repository, IAM policy, IAM user, dan kredensial git yang menempel pada user tersebut. Jalankan perintah di bawah ini untuk menghapus seluruhnya.

# Menghapus CodeCommit repository
aws codecommit delete-repository --repository-name ${REPO_NAME}

# Detach policy dan user
aws iam detach-user-policy --user-name ${IAM_USER} --policy-arn ${POLICY_ARN}

# Menghapus IAM policy
aws iam delete-policy --policy-arn ${POLICY_ARN}

# Perlu menghapus kredensial git sebelum menghapus IAM user
export CREDENTIALS_ID=$(jq -r '.ServiceSpecificCredentialId' <<< ${GIT_CREDS})
aws iam delete-service-specific-credential --user-name ${IAM_USER} --service-specific-credential-id ${CREDENTIALS_ID}

# Menghapus IAM user
aws iam delete-user --user-name ${IAM_USER}

Penutup dan integrasi dengan layanan AWS lainnya

Kita sudah berhasil melakukan migrasi dari Gitlab ke CodeCommit. Dengan melakukan migrasi ini, pengembang dapat dengan lebih mudah melakukan integrasi dengan layanan AWS lainnya. Misalnya,

  1. CodeCommit terintegrasi dengan IAM untuk melakukan autentikasi dan otorisasi, sehingga pengembang tidak perlu me-manage dua kredensial terpisah (i.e. kredensial git menggunakan kredensial IAM user).
  2. Pengembang dapat dengan mudah membangun CI/CD pipeline di AWS dengan mengintegrasikan CodeCommit, CodePipeline, CodeBuild, dan CodeDeploy.
  3. Pengembang juga bisa mengintegrasikan CodeCommit dengan CodeGuru untuk melakukan otomasi code review menggunakan alat berbasis machine learning.

Dengan metode migrasi ini, maka pengembang mempunyai dua pilihan dalam berkolaborasi menggunakan git.

  1. Pilihan pertama adalah beralih sepenuhnya ke CodeCommit, dan menonaktifkan (decomission) Gitlab.
  2. Pilihan kedua adalah menggunakan keduanya, dimana Gitlab berperan sebagai repositori utama yang melakukan sinkronisasi ke CodeCommit. Dengan demikian, CodeCommit dapat berperan sebagai point of integration dengan layanan AWS lainnya, seperti yang telah disebutkan sebelumnya.
Teddy Aryono

Teddy Aryono

Teddy Aryono is Specialist Solutions Architect, focusing on modern application development, at Amazon Web Services who work extensively with developers in various customer segments, ranging from Startups, Digital Native Businesses, and Enterprises, to accelerate their digital product development by adopting and leveraging AWS technologies. In his spare time, he loves to read, and tinkering with things.