Workflow Automation

Windmill: محرك أتمتة سير عمل المطورين

في دورة حياة البرمجيات الحديثة، اتسعت الفجوة بين كتابة أكواد الإنتاج وأتمتة العمليات الداخلية أكثر من أي وقت مضى. غالباً ما تفتقر أدوات Low-code التقليدية إلى المرونة التي يحتاجها المطورون، بينما يمكن أن يكون كتابة الأكواد النمطية (Boilerplate) لكل مهمة مجدولة بسيطة أو محفز API أمراً شاقاً. هنا يأتي دور Windmill، وهو منصة مفتوحة المصدر مصممة خصيصاً للمطورين لتحويل النصوص البرمجية إلى تطبيقات داخلية وسير عمل ونقاط نهاية (Endpoints). تقوم المنصة بسد هذه الفجوة من خلال السماح لك بكتابة نصوص برمجية بلغتك المفضلة ونشرها فوراً كتطبيقات قابلة للتوسع ومُدارة.

لماذا يغير Windmill قواعد اللعبة؟

يتميز Windmill بأنه متعدد اللغات (Polyglot) ويركز على الكود. وعلى عكس أدوات تنسيق سير العمل الجامدة التي تجبرك على استخدام واجهة سحب وإفلات بصرية، يسمح لك Windmill بكتابة المنطق باستخدام Python وTypeScript وRust وGo وBash وSQL. يوفر هذا النهج عدة مزايا مميزة لفرق الهندسة:

  1. إعادة الاستخدام: يمكن إعادة استخدام النصوص البرمجية المكتوبة لمهمة لمرة واحدة كخطوات في سير عمل معقد دون الحاجة إلى تعديلها.
  2. التغذية الراجعة الفورية: تحصل على توليد تلقائي لواجهة المستخدم بناءً على معلمات النص البرمجي، مما يقلل الوقت المستغرق في بناء لوحات التحكم الإدارية.
  3. الأمان: من خلال الحفاظ على المنطق قريباً من مصدر البيانات واستخدام الأسرار المُدارة (Managed Secrets)، تقلل من سطح الهجوم مقارنة بالمهام المجدولة المخصصة التي تعمل على مثيلات EC2.
  4. القابلية للتوسع: يتولى Windmill إدارة البنية التحتية الأساسية، ويقوم بتوسيع عقد العمل (Worker Nodes) تلقائياً بناءً على الحمل.

البدء: أول نص برمجي لك

إعداد Windmill أمر مباشر، خاصة عند استخدام Docker Compose. بمجرد أن يكون بيئتك جاهزة، يمكنك البدء في إنشاء أول "نص برمجي" (Script). دعنا نلقي نظرة على مثال عملي: نص برمجي بلغة Python يتفاعل مع قاعدة بيانات.

تخيل أنك بحاجة إلى نص برمجي لجلب بيانات المستخدمين ولوحة تحليلات داخلية. في Windmill، ما عليك سوى كتابة الدالة، وسيقوم النظام بتعريضها تلقائياً كنقطة نهاية (Endpoint).

# script.py
from windmill_pydantic import User

def get_active_users(db_connection: str, limit: int = 10) -> list[User]:
    """
    يجلب أحدث المستخدمين النشطين من قاعدة البيانات.
    
    Args:
        db_connection: سلسلة اتصال قاعدة البيانات.
        limit: عدد المستخدمين المراد إرجاعهم.
    """
    # تفاعل محاكى مع قاعدة البيانات
    # في السيناريو الحقيقي، ستستخدم ORM مثل SQLAlchemy أو Prisma
    users = query_db(db_connection, f"SELECT * FROM users WHERE active = true LIMIT {limit}")
    return users

لاحظ استخدام تلميحات الأنواع (Type hinting). يستخدم Windmill هذه التلميحات لتوليد حقول الإدخال تلقائياً في واجهة المستخدم، مما يضمن أن أي شخص يستخدم هذا النص البرمجي (أو يستدعيه عبر API) يوفر أنواع البيانات الصحيحة.

تنسيق سير العمل المعقد

بينما تكون النصوص البرمجية الفردية قوية، يكمن السحر الحقيقي لـ Windmill في التيارات (Flows). التيار هو رسم بياني موجه غير دائري (DAG) يربط بين عدة نصوص برمجية. يمكنك تسلسل نص برمجي بلغة TypeScript يقوم بتحفيز استدعاء API، ونقل نتيجته إلى نص برمجي بلغة Python لتحويل البيانات، ثم استخدام نص برمجي بلغة Bash لإرسال إشعار عبر Slack.

فكر في سيناريو تحتاج فيه إلى مزامنة البيانات من نظام CRM تابع لجهة خارجية إلى قاعدة بيانات Postgres الداخلية. يمكنك إنشاء تيار يبدو كالتالي:

// flow.ts
import { flow } from 'windmill';

export default flow()
  .step(async () => {
    // الخطوة 1: جلب البيانات من Salesforce
    const crmData = await fetch('https://api.crm.com/users', {
      headers: { Authorization: process.env.SALESFORCE_TOKEN }
    });
    return crmData.json();
  })
  .step(async (data) => {
    // الخطوة 2: تحويل البيانات باستخدام نص برمجي بلغة Python
    return python.transform_data(data);
  })
  .step(async (transformedData) => {
    // الخطوة 3: الإدراج في Postgres
    return python.insert_to_db(transformedData);
  })
  .execute();

يجعل هذا النهج التصريحي (Declarative) من السهل تصور التبعيات المعقدة وتصحيح الأخطاء فيها. إذا فشلت الخطوة 2، يمكنك إعادة تشغيل تلك الخطوة فقط باستخدام المدخلات المخزنة مؤقتاً من الخطوة 1، مما يقلل بشكل كبير من وقت التطوير.

الخاتمة

يمثل Windmill تحولاً كبيراً في كيفية تعاملنا مع الأدوات الداخلية والأتمتة. من خلال تمكين المطورين من استخدام اللغات التي يعرفونها بالفعل، فإنه يلغي منحنى التعلم المرتبط بأدوات إدارة العمليات التجارية (BPM) التقليدية، بينما يوفر متانة وقابلية للتوسع لمنصة أصلية للسحابة (Cloud-native). سواء كنت تبني مهمة مجدولة بسيطة أو تنسيق خدمات مصغرة معقدة، يوفر Windmill الأدوات لإنجاز ذلك بشكل أسرع، وأنظف، وأكثر أماناً. بالنسبة للفرق التي تسعى إلى تقليل الديون التقنية وتسريع التطوير الداخلي، فإن اعتماد Windmill هو خطوة استراتيجية تستحق النظر فيها.

Share: