PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengotomatiskan Tugas Harian PostgreSQL Menggunakan Jenkins

Blog ini adalah presentasi singkat tentang Jenkins dan menunjukkan cara menggunakan alat ini untuk membantu beberapa tugas administrasi &manajemen PostgreSQL harian Anda.

Tentang Jenkins

Jenkins adalah perangkat lunak open source untuk otomatisasi. Ini dikembangkan di java dan merupakan salah satu alat paling populer untuk Continuous Integration (CI) dan Continuous Delivery (CD).

Pada tahun 2010, setelah akuisisi Sun Microsystems oleh Oracle, perangkat lunak "Hudson" berselisih dengan komunitas open source-nya. Perselisihan ini menjadi dasar peluncuran proyek Jenkins.

Saat ini, "Hudson" (lisensi publik Eclipse) dan "Jenkins" (lisensi MIT) adalah dua proyek aktif dan independen dengan tujuan yang sangat mirip.

Jenkins memiliki ribuan plugin yang dapat Anda gunakan untuk mempercepat fase pengembangan melalui otomatisasi untuk seluruh siklus hidup pengembangan; membangun, mendokumentasikan, menguji, mengemas, tahapan, dan penerapan.

Apa yang Jenkins Lakukan?

Meskipun penggunaan utama Jenkins dapat berupa Continuous Integration (CI) dan Continuous Delivery (CD), open source ini memiliki serangkaian fungsi dan dapat digunakan tanpa komitmen atau ketergantungan dari CI atau CD, oleh karena itu Jenkins menghadirkan beberapa fungsi menarik untuk jelajahi:

  • Menjadwalkan tugas periode (alih-alih menggunakan crontab tradisional) )
  • Memantau tugas, log, dan aktivitasnya dengan tampilan bersih (karena memiliki opsi untuk pengelompokan)
  • Pemeliharaan pekerjaan dapat dilakukan dengan mudah; dengan asumsi Jenkins memiliki serangkaian opsi untuk itu
  • Menyiapkan dan menjadwalkan penginstalan perangkat lunak (dengan menggunakan Wayang) di host yang sama atau di host lain.
  • Menerbitkan laporan dan mengirim pemberitahuan email

Menjalankan Tugas PostgreSQL di Jenkins

Ada tiga tugas umum yang harus dilakukan pengembang PostgreSQL atau administrator basis data setiap hari:

  1. Penjadwalan dan eksekusi skrip PostgreSQL
  2. Menjalankan proses PostgreSQL yang terdiri dari tiga skrip atau lebih
  3. Integrasi Berkelanjutan (CI) untuk pengembangan PL/pgSQL

Untuk pelaksanaan contoh-contoh ini, diasumsikan bahwa server Jenkins dan PostgreSQL (setidaknya versi 9.5) telah diinstal dan berfungsi dengan baik.

Penjadwalan dan Eksekusi Skrip PostgreSQL

Dalam kebanyakan kasus implementasi skrip PostgreSQL harian (atau berkala) untuk pelaksanaan tugas biasa seperti...

  • Pembuatan cadangan
  • Uji pemulihan cadangan
  • Eksekusi kueri untuk tujuan pelaporan
  • Membersihkan dan mengarsipkan file log
  • Memanggil prosedur PL/pgSQL untuk membersihkan tabel

t didefinisikan di crontab :

0 5,17 * * * /filesystem/scripts/archive_logs.sh
0 2 * * * /db/scripts/db_backup.sh
0 6 * * * /db/data/scripts/backup_client_tables.sh
0 4 * * * /db/scripts/Test_db_restore.sh
*/10 * * * * /db/scripts/monitor.sh
0 4 * * * /db/data/scripts/queries.sh
0 4 * * * /db/scripts/data_extraction.sh
0 5 * * * /db/scripts/data_import.sh
0 */4 * * * /db/data/scripts/report.sh

Sebagai crontab bukan alat ramah pengguna terbaik untuk mengelola penjadwalan semacam ini, itu dapat dilakukan di Jenkins dengan keuntungan berikut...

  • Antarmuka yang sangat ramah untuk memantau kemajuan dan status mereka saat ini
  • Log segera tersedia dan tidak memerlukan hibah khusus untuk mengaksesnya
  • Pekerjaan dapat dijalankan secara manual di Jenkins alih-alih memiliki penjadwalan
  • Untuk beberapa jenis pekerjaan, tidak perlu mendefinisikan pengguna dan kata sandi dalam file teks biasa karena Jenkins melakukannya dengan cara yang aman
  • Pekerjaan dapat didefinisikan sebagai eksekusi API

Jadi, ini bisa menjadi solusi yang baik untuk memigrasikan pekerjaan yang terkait dengan tugas PostgreSQL ke Jenkins alih-alih crontab.

Di sisi lain, sebagian besar administrator dan pengembang basis data memiliki keterampilan yang kuat dalam bahasa skrip dan akan mudah bagi mereka untuk mengembangkan antarmuka kecil untuk menangani skrip ini untuk menerapkan proses otomatis dengan tujuan meningkatkan tugas mereka. Tapi ingat, Jenkins kemungkinan besar sudah memiliki serangkaian fungsi untuk melakukannya dan fungsi ini dapat mempermudah hidup developer yang memilih untuk menggunakannya.

Jadi, untuk menentukan eksekusi skrip, Anda perlu membuat pekerjaan baru, dengan memilih opsi “Item Baru”.

Gambar 1 – "Item Baru" untuk menentukan tugas untuk mengeksekusi skrip PostgreSQL

Kemudian, setelah menamainya, pilih jenis “Proyek FreeStyle” dan klik OK.

Gambar 2 – Pemilihan jenis pekerjaan (item)

Untuk menyelesaikan pembuatan job baru ini, pada bagian “Build” harus dipilih opsi “Execute script” dan pada kotak command line path dan parameterisasi script yang akan dijalankan:

Gambar 3 – Spesifikasi perintah yang akan dieksekusi

Untuk jenis pekerjaan ini, disarankan untuk memverifikasi izin skrip, karena setidaknya eksekusi untuk grup tempat file tersebut dan untuk semua orang harus ditetapkan.

Dalam contoh ini, skrip query.sh telah membaca dan mengeksekusi izin untuk semua orang, membaca dan menjalankan izin untuk grup dan membaca menulis dan mengeksekusi untuk pengguna:

[email protected]:~/db/scripts$ ls -l query.sh
-rwxr-xr-x 1 slonik slonik 365 May 11 20:01 query.sh
[email protected]:~/db/scripts$ 

Skrip ini memiliki serangkaian pernyataan yang sangat sederhana, pada dasarnya hanya memanggil utilitas psql untuk menjalankan kueri:

#!/bin/bash

/usr/lib/postgresql/10/bin/psql -U report -d db_deploy -c "select * from appl" > /home/slonik/db/scripts/appl.dat
 
/usr/lib/postgresql/10/bin/psql -U report -d db_deploy -c "select * from appl_users" > /home/slonik/db/scripts/appl_user.dat
 
/usr/lib/postgresql/10/bin/psql -U report -d db_deploy -c "select * from appl_rights" > /home/slonik/db/scripts/appl_rights.dat

Mengeksekusi Proses PostgreSQL yang Terdiri dari Tiga Skrip atau Lebih

Dalam contoh ini, saya akan menjelaskan apa yang Anda butuhkan untuk menjalankan tiga skrip berbeda untuk menyembunyikan data sensitif dan untuk itu, kami akan mengikuti langkah-langkah di bawah ini...

  • Impor data dari file
  • Siapkan data yang akan disamarkan
  • Cadangan database dengan data tertutup

Jadi, untuk menentukan pekerjaan baru ini perlu memilih opsi "Item Baru" di halaman utama Jenkins dan kemudian, setelah menetapkan nama, opsi "Pipa" harus dipilih:

Gambar 5 - Item saluran pipa di Jenkins

Setelah pekerjaan disimpan di bagian “Pipeline”, pada tab “Advanced project options”, kolom “Definition” harus disetel ke “Pipeline script”, seperti yang ditunjukkan di bawah ini:

Gambar 6 - Script Groovy di bagian pipeline

Seperti yang saya sebutkan di awal bab, skrip Groovy yang digunakan terdiri dari tiga tahap, artinya tiga bagian (tahapan) yang berbeda, seperti yang disajikan dalam skrip berikut:

def dir_live1='/data/ftp/server1'
def dir_live2='/data/ftp/server2'

pipeline{
    agent any
    stages
    {
      stage('Import data from files'){
          steps{
              echo "Import data from ${dir_live1} ..."
              sh script :"/home/slonik/db/scripts/import_data_from_files.sh ${dir_live1}"
              echo "Import data from $dir_live2 ..."
              sh script :"/home/slonik/db/scripts/import_data_from_files.sh ${dir_live2}"
          }
      }
      stage('Prepare data to be masked'){
          steps{
              echo "Purge data ..."
              sh script :"/home/slonik/db/scripts/purge_data.sh"
              echo "Mask data ..."
              sh script :"/home/slonik/db/scripts/mask_data.sh"
          }
      }
     stage('Backup of database with data masked'){
          steps{
              echo "Backup database after masking ..."
              sh script :"/home/slonik/db/scripts/backup_db.sh"
          }
      } 
        
    }
}

Groovy adalah bahasa pemrograman berorientasi objek yang kompatibel dengan sintaks Java untuk platform Java. Ini adalah bahasa statis dan dinamis dengan fitur yang mirip dengan Python, Ruby, Perl, dan Smalltalk.

Sangat mudah untuk dipahami karena skrip semacam ini didasarkan pada beberapa pernyataan…

Panggung

Berarti 3 proses yang akan dijalankan :“Import data from files”, “Prepare data to be mask”

dan “Cadangan database dengan data yang disembunyikan”.

Langkah

Sebuah "langkah" (sering disebut "langkah pembangunan") adalah tugas tunggal yang merupakan bagian dari urutan. Setiap tahap dapat terdiri dari beberapa langkah. Dalam contoh ini, tahap pertama memiliki dua langkah.

sh script :"/home/slonik/db/scripts/import_data_from_files.sh '/data/ftp/server1'

sh script :"/home/slonik/db/scripts/import_data_from_files.sh '/data/ftp/server2'

Data sedang diimpor dari dua sumber berbeda.

Pada contoh sebelumnya, penting untuk dicatat bahwa ada dua variabel yang didefinisikan di awal dan dengan cakupan global:

dir_live1
dir_live2

Skrip yang digunakan dalam tiga langkah ini memanggil psql , pg_restore dan pg_dump utilitas.

Setelah pekerjaan ditentukan, saatnya untuk menjalankannya dan untuk itu, Anda hanya perlu mengklik opsi “Build Now”:

Gambar 7 – Pekerjaan eksekusi

Setelah pembangunan dimulai, Anda dapat memverifikasi kemajuannya.

Gambar 8 – Memulai “Build”

Plugin Pipeline Stage View menyertakan visualisasi yang diperluas dari riwayat pembuatan Pipeline pada halaman indeks proyek aliran di bawah Stage View. Tampilan ini dibuat segera setelah tugas selesai dan setiap tugas diwakili oleh kolom dari kiri ke kanan dan memungkinkan untuk melihat dan membandingkan waktu yang telah berlalu untuk eksekusi serval (dikenal sebagai Build in Jenkins).

Setelah eksekusi (juga disebut Build) selesai, Anda dapat memperoleh detail tambahan dengan mengklik utas yang telah selesai (kotak merah).

Gambar 9 – Memulai “Build”

dan kemudian di opsi "Output Konsol".

Gambar 10 – Keluaran konsol

Tampilan sebelumnya adalah utilitas ekstrim karena memungkinkan untuk memiliki persepsi tentang runtime yang diperlukan dari setiap tahap.

Pipelines, juga dikenal sebagai alur kerja, adalah plugin yang memungkinkan definisi siklus hidup aplikasi dan merupakan fungsi yang digunakan di Jenkins untuk Pengiriman berkelanjutan (CD).vPlugin ini dibuat dengan persyaratan untuk kemampuan alur kerja CD yang fleksibel, dapat diperluas, dan berbasis skrip dalam pikiran.

Contoh ini adalah untuk menyembunyikan data sensitif tetapi pasti ada banyak contoh lain setiap hari dari administrator database PostgreSQL yang dapat dieksekusi pada pekerjaan pipeline.

Pipeline telah tersedia di Jenkins sejak versi 2.0 dan ini adalah solusi yang luar biasa!

Integrasi Berkelanjutan (CI) untuk Pengembangan PL/pgSQL

Integrasi berkelanjutan untuk pengembangan basis data tidak semudah dalam bahasa pemrograman lain karena data yang dapat hilang, sehingga tidak mudah untuk menjaga basis data dalam kendali sumber dan menyebarkannya di server khusus terutama jika ada skrip yang berisi pernyataan DDL (Data Definition Language) dan DML (Data Manipulation Language). Ini karena jenis pernyataan ini mengubah status database saat ini dan tidak seperti bahasa pemrograman lain, tidak ada kode sumber untuk dikompilasi.

Di sisi lain, ada satu set pernyataan database yang memungkinkan integrasi berkelanjutan seperti bahasa pemrograman lainnya.

Contoh ini hanya didasarkan pada pengembangan prosedur dan itu akan menggambarkan pemicu serangkaian tes (ditulis dengan Python) oleh Jenkins setelah skrip PostgreSQL, yang menyimpan kode fungsi berikut, dikomit dalam repositori kode.

Gambar 11 – Fungsi PLpg/SQL

Fungsi-fungsi ini sederhana dan isinya hanya memiliki sedikit logika atau kueri di PLpg/SQL atau plperlu bahasa sebagai fungsi f_IsValidEmail :

CREATE OR REPLACE FUNCTION f_IsValidEmail(email text) RETURNS bool
LANGUAGE plperlu
AS $$
use Email::Address;
my @addresses = Email::Address->parse($_[0]);
return scalar(@addresses) > 0 ? 1 : 0;
$$;

Semua fungsi yang disajikan di sini tidak bergantung satu sama lain, dan kemudian tidak ada yang didahulukan baik dalam pengembangannya maupun dalam penerapannya. Selain itu, karena akan diverifikasi terlebih dahulu, tidak ada ketergantungan pada validasinya.

Jadi, untuk menjalankan satu set skrip validasi setelah komit dilakukan di repositori kode, perlu pembuatan tugas build (item baru) di Jenkins:

Gambar 12 – Proyek "Gaya Bebas" untuk Integrasi Berkelanjutan

Pekerjaan build baru ini harus dibuat sebagai proyek "Gaya Bebas" dan di bagian "Repositori kode sumber" harus ditentukan URL repositori dan kredensialnya (kotak oranye):

Gambar 13 – Repositori kode sumber

Di bagian "Build Triggers", opsi "GitHub hook trigger for GITScm polling" harus dicentang:

Gambar 14 – Bagian “Build triggers”

Terakhir, di bagian "Build", opsi "Execute Shell" harus dipilih dan di kotak perintah skrip yang akan melakukan validasi fungsi yang dikembangkan:

Gambar 15 – bagian “Build environment”

Tujuannya adalah untuk memiliki satu skrip validasi untuk setiap fungsi yang dikembangkan.

Skrip Python ini memiliki serangkaian pernyataan sederhana yang akan memanggil prosedur ini dari database dengan beberapa hasil yang diharapkan yang telah ditentukan sebelumnya:

#!/usr/bin/python
import psycopg2

con = psycopg2.connect(database="db_deploy", user="postgres", password="postgres10", host="localhost", port="5432")
cur = con.cursor() 

email_list = { '[email protected]' : True,
                       'tintinmail.com'   :  False,
                       '[email protected]'   : False,
                       'director#mail.com': False,
                       '[email protected]'   : True
                     }
result_msg= "f_IsValidEmail -> OK"

for key in email_list:
  cur.callproc('f_IsValidEmail', (key,))
  row = cur.fetchone()
  if email_list[key]!=row[0]:
    result_msg= "f_IsValidEmail -> Nok"

print result_msg

cur.close()
con.close()

Skrip ini akan menguji PLpg/SQL . yang disajikan atau plperlu fungsi dan itu akan dieksekusi setelah setiap komit dalam repositori kode untuk menghindari regresi pada perkembangan.

Setelah build pekerjaan ini dijalankan, eksekusi log dapat diverifikasi.

Gambar 16 – “Output Konsol”

Opsi ini menampilkan status akhir:SUCCESS atau FAILURE, ruang kerja, file/skrip yang dieksekusi, file sementara yang dibuat, dan pesan kesalahan (untuk yang gagal)!

Kesimpulan

Singkatnya, Jenkins dikenal sebagai alat yang hebat untuk Integrasi Berkelanjutan (CI) dan Pengiriman Berkelanjutan (CD), namun dapat digunakan untuk berbagai fungsi seperti,

  • Menjadwalkan tugas
  • Eksekusi skrip
  • Proses Pemantauan

Untuk semua tujuan ini pada setiap eksekusi (Build on Jenkins kosakata) dapat dianalisis log dan waktu yang telah berlalu.

Karena banyaknya plugin yang tersedia, itu dapat menghindari beberapa pengembangan dengan tujuan tertentu, mungkin ada plugin yang melakukan persis apa yang Anda cari, itu hanya masalah mencari di pusat pembaruan atau Kelola Jenkins>> Kelola Plugin di dalamnya aplikasi web.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Baru Di PostgreSQL 12:Kolom yang Dihasilkan

  2. Buang bagian milidetik dari stempel waktu

  3. Cara Memeriksa Versi PostgreSQL Anda

  4. MySQL vs PostgreSQL untuk Aplikasi Web

  5. Apakah ada operator TERTUTUP postgres?