Selain Gitlab SaaS yang biasa kita akses dari gitlab.com, kita membangun sebuah server Gitlab secara manual ataupun otomatis, salah satunya adalah menggunakan Ansible Playbook. Gitlab dapat di-install dengan beberapa metode seperti Docker dengan Docker Compose, Helm charts jika ingin berjalan di atas Kubernetes, Operator jika berjalan di atas OpenShift, hingga instalasi dari sourcecode untuk dapat berjalan di atas berbagai platform yang tidak didukung. Pada artikel kali ini saya akan menggunakan package official untuk distro Linux, dan sebagian besar proses akan dilakukan secara otomatis menggunakan Ansible.
Outset
Sekilas detail dari environment yang akan saya gunakan untuk instalasi Gitlab CE (Community Edition).
Arsitektur
Secara default Gitlab menyediakan semua komponen yang dibutuhkan dalam binary package nya, namun kita bisa juga menggunakan komponen eksternal jika dibutuhkan. Contohnya adalah database server dengan PostgreSQL, dan server LDAP yang akan diintegrasikan dengan server Gitlab. Dalam artikel ini, keseluruhan server yang saya punya adalah VM (Virtual Machine) dengan RHEL 7.7 Maipo.
Pada umumnya kita semestinya sudah mempersiapkan sebuah dedicated user dengan kemampuan sudoers pada tiap server yang akan kita manage. Dalam kasus kali ini, saya menggunakan user bernama ec2-user dan dapat diakses melalui ssh secara passwordless. Untuk sudo juga sudah dikonfigurasi agar tidak perlu menginput password.
Setup PostgreSQL Server
Untuk database yang akan digunakan oleh server Gitlab, harus dikonfigurasi sesuai dengan requirements yang telah ditentukan di dokumentasi berikut. Berikut ini adalah beberapa hal yang mungkin perlu dicatat.
User Service
Saya buat terlebih dahulu dedicated user untuk server appdb1.1238.internal yang akan kita gunakan khusus untuk mengakses service PostgreSQL.
Pada RHEL 7.7 atau CentOS 7.7 saya mendapati dependency dari package PostgreSQL yang tidak ada dalam official repository, yaitu llvm-toolset-7-clang di mana packge ini dapat kita dapatkan dari package SCLo RH repository bernama centos-release-scl-rh seperti berikut.
Saya akan menggunakan Free IPA untuk server LDAP. Lalu karena saya tidak mempunyai DNS, maka cukup dengan menambahkan baris konfigurasi pada /etc/hosts di server app1.1238.internal seperti berikut.
Host File
1
echo"192.168.0.7 app1.1238.internal"| sudo tee -a /etc/hosts
Pastikan juga hostname server sudah sesuai.
1
sudo hostnamectl set-hostname app1.1238.internal
Install Packages
Kemudian install package yang dibutuhkan
1
sudo yum install -y ipa-server
Configure FreeIPA
Pertama jalankan command berikut untuk menginisiasi service FreeIPA.
1
sudo ipa-server-install
Akan muncul beberapa pertanyaan, kurang lebih seperti berikut.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[ec2-user@app1 ~]$ sudo ipa-server-install
Do you want to configure integrated DNS (BIND)? [no]: no
Server host name [app1.1238.internal]: app1.1238.internal
Please confirm the domain name [1238.internal]: 1238.internal
Please provide a realm name [1238.INTERNAL]: 1238.INTERNAL
Directory Manager password: rahasiabanget
Password (confirm): rahasiabanget
IPA admin password: rahasiabanget
Password (confirm): rahasiabanget
Continue to configure the system with these values? [no]: yes
Done.
Client hostname: app1.1238.internal
Realm: 1238.INTERNAL
DNS Domain: 1238.internal
IPA Server: app1.1238.internal
BaseDN: dc=1238,dc=internal
Jika kita mempunyai service firewall yang berjalan pada server ini, maka ijinkan beberapa port terkait service LDAP. Dibawah ini jika kita menggunakan firewalld untuk mengelola firewall.
Aktifkan juga modul pam_oddjob_mkhomedir agar home directory terbuat otomatis.
1
sudo authconfig --enablemkhomedir --update
Create LDAP User
Kita akan mencoba membuat sebuah user LDAP, namun pertama kita perlu mendapatkan ticket Kerberos untuk dapat mengoperasikan command ipa seperti berikut.
1
kinit admin
Masukkan password yang sebelumnya telah kita setup, kemudian kita bisa membuat user baru.
[ec2-user@app1 ~]$ ssh trianwar@localhost
The authenticity of host 'localhost (<no hostip for proxy command>)' can't be established.
ECDSA key fingerprint is SHA256:ky80bwa7by4uqlsVOIV08mVwhsCVcBYPuJpOyaxscNo.
ECDSA key fingerprint is MD5:b6:d0:f1:22:ed:12:15:10:6d:63:65:d2:1f:c1:c5:88.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Password: rahasiabanget
Password expired. Change your password now.
Current Password: rahasiabanget
New password: rahasiabanget
Retype new password: rahasiabanget
Creating home directory for trianwar.
[trianwar@app1 ~]$
Biasanya pada login pertama, kita akan dipaksa untuk mengganti password. Namun kita dapat memasukkan password lama agar tidak terganti.
Setup GitLab
Akhirnya kita telah sampai pada bagian ini, pertama kita perlu mempersiapkan certificate untuk service GitLab server. Sebenarnya playbook Ansible bisa membuatnya secara otomatis saat dijalankan, namun kali ini saya ingin membuatnya secara mandiri. Perlu diperhatikan bahwa sekarang saya sedang berada pada server frontend1.1238.internal yang akan menjadi server GitLab.
Prepare Self-signed Certificate
Saya menggunakan easy-rsa untuk membuat certificate.
Akan muncul beberapa tampilan berikut, masukkan saja informasi yang diperlukan seperti domain name yang akan dipakai untuk mengakses GitLab dan password untuk certificate.
1
2
3
4
5
6
[ec2-user@frontend1 ~/easy-rsa]$ ./easyrsa build-ca
Common Name (eg: your user, host, or server name) [Easy-RSA CA]: frontend1.1238.internal
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/home/ec2-user/easy-rsa/pki/ca.crt
Salin file yang berhasil di-generate untuk digunakan.
Clone Playbook dari repository Git yang sudah saya siapkan.
1
2
3
cd ~
git clone https://github.com/anwareset/ansible-gitlab-setup.git
cd ansible-gitlab-setup
Playbook ini sebenarnya adalah Roles yang awalnya dibuat oleh geerlingguy, kita dapat menggunakannya dalam bentuk Roles. Tapi saya memodifikasi sedikit sesuai kebutuhan saya. Kurang lebih struktur Playbook yang akan kita gunakan.
Edit file vars/main.yml dan sesuaikan dengan beberapa server yang telah kita konfigurasi sebelumnya (LDAP dan PostgreSQL), jangan lupa untuk merubah opsi certificate. Kurang lebihnya seperti berikut.
Untuk durasi dari proses setup sangat variatif tergantung dari spesifikasi dan koneksi yang dimiliki oleh server. Jika berhasil, kita dapat melakukan pengecekan seperti berikut.
Coba buka domain yang kita gunakan untuk server Gitlab pada web browser. Jika berhasil maka kurang lebih akan seperti berikut. Coba untuk login menggunakan user LDAP yang telah kita buat sebelumnya.
Reset Root Password
Sedangkan untuk password user root kita perlu melakukan reset terlebih dahulu menggunakan Rake task.
1
sudo gitlab-rake "gitlab:password:reset"
Setup GitLab Runner
Selanjutnya kita akan menggunakan Playbook lain untuk registrasi Gitlab Runner.
1
2
3
cd ~
git clone https://github.com/anwareset/ansible-gitlab-runner-setup.git
cd ansible-gitlab-runner-setup
Dan karena server Gitlab tadi menggunakan self-signed certificate, maka kita perlu menyalinnya ke tempat yang bisa dijangkau oleh VM Gitlab Runner.
Dapatkan registration token dari Gitlab server di web browser.
Edit file vars/main.yml sesuaikan beberapa variabel seperti domain server Gitlab dan registration token.
1
2
3
4
5
6
7
8
9
# GitLab coordinator URLgitlab_runner_coordinator_url:'https://frontend1.1238.internal/'# GitLab registration tokengitlab_runner_registration_token:'JhgmzZqths-gLPSH_kKx'# A list of runners to register and configuregitlab_runner_runners:state:presentexecutor:'docker'tls_ca_file:"/etc/ssl/private/frontend1.1238.internal.pem"
Jika sudah langsung saja kita run dengan command seperti berikut.