Blog này là một bản trình bày ngắn gọn về Jenkins và chỉ cho bạn cách sử dụng công cụ này để trợ giúp một số công việc quản lý và điều hành PostgreSQL hàng ngày của bạn.
Giới thiệu về Jenkins
Jenkins là một phần mềm mã nguồn mở để tự động hóa. Nó được phát triển trong java và là một trong những công cụ phổ biến nhất để Tích hợp liên tục (CI) và Phân phối liên tục (CD).
Năm 2010, sau khi Oracle mua lại Sun Microsystems, phần mềm "Hudson" đã gặp tranh chấp với cộng đồng mã nguồn mở của nó. Tranh chấp này đã trở thành cơ sở cho việc khởi động dự án Jenkins.
Ngày nay, "Hudson" (giấy phép công khai Eclipse) và "Jenkins" (giấy phép MIT) là hai dự án hoạt động và độc lập với mục đích rất giống nhau.
Jenkins có hàng nghìn plugin bạn có thể sử dụng để tăng tốc giai đoạn phát triển thông qua tự động hóa trong toàn bộ vòng đời phát triển; xây dựng, lập tài liệu, kiểm tra, đóng gói, giai đoạn và triển khai.
Jenkins làm gì?
Mặc dù mục đích sử dụng chính của Jenkins có thể là Tích hợp liên tục (CI) và Phân phối liên tục (CD), mã nguồn mở này có một tập hợp các chức năng và nó có thể được sử dụng mà không cần bất kỳ cam kết hoặc phụ thuộc nào từ CI hoặc CD, do đó Jenkins trình bày một số chức năng thú vị để khám phá:
- Lập lịch công việc theo khoảng thời gian (thay vì sử dụng crontab truyền thống )
- Theo dõi công việc, nhật ký và hoạt động của nó bằng một chế độ xem sạch sẽ (vì chúng có tùy chọn để nhóm)
- Việc bảo trì các công việc có thể được thực hiện dễ dàng; giả sử Jenkins có một tập hợp các tùy chọn cho nó
- Thiết lập và lên lịch cài đặt phần mềm (bằng cách sử dụng Puppet) trong cùng một máy chủ hoặc trong một máy chủ khác.
- Xuất bản báo cáo và gửi thông báo qua email
Chạy các tác vụ PostgreSQL trong Jenkins
Có ba nhiệm vụ phổ biến mà nhà phát triển PostgreSQL hoặc quản trị viên cơ sở dữ liệu phải làm hàng ngày:
- Lập lịch và thực thi các tập lệnh PostgreSQL
- Thực thi một quy trình PostgreSQL bao gồm ba hoặc nhiều tập lệnh
- Tích hợp liên tục (CI) để phát triển PL / pgSQL
Để thực hiện các ví dụ này, giả định rằng máy chủ Jenkins và PostgreSQL (ít nhất là phiên bản 9.5) đã được cài đặt và hoạt động bình thường.
Lập lịch và Thực thi Tập lệnh PostgreSQL
Trong hầu hết các trường hợp, việc triển khai các tập lệnh PostgreSQL hàng ngày (hoặc định kỳ) để thực hiện một tác vụ thông thường như ...
- Tạo bản sao lưu
- Kiểm tra khôi phục bản sao lưu
- Thực hiện một truy vấn cho mục đích báo cáo
- Dọn dẹp và lưu trữ các tệp nhật ký
- Gọi một thủ tục PL / pgSQL để xóa các bảng
t được định nghĩa trên 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
Là crontab không phải là công cụ thân thiện với người dùng tốt nhất để quản lý kiểu lập lịch này, nó có thể được thực hiện trên Jenkins với những ưu điểm sau ...
- Giao diện rất thân thiện để theo dõi tiến trình và trạng thái hiện tại của họ
- Nhật ký có sẵn ngay lập tức và không cần bất kỳ khoản tài trợ đặc biệt nào để truy cập chúng
- Thay vào đó, công việc có thể được thực hiện theo cách thủ công trên Jenkins để có một lịch trình
- Đối với một số loại công việc, không cần xác định người dùng và mật khẩu trong các tệp văn bản thuần túy vì Jenkins thực hiện điều đó một cách an toàn
- Các công việc có thể được định nghĩa là một thực thi API
Vì vậy, có thể là một giải pháp tốt để chuyển các công việc liên quan đến các tác vụ PostgreSQL sang Jenkins thay vì crontab.
Mặt khác, hầu hết các quản trị viên và nhà phát triển cơ sở dữ liệu đều có kỹ năng vững vàng về ngôn ngữ kịch bản và họ sẽ dễ dàng phát triển các giao diện nhỏ để xử lý các tập lệnh này nhằm thực hiện các quy trình tự động với mục tiêu cải thiện nhiệm vụ của họ. Nhưng hãy nhớ rằng Jenkins rất có thể đã có một bộ chức năng để làm việc đó và những chức năng này có thể giúp các nhà phát triển chọn sử dụng chúng dễ dàng hơn.
Do đó, để xác định việc thực thi tập lệnh, bạn cần tạo một công việc mới, hãy chọn tùy chọn "Mục mới".
Hình 1 - "Mục mới" để xác định công việc để thực thi tập lệnh PostgreSQLSau đó, sau khi đặt tên cho nó, hãy chọn loại “FreeStyle project” và nhấp vào OK.
Hình 2 - Lựa chọn loại (mục) công việcĐể kết thúc việc tạo công việc mới này, trong phần “Xây dựng” phải được chọn tùy chọn “Thực thi tập lệnh” và trong hộp dòng lệnh, đường dẫn và tham số của tập lệnh sẽ được thực thi:
Hình 3 - Đặc tả của lệnh để thực thiĐối với loại công việc này, bạn nên xác minh quyền của tập lệnh, vì ít nhất việc thực thi cho nhóm mà tệp thuộc về và cho mọi người phải được thiết lập.
Trong ví dụ này, tập lệnh query.sh có quyền đọc và thực thi cho mọi người, đọc và thực thi quyền cho nhóm và đọc ghi và thực thi cho người dùng:
[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$
Tập lệnh này có một tập hợp các câu lệnh rất đơn giản, về cơ bản chỉ các lệnh gọi tới psql tiện ích để thực hiện các truy vấn:
#!/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
Thực thi một quy trình PostgreSQL bao gồm ba hoặc nhiều tập lệnh
Trong ví dụ này, tôi sẽ mô tả những gì bạn cần để thực thi ba tập lệnh khác nhau để ẩn dữ liệu nhạy cảm và đối với điều đó, chúng tôi sẽ làm theo các bước dưới đây ...
- Nhập dữ liệu từ các tệp
- Chuẩn bị dữ liệu được che giấu
- Sao lưu cơ sở dữ liệu với dữ liệu được che giấu
Vì vậy, để xác định công việc mới này, cần phải chọn tùy chọn “Mục mới” trong trang chính của Jenkins và sau đó, sau khi chỉ định tên, tùy chọn “Đường ống” phải được chọn:
Hình 5 - Mục đường ống trong JenkinsSau khi công việc được lưu trong phần “Đường ống”, trên tab “Tùy chọn dự án nâng cao”, trường “Định nghĩa” phải được đặt thành “Tập lệnh đường ống”, như được hiển thị bên dưới:
Hình 6 - Tập lệnh Groovy trong phần đường dẫnNhư tôi đã đề cập ở đầu chương, kịch bản Groovy được sử dụng, nó được soạn bởi ba giai đoạn, nó có nghĩa là ba phần (giai đoạn) riêng biệt, như được trình bày trong kịch bản sau:
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 là một ngôn ngữ lập trình hướng đối tượng tương thích với cú pháp Java cho nền tảng Java. Nó là cả một ngôn ngữ tĩnh và động với các tính năng tương tự như ngôn ngữ của Python, Ruby, Perl và Smalltalk.
Rất dễ hiểu vì loại tập lệnh này dựa trên một vài câu lệnh…
Giai đoạn
Có nghĩa là 3 quy trình sẽ được thực thi:“Nhập dữ liệu từ tệp”, “Chuẩn bị dữ liệu được che”
và “Sao lưu cơ sở dữ liệu với mặt nạ dữ liệu”.
Bước
“Bước” (thường được gọi là “bước xây dựng”) là một nhiệm vụ đơn lẻ là một phần của trình tự. Mỗi giai đoạn có thể bao gồm một số bước. Trong ví dụ này, giai đoạn đầu tiên có hai bước.
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'
Dữ liệu đang được nhập từ hai nguồn riêng biệt.
Trong ví dụ trước, điều quan trọng cần lưu ý là có hai biến được xác định ở đầu và với phạm vi toàn cầu:
dir_live1
dir_live2
Các tập lệnh được sử dụng trong ba bước này đang gọi psql , pg_restore và pg_dump tiện ích.
Sau khi công việc được xác định, đã đến lúc thực hiện nó và để thực hiện công việc đó, bạn chỉ cần nhấp vào tùy chọn “Xây dựng ngay bây giờ”:
Hình 7 - Công việc thực thiSau khi quá trình xây dựng bắt đầu, có thể xác minh tiến trình của nó.
Hình 8 - Bắt đầu “Xây dựng”Plugin Pipeline Stage View bao gồm hình ảnh trực quan mở rộng về lịch sử xây dựng Pipeline trên trang chỉ mục của dự án dòng trong Chế độ xem theo giai đoạn. Chế độ xem này được tạo ngay sau khi các tác vụ được hoàn thành và mỗi tác vụ được biểu thị bằng cột từ trái sang phải và có thể xem và so sánh thời gian đã trôi qua cho các lần thực thi serval (được gọi là Bản dựng trong Jenkins).
Sau khi quá trình thực thi (còn được gọi là Bản dựng) kết thúc, bạn có thể nhận thêm thông tin chi tiết bằng cách nhấp vào chuỗi đã hoàn thành (hộp màu đỏ).
Hình 9 - Bắt đầu “Xây dựng”và sau đó trong tùy chọn “Đầu ra bảng điều khiển”.
Hình 10 - Đầu ra của bảng điều khiểnCác chế độ xem trước là cực kỳ tiện ích vì chúng cho phép nhận thức về thời gian chạy cần thiết của mỗi giai đoạn.
Pipelines, còn được gọi là quy trình làm việc, đó là một plugin cho phép xác định vòng đời ứng dụng và đó là một chức năng được sử dụng trong Jenkins để phân phối liên tục (CD). V Plugin này được xây dựng với các yêu cầu về khả năng quy trình làm việc của CD linh hoạt, có thể mở rộng và dựa trên tập lệnh trong tâm trí.
Ví dụ này là để ẩn dữ liệu nhạy cảm nhưng chắc chắn rằng có nhiều ví dụ khác hàng ngày của quản trị viên cơ sở dữ liệu PostgreSQL có thể được thực thi trên công việc đường ống.
Pipeline đã có trên Jenkins từ phiên bản 2.0 và đó là một giải pháp tuyệt vời!
Tích hợp liên tục (CI) cho các phát triển PL / pgSQL
Việc tích hợp liên tục để phát triển cơ sở dữ liệu không dễ dàng như trong các ngôn ngữ lập trình khác do dữ liệu có thể bị mất, vì vậy không dễ dàng để giữ cơ sở dữ liệu trong quyền kiểm soát nguồn và triển khai nó trên một máy chủ chuyên dụng, đặc biệt là khi có tập lệnh chứa các câu lệnh DDL (Ngôn ngữ Định nghĩa Dữ liệu) và DML (Ngôn ngữ Thao tác Dữ liệu). Điều này là do các loại câu lệnh này sửa đổi trạng thái hiện tại của cơ sở dữ liệu và không giống như các ngôn ngữ lập trình khác, không có mã nguồn nào để biên dịch.
Mặt khác, có một tập hợp các câu lệnh cơ sở dữ liệu để có thể tích hợp liên tục như đối với các ngôn ngữ lập trình khác.
Ví dụ này nó chỉ dựa trên sự phát triển của các thủ tục và nó sẽ minh họa việc kích hoạt một tập hợp các bài kiểm tra (được viết bằng Python) bởi Jenkins sau khi các tập lệnh PostgreSQL, trên đó được lưu trữ mã của các hàm sau, được cam kết trong một kho lưu trữ mã.
Hình 11 - Các hàm PLpg / SQLCác hàm này đơn giản và nội dung của nó chỉ có một số logic hoặc một truy vấn trong PLpg / SQL hoặc plperlu ngôn ngữ dưới dạng hàm 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;
$$;
Tất cả các chức năng được trình bày ở đây không phụ thuộc vào nhau, và sau đó không được ưu tiên trong quá trình phát triển hoặc triển khai của nó. Ngoài ra, vì nó sẽ được xác minh trước, không có sự phụ thuộc vào các xác nhận của chúng.
Vì vậy, để thực thi một tập hợp các tập lệnh xác thực sau khi một cam kết được thực hiện trong kho lưu trữ mã, bạn cần tạo một công việc xây dựng (mục mới) trong Jenkins:
Hình 12 - Dự án "Freestyle" để Tích hợp liên tụcCông việc xây dựng mới này nên được tạo dưới dạng dự án “Tự do” và trong phần “Kho lưu trữ mã nguồn” phải được xác định URL của kho và thông tin đăng nhập của nó (hộp màu cam):
Hình 13 - Kho mã nguồnTrong phần "Trình kích hoạt xây dựng", bạn phải chọn tùy chọn "Trình kích hoạt móc GitHub cho cuộc thăm dò ý kiến GITScm":
Hình 14 - Phần “Tạo trình kích hoạt”Cuối cùng, trong phần “Xây dựng”, tùy chọn “Execute Shell” phải được chọn và trong hộp lệnh, các tập lệnh sẽ thực hiện việc xác nhận các chức năng đã phát triển:
Hình 15 - Phần “Xây dựng môi trường”Mục đích là có một tập lệnh xác thực cho mỗi chức năng được phát triển.
Tập lệnh Python này có một tập hợp các câu lệnh đơn giản sẽ gọi các thủ tục này từ cơ sở dữ liệu với một số kết quả mong đợi được xác định trước:
#!/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()
Tập lệnh này sẽ kiểm tra PLpg / SQL đã trình bày hoặc plperlu các chức năng và nó sẽ được thực thi sau mỗi lần cam kết trong kho lưu trữ mã để tránh hồi quy về các bước phát triển.
Khi quá trình xây dựng công việc này được thực thi, việc thực thi nhật ký có thể được xác minh.
Hình 16 - “Đầu ra bảng điều khiển”Tùy chọn này hiển thị trạng thái cuối cùng:THÀNH CÔNG hoặc THẤT BẠI, không gian làm việc, các tệp / tập lệnh đã thực thi, các tệp tạm thời được tạo và thông báo lỗi (đối với những lỗi không thành công)!
Kết luận
Tóm lại, Jenkins được biết đến như một công cụ tuyệt vời cho Tích hợp liên tục (CI) và Phân phối liên tục (CD), tuy nhiên, nó có thể được sử dụng cho các chức năng khác nhau như
- Lên lịch tác vụ
- Thực thi các tập lệnh
- Quy trình giám sát
Đối với tất cả các mục đích này trên mỗi lần thực hiện (Xây dựng từ vựng Jenkins), nó có thể được phân tích nhật ký và thời gian đã trôi qua.
Do số lượng lớn các plugin có sẵn, nó có thể tránh một số phát triển với mục đích cụ thể, có thể có một plugin thực hiện chính xác những gì bạn đang tìm kiếm, vấn đề chỉ là tìm kiếm trong trung tâm cập nhật hoặc Quản lý Jenkins>> Quản lý các plugin bên trong ứng dụng web.