Menjalankan OpenQA untuk Pengembangan BlankOn Linux

Menjalankan OpenQA untuk Pengembangan BlankOn Linux

Sabtu 12 Desember 2020, tim Jaminan Kualitas BlankOn mengadakan lokakarya tentang Jaminan Kualitas dengan narasumber pak Kukuh Syafaat (eks tim jaminan kualitas BlankOn). Di tengah presentasi, eh dapat tantangan dari narasumber untuk membawa openQA sebagai media pengujian otomatis untuk BlankOn. šŸ˜€

Sedikit tentang openQA

openQA merupakan perkakas otomasi pengujian khusus untuk sistem operasi. Perkakas ini dibuat oleh tim dari SUSE untuk menguji sistem operasi mereka, khususnya openSUSE. Saat ini, openQA sudah digunakan oleh tim pengembang Fedora dan EndlessOS untuk otomasi pengujian mereka. Dengan openQA, tim Jaminan Kualitas tinggal duduk diam meratapi nasib menonton log pengujian yang dilakukan oleh “worker” dalam antarmuka webUI nya šŸ˜€ , kalau kata openQA: “life is too short for manual testing!”

Berikut merupakan arsitektur dari openQA

arsitektur openQA

Ada 2 layanan utama yang ada dalam openQA, yaitu sisi end-user berupa antarmuka web dan sisi worker yang akan menjalankan task-task pengujian. Antarmuka web bisa dilihat contohnya seperti ini. Sedangkan worker berisi os-autoinst (aplikasi yang sebenarnya menjalankan otomasi pengujian) dan di belakang os-autoinst ini nanti akan menjalankan instance QEMU sebagai media pengujiannya.

Kita bisa memasang keseluruhan komponen di atas di dalam satu mesin (webUI dan worker di satu mesin). Atau kalau mau dipisah, kita bisa pisahin komponen webUI di mesin A sedangkan di mesin B hanya ada komponen worker saja. Komponen DB menggunakan POSTGRESQL, ini digunakan untuk menyimpan user yang dapat mengakses openQA dan konfigurasi-konfigurasi lain terkait instance openQA. Untuk webUI nya ini ada apache2 di depannya.

Otentikasi di dalam webUI menggunakan openID, jadi membutuhkan platform pihak ketiga seperti ipsilon.

Skrip test yang digunakan dalam os-autoinst ini menggunakan perl. Kata engineer mereka sih itu mudah, tapi setelah saya coba, ini cukup untuk bikin botak kepala xD . Banyak sekali mejik-mejik di dalamnya yang mesti digali lagi.

Memasang openQA

Kita bisa memasang openQA di beberapa distro, namun paling enak ya masang di atas openSUSE. Karena secara native paketnya tersedia di dalam repository openSUSE. Kalau memaksa di distro lain, berarti perlu bantuan container (docker).

note: Paket openQA ini ternyata sudah tersedia di openSUSE dan Fedora, untuk distro lain belum ngecek

openQA di openSUSE

# memasang openQA dan worker di satu mesin
~ $ sudo zypper in openQA-bootstrap openQA-worker
~ $ sudo /usr/share/openqa/script/openqa-bootstrap

Tunggu hingga proses instalasi selesai, lalu buka browser, kunjungi http://localhost

beres! sesimpel itu, kamvreet šŸ˜€

openQA di Arch Linux šŸ™‚

Karena di ArchLinux ndak ada openQA, ya sudah, saya pakai docker untuk jalanin instance nya. berikut langkahnya. (asumsi saya sudah pasang docker dan docker-compose).

Saya cari-cari image docker nya ternyata ndak updated di hub.docker.com, jadi saya putuskan untuk build docker image sendiri.

catatan lagi: ternyata opensuse punya docker registry sendiri buat openqa, ada di registry.opensuse.org

Tulisan ini merupakan hasil dokumentasi build openQA di lokal saya 12 Desember 2020 19:00 WIB. Karena openQA menerapkan sistem rolling release, sehingga paragraf ini cukup memberikan informasi.

~ $ mkdir blankonqa && cd blankonqa
# clone repository terlebih dahulu dari branch master
~/blankonqa $ git clone --depth 1 -b blankon https://github.com/BlankOn/openQA && cd openQA
~/blankonqa/openQA $ cd docker
# build images
~/blankonqa/openQA/docker $ docker build -t openqa_ui ./webui
~/blankonqa/openQA/docker $ docker build -t openqa_worker ./openqa_worker
~/blankonqa/openQA/docker $ docker build -f webui/Dockerfile-lb -t openqa_webui_lb ./webui
~/blankonqa/openQA/docker $ cp webui/docker-compose.yaml ~/blankonqa/main.yaml
~/blankonqa/openQA/docker $ cp -r openqa_data/data.template ~/blankonqa/data
~/blankonqa/openQA/docker $ cd ~/blankonqa
~/blankonqa $ nano main.yaml

sesuaikan isinya seperti di bawah ini. Di sini kita tidak menyertakan openqa_data karena kita akan melakukan bind mount dari host untuk persistence datanya,

version: '3.8'
services:

  scheduler:
    image: openqa_webui
    networks:
      - openqa
    volumes:
      - ./data/factory:/data/factory
      - ./data/tests:/data/tests
      - ./data/testresults:/data/testresults
      - ./data/conf:/data/conf
    environment:
      MODE: "scheduler"
      MOJO_LISTEN: "http://0.0.0.0:9529"
    depends_on:
      #- data
      - db
 
  websockets:
    image: openqa_webui
    networks:
      - openqa
    #ports:
      #- "9527:9527"  # worker connection
    volumes:
      - ./data/factory:/data/factory
      - ./data/tests:/data/tests
      - ./data/testresults:/data/testresults
      - ./data/conf:/data/conf
    environment:
      MODE: "websockets"
      MOJO_LISTEN: "http://0.0.0.0:9527"
    depends_on:
      - db
 
  gru:
    image: openqa_webui
    networks:
      - openqa
    volumes:
      - ./data/factory:/data/factory
      - ./data/tests:/data/tests
      - ./data/testresults:/data/testresults
      - ./data/conf:/data/conf
    environment:
      MODE: "gru"
    depends_on:
      - db
 
  livehandler:
    image: openqa_webui
    #ports:
      #- "9528:9528"  # handle live view
    volumes:
      - ./data/factory:/data/factory
      - ./data/tests:/data/tests
      - ./data/testresults:/data/testresults
      - ./data/conf:/data/conf
    environment:
      MODE: "livehandler"
      MOJO_LISTEN: "http://0.0.0.0:9528"
    depends_on:
      - db
 
  webui:
    image: openqa_webui
    volumes:
      - ./data/factory:/data/factory
      - ./data/tests:/data/tests
      - ./data/conf:/data/conf
      - ./data/testresults:/data/testresults
    environment:
      MODE: "webui"
      MOJO_LISTEN: "http://0.0.0.0:9526"
    depends_on:
      - db
    deploy:
      replicas: 1
 
  db:
    image: postgres:10-alpine
    restart: always
    environment:
      POSTGRES_PASSWORD: openqa
      POSTGRES_USER: openqa
      POSTGRES_DB: openqa
    volumes:
      - ./data/db:/var/lib/postgresql/data
 
  nginx:
    image: openqa_webui_lb
    restart: always
    ports:
      - "9530:80"
      #Uncomment for SSL access
      #- "443:443"
    environment:
      REPLICAS: 1
    #volumes:
      #If is needed to set a certificate for SSL
      #- cert.crt:/etc/ssl/certs/opeqa.crt
      #- cert.key:/etc/ssl/certs/opeqa.key

bikin satu file lagi buat composenya worker:

~/openqa-docker $ nano worker.yaml
# isikan seperti ini
version: "3.8"
services:
  worker:
    image: openqa_worker
    privileged: true
    volumes:
      - ./data/factory:/data/factory
      - ./data/tests:/data/tests
      - ./data/conf:/data/conf
      - ./data/testresults:/data/testresults
    depends_on:
      - nginx

ubah konfigurasi database:

# menghapus file yang menyebabkan container postgre tidak bisa jalan
~/blankonqa $ rm data/db/.gitignore

# setel konfigurasi database
~/blankonqa $ nano data/conf/database.ini

# sesuaikan dbname,user, dan password dengan POSTGRES_DB, POSTGRES_USER, dan POSTGRES_PASSWORD pada docker-compose.yml bagian db. 
# untuk host, samakan dengan nama service di docker-compose.yml
# atau jika menggunakan postgresql secara terpisah (di luar docker), sesuaikan host=db dan port=5432 dengan alamat host postgresql dan port yang digunakan

[production]
dsn = DBI:Pg:dbname=openqa;host=db;user=openqa;password=openqa;port=5432

[development]
dsn = DBI:Pg:dbname=openqa;host=db;user=openqa;password=openqa;port=5432

ubah konfigurasi webui:

~/blankonqa $ nano data/conf/openqa.ini
[global]
appname = BlankOnQA

## Authentication method to use for user management
[auth]
# method = Fake|OpenID
# untuk development gunakan Fake saja
method = OpenID

[logging]
#logging is to stderr (so systemd journal) by default
#if you use a file, remember the apparmor profile!
#file = /var/log/openqa
level = info
#sql_debug = true

## Configuration for OpenID auth method
[openid]
## base url for openid provider
#provider = https://www.opensuse.org/openid/user/
## enforce redirect back to https
httpsonly = 0

mari kita jalankan (tanpa worker dulu, soalnya ada yang perlu diatur sebelum worker bisa jalan)

~/blankonqa $ docker-compose -f main.yaml up
# pastikan semua bisa running

silakan akses http://localhost:9530.

Klik menu login, nanti langsung berubah jadi demo user.

Lalu klik demo user > pilih menu Manage API Keys > Klik Create

Catat Key dan Secret untuk mengatur worker biar bisa konek

Buka terminal lagi ( yang docker-compose -f main.yaml up jangan ditutup dulu ya)

~/blankonqa $ nano data/conf/client.conf
# isikan seperti dibawah ini. Untuk [nginx] adalah nama service di docker-compose. karena kita ngaksesnya lewat service nginx, maka yang dimasukkan adalah [nginx]

[localhost]
key = 07DF85D4F2562023
secret = 0DDF6E06DAD6B73A

[nginx]
key = 07DF85D4F2562023
secret = 0DDF6E06DAD6B73A

atur dulu berkas workers.conf untuk koneksi si worker:

~/blankonqa $ nano data/conf/workers.conf
# isikan seperti ini. Sekali lagi, nginx adalah nama service di docker-compose, jadi kita menggunakan nama service untuk discovery host nya.

[global]
BACKEND = qemu
HOST = http://nginx

Saatnya menjalankan si worker

~/blankonqa $ docker-compose -f main.yaml -f worker.yaml up worker
# cek di log ini, apakah worker sudah bisa konek dengan nginx balancer (http://nginx)

Silakan masuk ke web lagi, di demo user > pilih menu workers

worker sudah terdaftar di webui

kalau container id (lihat di docker ps, bagian container id dengan nama service blankonqa_worker_1) terdaftar di webui nya, berti worker sudah siap untuk menerima tugas.

Yeaaay!

Bersambung…

sumber: https://github.com/os-autoinst/openQA/tree/master/docker

update 13-12-2020, ternyata komponen docker dari repo upstream ada yang mesti dibenahi, karena tidak berjalan mulus ketika build dan jalanin servicenya lewat compose file.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s