
يستمر هذا المقال في سلسلة من الملاحظات المترجمة حول OpenWhisk التي كتبها Priti Desai . سننظر اليوم في أمثلة لنشر وظائف Zip وتبعيات GitHub ، كما سنشرح بمزيد من التفصيل تزامن الكائنات بين العميل وخادم OpenWhisk.
وظائف الرمز البريدي
يدعم OpenWhisk إنشاء وظائف من ملف مصدر واحد ، كما كان [موضح سابقًا] (). كما يدعم إنشاء وظيفة باستخدام عدة ملفات برمز مصدر ومجموعة من الحزم التي تعتمد عليها الوظيفة. تسمى حالة الاستخدام هذه للوظائف وظيفة zip. دعنا نحاول نشر وظيفة zip باستخدام wskdeploy
.
الخطوة الأولى
قم بإنشاء ملف بيان:
packages: zipaction: actions: my-zip-action: function: actions/my-zip-action runtime: nodejs:6 inputs: name: Amy
نعتقد أن my-zip-action
لها بنية دليل تحتوي على الكود المصدري للوظيفة:
$ ls actions/my-zip-action index.js package.json
محتويات ملف index.js :
function helloworld(params) { var format = require('string-format'); var name = params.name || 'Stranger'; payload = format('Hello, {}!', name) return { message: payload }; } exports.main = helloworld;
محتويات ملف package.json :
{ "name": "my-zip-action", "description": "Node OpenWhisk zip action to demo Whisk Deploy", "license": "Apache-2.0", "version": "1.0.0", "main": "index.js", "dependencies": { "string-format": "0.5.0" } }
الخطوة الثانية
قم بتشغيل npm install لتثبيت صيغة السلسلة:
cd actions/my-action npm install --production
الخطوة الثالثة
توسيع وظيفة الرمز البريدي:
./wskdeploy -i -p actions/my-zip-action/ ____ ___ _ _ _ _ _ /\ \ / _ \ _ __ ___ _ __ | | | | |__ (_)___| | __ /\ /__\ \ | | | | '_ \ / _ \ '_ \| | | | '_ \| / __| |/ / / \____ \ / | |_| | |_) | __/ | | | |/\| | | | | \__ \ < \ \ / \/ \___/| .__/ \___|_| |_|__/\__|_| |_|_|___/_|\_\ \___\/ |_| Packages: Name: zipaction bindings: * action: my-zip-action bindings: - name: name value: Amy Do you really want to deploy this? (y/N): y Deployment completed successfully.
لقد نشرنا وظيفة zip my-zip-action string-format
الوحدة التابعة. عند تحديد دليل في البيان باستخدام مفتاح function
، يتم إنشاء أرشيف مضغوط من هذا الدليل ، وكذلك وظيفة من هذا الأرشيف ، لذلك لا تحتاج إلى البحث عنه في نظام الملفات. بعد النشر ، يمكنك العمل مع الوظيفة الجديدة بنفس طريقة العمل مع الوظائف الأخرى.
تضمين واستبعاد للملفات في وظائف الرمز البريدي
يسمح لك OpenWhisk بإنشاء وظيفة باستخدام أرشيف مضغوط يحتوي على أي عدد من ملفات الوظيفة ، بما في ذلك كل إدماناتها. يدعم النشر تحديد function
الدليل مع ملفات للوظيفة لكي تعمل. سيتم إنشاء أرشيف من محتويات الدليل ، حيث سيتم نشر الوظيفة بالفعل.
إدراج ملف
في السابق ، كان من الممكن تحديد مفتاح include
، والذي يعمل بنفس طريقة import
بلغات البرمجة ، والذي سمح ، على سبيل المثال ، بعدة وظائف للإشارة إلى نفس المكتبة برمز:
$ cd actions/ $ ls -1 ./ common/ greeting1/ greeting2/ manifest.yaml $ ls -1 common/ utils.js $ ls -1 greeting1/ index.js package.json $ ls -1 greeting2/ index.js package.json
يمكنك مشاهدة ملف index.js
في دليل greeting1
، وكذلك ملف index.js
آخر في دليل greeting2
، ويشير كلاهما إلى utils.js
الموجود في common/
.
محتويات ملف index.js الموجود في actions/greeting1/
:
/** * Return a simple greeting message for someone. * * @param name A person's name. * @param place Where the person is from. */ var common = require('./common/utils.js') function main(params) { var name = params.name || params.payload || 'stranger'; var place = params.place || 'somewhere'; var hello = common.hello || 'Good Morning'; return {payload: hello + ', ' + name + ' from ' + place + '!'}; } exports.main = main;
محتويات ملف index.js الموجود في actions/greeting2/
:
/** * Return a simple greeting message for someone. * * @param name A person's name. * @param place Where the person is from. */ var common = require('./common/utils.js') function main(params) { var name = params.name || params.payload || 'stranger'; var place = params.place || 'somewhere'; var hello = common.hello || 'Good Evening'; return {payload: hello + ', ' + name + ' from ' + place + '!'}; } exports.main = main;
داخل مفتاح include
يحتوي على قائمة من الملفات أو الدلائل التي يجب تضمينها في الوظيفة. يجب أن يكون لكل عنصر في هذه القائمة source
و / أو destination
، على سبيل المثال:
include: - [source] - [source, destination]
ملاحظات:
source
يحتوي على المسار النسبي من الدليل الذي يحتوي على manimanifest.yaml
. تعني destination
المسار النسبي من دليل الوظائف ، على سبيل المثال ، actions/greeting1
actions/greeting2
في المثال التالي.- إذا لم
destination
تحديد destination
، فسيتم اعتبار أنها source
نفسه.
محتويات ملف البيان:
packages: zipactionwithinclude: actions: greeting1: function: actions/greeting1 runtime: nodejs:6 include: - ["actions/common/utils.js", "common/utils.js"] greeting2: function: actions/greeting2 runtime: nodejs:6 include: - ["actions/common/utils.js", "common/utils.js"]
include
الأعمال مع مجموعات مختلفة من source
destination
:
include: - [actions/common/utils.js]
باستخدام هذا الإدخال ، سيتم نسخ utils.js
إلى actions/greeting/actions/common/utils.js
، ويمكن لـ index.js
الرجوع إليها مثل هذا:
var utils = require('./actions/common/utils.js')
include: - ["actions/common/utils.js", "./common/myUtils.js"]
باستخدام هذا التعريف ، سيتم وضع utils.js
على طول مسار actions/greeting/common/myUtils.js
، وسوف يشير index.js
إليه كما يلي:
var utils = require('./common/myUtils.js')
include: - ["actions/common/utils.js", "./common/utility/utils.js"]
في هذه الحالة ، سيتم نسخ utils.js
إلى actions/greeting/common/utility/utils.js
، مع وجود رابط من index.js
:
var utils = require('./common/utility/utils.js')
include: - ["actions/common/*.js", "./common/"]
في هذا الإصدار ، utils.js
إلى جانب الملفات الأخرى ذات الامتداد .js
إلى actions/greeting/common/
directory ، وفي index.js
سيتم ربط هذه الملفات بالشكل التالي:
var utils = require('./common/utils.js')
إدراج الدليل
في include
يمكنك تحديد دليل سيتم نسخه بشكل متكرر إلى الموقع المحدد قبل أن يتم تضمينه في الأرشيف. على سبيل المثال ، libs`` ,
index.js
greeting3 / `` '':
$ cd actions/ $ ls -1 libs/ greeting3/ manifest.yaml $ ls -1 libs/ lib1/ lib2/ lib3/ $ ls -1 libs/lib1/ utils.js $ ls -1 libs/lib2/ utils.js $ ls -1 libs/lib3/ utils.js $ ls -1 greeting3/ index.js package.json
محتويات index.js في actions/greeting3/
الدليل:
/** * Return a simple greeting message for someone. * * @param name A person's name. * @param place Where the person is from. */ var lib1 = require('./libs/lib1/utils.js') var lib2 = require('./libs/lib2/utils.js') var lib3 = require('./libs/lib3/utils.js') function main(params) { var name = params.name || params.payload || 'stranger'; var place = params.place || 'somewhere'; var hello = lib1.hello || lib2.hello || lib3.hello || 'Hello'; return {payload: hello + ', ' + name + ' from ' + place + '!'}; } exports.main = main;
محتويات ملف البيان:
packages: zipactionwithinclude: actions: greeting3: function: actions/greeting3 runtime: nodejs:6 include: - ["actions/libs/*", "libs/"]
في هذا المثال ، يتم نسخ دليل libs
بالكامل بشكل متكرر إلى actions/greeting3/libs/
.
ربط الدلائل بالرمز *
:
include: - ["actions/libs/*/utils.js", "libs/"]
عند كتابة هذه utils.js
سيتم نسخ جميع الدلائل الفرعية التي تحتوي على utils.js
من libs
. تبدو الروابط من index.js
كما يلي:
var lib1 = require('./libs/lib1/utils.js') var lib2 = require('./libs/lib2/utils.js') var lib3 = require('./libs/lib3/utils.js')
include: - ["actions/*/*/utils.js"]
باستخدام هذا الإدخال ، سيتم نسخ جميع الأدلة الفرعية التي تطابق القناع وتحتوي على utils.js
. سيكون الوصول من index.js
مثل هذا:
var lib1 = require('./actions/libs/lib1/utils.js') var lib2 = require('./actions/libs/lib2/utils.js') var lib3 = require('./actions/libs/lib3/utils.js')
include: - ["actions/*/*/utils.js", "actions/"]
يشير هذا المثال صراحة إلى مكان نسخ كل شيء. سيكون الوصول من index.js
هو نفسه كما في المثال السابق.
استثناء
يمكن استخدام كلمة exclude
الرئيسية كقائمة من الملفات والدلائل ، ويُسمح باستخدام قناع في شكل حرف *
. مثال للاستخدام:
exclude: - actions/common/*.js - actions/libs/*/utils.js
مثال شائع للمشاركة include
exclude
:
packages: zipactionwithexclude: actions: greeting1: function: actions runtime: nodejs:6 exclude: - actions/* include: - ["actions/common/utils.js", "common/utils.js"] - ["actions/index.js", "index.js"] - ["actions/package.json", "package.json"]
وظائف مع تبعيات جيثب
يدعم OpenWhisk التبعيات ، بحيث يمكنك وصف حزم OpenWhisk الأخرى التي يعتمد عليها مشروعنا. باستخدام هذه التبعيات ، سوف يقوم OpenWhisk بنشر الحزم التابعة تلقائيًا أيضًا. يمكن اعتبار أي حزمة بها manifest.yaml
و \ أو deployment.yaml
كحزمة تابعة ، والتي يمكن تحديدها في بيان مشروعنا. يمكنك وصف مثل هذه التبعية في البيان في قسم dependencies
:
packages: RootProject: dependencies: helloworlds: location: github.com/apache/incubator-openwhisk-test/packages/helloworlds triggers: trigger1: trigger2: rules: rule1: trigger: trigger1 action: helloworlds/hello-js rule2: trigger: trigger2 action: helloworlds/helloworld-js
في هذا المثال ، helloworlds
عبارة عن حزمة خارجية مستضافة على مستودع GitHub على https://github.com/apache/incubator-openwhisk-test . سيتم نشر حزمة helloworlds
بناءً على ملفاتها للنشر في دليل packages/helloworlds
- عند نشر مشروع RootProject
بنا. من الممكن أيضًا تغيير اسم الحزمة التابعة ، على سبيل المثال ، بدلاً من helloworlds
بتعيين ChildProject
:
packages: RootProject: dependencies: ChildProject: location: github.com/apache/incubator-openwhisk-test/packages/helloworlds triggers: trigger1: trigger2: rules: rule1: trigger: trigger1 action: ChildProject/hello-js rule2: trigger: trigger2 action: ChildProject/helloworld-js
يمكنك إضافة تبعيات متعددة إلى حزم متعددة:
packages: RootProject: dependencies: ChildProject1: location: github.com/apache/incubator-openwhisk-test/packages/helloworlds ChildProject2: location: github.com/apache/incubator-openwhisk-test/packages/hellowhisk sequences: ChildProject1-series: actions: ChildProject1/hello-js, ChildProject1/helloworld-js ChildProject2-series: actions: ChildProject2/greeting, ChildProject2/httpGet triggers: trigger1: trigger2: rules: rule1: trigger: trigger1 action: ChildProject1-series rule2: trigger: trigger2 action: ChildProject2-series
كيف تزامن مشاريع OpenWhisk بين العميل والخادم
للإجابة ، يجب أن تبدأ النشر في وضع managed deployment
. في هذا الوضع ، ينشر OpenWhisk جميع الكائنات من البيان ، كما يرفق أيضًا وصفًا مخفيًا لكل منها ، ما يسمى managed
. هذا الوصف يشبه هذا:
managed: __OW_PROJECT_NAME: MyProjectName __OW_PROJECT_HASH: SHA1("OpenWhisk " + <size_of_manifest_file> + "\0" + <contents_of_manifest_file>) __OW_FILE: Absolute path of manifest file on file system
هنا ، OpenWhisk عبارة عن سلسلة ثابتة ، و "\ 0" هي الحرف NULL. size_of_manifest_file و content_of_manifest_file يعتمدان على الملف. يقوم تسلسل نشر المشروع نفسه في وضع managed deployment
بحساب __OW_PROJECT_HASH
جديد على العميل لكل كائن ومقارنته بكائن __OW_PROJECT_HASH
من نفس المشروع على الخادم. هناك العديد من الخيارات أدناه.
الخيار الأول : إذا __OW_PROJECT_HASH
على العميل والخادم ، أي: إذا لم تكن هناك تغييرات على المشروع من جانب العميل ، فسيظل المشروع على الخادم كما هو ، باستثناء wskdeploy
خلال wskdeploy
كائنات جديدة من البيان لتلقي أي تغييرات في ملف wskdeploy
.
الخيار 2 : إذا كان __OW_PROJECT_HASH
غير متطابق ، على سبيل المثال إذا كانت هناك تغييرات على جانب العميل ، wskdeploy
بنشر جميع الكائنات من البيان ، ثم يقوم بتحديثها __OW_PROJECT_HASH
على الخادم. wskdeploy
أيضًا عن جميع الكائنات: بما في ذلك الدالات والتسلسلات __OW_PROJECT_NAME
الشرطية التي لها نفس __OW_PROJECT_NAME
، أي ينتمي إلى نفس المشروع ولكن له __OW_PROJECT_HASH
مختلف ، حيث يمكن إزالته من البيان على العميل. اسم المشروع في البيان مطلوب لمزامنة المشروع بين العميل والخادم:
project: name: MyProjectName packages: package1: ....
تظل الكائنات الموجودة في OpenWhisk التي تشكل جزءًا من المشروع ولكنها يتم نشرها باستخدام أدوات أو أدوات التشغيل الآلي الأخرى كما هي دون تغيير عند إزالتها من المشروع. تعتبر كائنات خارجية وبالتالي لا يتم الكتابة. يمكنك wskdeploy
مثل هذا المشروع باستخدام wskdeploy
، وتوجيهه إلى ملف البيان ، والذي يحتوي فقط على اسم المشروع:
project: name: MyProjectName
دعونا نلقي نظرة على مشروع نموذج لفهم managed deployment
. في هذا المخزون ، يمكنك رؤية المشروع بالعديد من البيانات التي تعرض managed deployment
.
الخطوة الأولى
نشر MyFirstManagedProject
باستخدام وضع managed deployment
:
$wskdeploy -m tests/src/integration/managed-deployment/manifest.yaml --managed Deployment completed successfully.

قائمة الكائنات المنشورة على خادم OpenWhisk

وصف العقار
الخطوة الثانية
نقوم بمزامنة العميل والخادم - نحذف ManagedPackage-2:
./wskdeploy -m tests/src/integration/managed-deployment/00-manifest-minus-second-package.yaml --managed Deployment completed successfully.

قائمة الكائنات بعد الحذف في MyFirstManagedProject
الخطوة الثالثة
نقوم بمزامنة العميل والخادم - نحذف التسلسل ManagedSequence-2:
./wskdeploy -m tests/src/integration/managed-deployment/01-manifest-minus-sequence-2.yaml --managed Deployment completed successfully.

قائمة الكائنات بعد الحذف
الخطوة الرابعة
حذف وظيفة Helloworld-3:
./wskdeploy -m tests/src/integration/managed-deployment/02-manifest-minus-action-3.yaml --managed Deployment completed successfully.

قائمة الكائنات بعد الحذف
الخطوة الخامسة
حذف ManagedPackage-1:
./wskdeploy -m tests/src/integration/managed-deployment/04-manifest-minus-package.yaml --managed Deployment completed successfully.

كائنات أخرى في MyFirstManagedProject
مقالات دورة أخرى
الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 1
الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 2
الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 3
الحوسبة بدون خادم على أساس OpenWhisk ، الجزء 4