اكتب خطوط أنابيب Dockerfiles وCI في TypeScript.
Trellis هي أداة CI/CD محمولة. باستخدام Trellis، يمكنك تحديد مسارات Dockerfiles وCI/CD الخاصة بك في TypeScript، وتشغيلها في أي مكان (محليًا أو على نظام أساسي مستضاف).
أولاً، قم بتثبيت Deno مع brew install deno
(أو ما شابه ذلك).
ثانيًا، قم بتثبيت Trellis CLI باستخدام:
deno install
--allow-run=docker
--allow-net
--allow-write
--allow-env
--allow-read
https://deno.land/x/[email protected]/cli.ts
قم بتشغيل trellis --help
للتحقق من التثبيت:
>>> trellis --help
Usage: trellis build mod.ts
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
ls [file] List all Images and Tasks available in a
TypeScript module
preview [options] [file] Generate a Dockerfile defined in a TypeScript
module
build [options] [file] Build an Image defined in a TypeScript module
run [options] [file] Run a Task defined in a TypeScript module
help [command] display help for command
قم بتصدير أي Image
لتمكين إنشاء Dockerfile وبناء الصور باستخدام Trellis.
على سبيل المثال، لتحديد صورة Ubuntu مع تثبيت بعض الأدوات المساعدة المفيدة، يمكنك كتابة ملف mod.ts
التالي:
import { Image } from "https://deno.land/x/[email protected]/mod.ts" ;
const UBUNTU_VERSION = "20.04" ;
export const buildStage = Image . from ( `ubuntu: ${ UBUNTU_VERSION } ` )
. workDir ( "/root" )
. aptInstall ( [
"curl" ,
"jq" ,
"git" ,
] ) ;
يؤدي تشغيل trellis ls mod.ts
إلى سرد الصور القابلة للبناء:
>>> trellis ls mod.ts
Images:
- buildStage (trellis build --target buildStage)
يمكننا معاينة ملف Dockerfile الذي تم إنشاؤه باستخدام trellis preview mod.ts --target buildStage
:
>>> trellis preview --target buildStage
# syntax=docker/dockerfile:1.4
FROM ubuntu:20.04 AS stage-0
WORKDIR /root
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked --mount=type=cache,target=/var/lib/apt,sharing=locked apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends curl git jq
يمكننا بناء الصورة باستخدام trellis build --target buildStage
:
>>> trellis build --target buildStage
[+] Building 0.6s (11/11) FINISHED
= > [internal] load build definition from Dockerfile 0.0s
= > = > transferring dockerfile: 335B 0.0s
= > [internal] load .dockerignore 0.0s
= > = > transferring context: 2B 0.0s
= > resolve image config for docker.io/docker/dockerfile:1.4 0.2s
= > CACHED docker-image://docker.io/docker/dockerfile:1.4@sha256:9ba7531bd80fb0a858632727cf7a112fbf 0.0s
= > [internal] load build definition from Dockerfile 0.0s
= > [internal] load .dockerignore 0.0s
= > [internal] load metadata for docker.io/library/ubuntu:20.04 0.2s
= > [stage-0 1/3] FROM docker.io/library/ubuntu:20.04@sha256:35ab2bf57814e9ff49e365efd5a5935b6915ee 0.0s
= > CACHED [stage-0 2/3] WORKDIR /root 0.0s
= > CACHED [stage-0 3/3] RUN --mount=type=cache,target=/var/cache/apt,sharing=locked --mount=type=c 0.0s
= > exporting to image 0.0s
= > = > exporting layers 0.0s
= > = > writing image sha256:17f750ba9a4becf38ce4d584d0de4793bfd6a8139674c3b332cdcdf6525ea8d9 0.0s
= > = > naming to docker.io/trellis/db112e211de238c035a9fd3bbcbd5c417aafc5ee96a8c24d99d4caf81a759903 0.0s
√ Build: trellis/db112e211de238c035a9fd3bbcbd5c417aafc5ee96a8c24d99d4caf81a759903
قم بتصدير أي وظيفة من وحدة TypeScript لتمكين تنفيذ المهمة باستخدام Trellis.
على سبيل المثال، لتحديد مسار CI للتحقق من تثبيت أدوات سطر الأوامر المساعدة لدينا بنجاح، يمكنك كتابة ملف tasks.ts
.ts التالي:
import { build , Image , run } from "https://deno.land/x/[email protected]/mod.ts" ;
import { buildStage } from "./mod.ts" ;
export default async function runChecks ( ) {
await build ( buildStage ) ;
const checkCurl = Image . from ( buildStage ) . run (
"curl --help" ,
) ;
const checkJq = Image . from ( buildStage ) . run (
"jq --help" ,
) ;
const checkGit = Image . from ( buildStage ) . run (
"git --help" ,
) ;
await Promise . all ( [
run ( checkCurl ) ,
run ( checkJq ) ,
run ( checkGit ) ,
] ) ;
}
يؤدي تشغيل trellis ls tasks.ts
إلى سرد المهام القابلة للتنفيذ:
>>> trellis ls tasks.ts
Tasks:
- default (trellis run tasks.ts)
يمكننا تنفيذ المهمة محليًا باستخدام trellis run tasks.ts
:
>>> trellis run tasks.ts
[+] Building 1.1s (13/13) FINISHED
= > [internal] load build definition from Dockerfile 0.0s
= > = > transferring dockerfile: 335B 0.0s
= > [internal] load .dockerignore 0.0s
= > = > transferring context: 2B 0.0s
= > resolve image config for docker.io/docker/dockerfile:1.4 0.5s
= > [auth] docker/dockerfile:pull token for registry-1.docker.io 0.0s
= > CACHED docker-image://docker.io/docker/dockerfile:1.4@sha256:9ba7531bd80fb0a858632727cf7a112fbf 0.0s
= > [internal] load .dockerignore 0.0s
= > [internal] load build definition from Dockerfile 0.0s
= > [internal] load metadata for docker.io/library/ubuntu:20.04 0.3s
= > [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s
= > [stage-0 1/3] FROM docker.io/library/ubuntu:20.04@sha256:35ab2bf57814e9ff49e365efd5a5935b6915ee 0.0s
= > CACHED [stage-0 2/3] WORKDIR /root 0.0s
= > CACHED [stage-0 3/3] RUN --mount=type=cache,target=/var/cache/apt,sharing=locked --mount=type=c 0.0s
= > exporting to image 0.0s
= > = > exporting layers 0.0s
= > = > writing image sha256:17f750ba9a4becf38ce4d584d0de4793bfd6a8139674c3b332cdcdf6525ea8d9 0.0s
= > = > naming to docker.io/trellis/adf8a603d1ab539848d89f68491e1b9213c1ca498f3f68d871e1b59c4c7de601 0.0s
√ Build: trellis/adf8a603d1ab539848d89f68491e1b9213c1ca498f3f68d871e1b59c4c7de601
√ Run: git --help
√ Run: jq --help
√ Run: curl --help
يمكن تكوين Trellis عبر ملف trellis.config.ts
، والذي تم تصميم دلالاته الأساسية على غرار Vite.
يجب أن يحتوي trellis.config.ts
على تصدير افتراضي واحد يتكون من استدعاء defineConfig
، مثل هذا:
import { defineConfig } from "https://deno.land/x/[email protected]/mod.ts" ;
export default defineConfig ( {
engine : "docker" ,
} ) ;
ستستخدم التداخلات أقرب trellis.config.ts
، وتبحث أولاً في دليل العمل الحالي، ثم في كل دليل أصل لاحق.
تتوافق Trellis مع depot.dev، والذي يمكن استخدامه لتمكين عمليات الإنشاء المُسرّعة عبر السحابة بدون أي تكوين. قم بتشغيل عملية تثبيت المستودع ( brew install depot/tap/depot
أو ما شابه ذلك، متبوعًا depot login
)، ثم حدد trellis.config.ts
كما يلي:
import { defineConfig } from "https://deno.land/x/[email protected]/mod.ts" ;
export default defineConfig ( {
engine : {
type : "depot" ,
project : "${YOUR_PROJECT_ID}" ,
} ,
} ) ;
ومن هناك، سيتم تشغيل جميع إصدارات Trellis عبر المستودع.
تعمل Trellis على Deno، مما يجعلها عملية تثبيت في خطوة واحدة على GitHub Actions:
name : CI
on :
push :
branches : [ main ]
pull_request :
branches : [ main ]
env :
DOCKER_BUILDKIT : 1
jobs :
build :
name : " Build "
runs-on : ubuntu-latest
steps :
- uses : actions/checkout@v3
- name : " Install Deno "
uses : denoland/setup-deno@v1
with :
deno-version : " 1.25.2 "
- name : " Install Trellis "
working-directory : ./trellis
run : deno install --allow-run=docker --allow-net --allow-write --allow-env --allow-read https://deno.land/x/[email protected]/cli.ts
- name : " Build the image "
working-directory : ./examples/typescript
run : trellis build trellis/mod.ts
يتم تحفيز التعريشة من خلال الملاحظات التالية، المستمدة من تجربة صيانة أنظمة CI/CD الكبيرة والمحمولة في حاويات.
من الصعب صيانة ملفات Dockerfiles. مع مرور الوقت، تميل الأنظمة الكبيرة إلى تجميع مجموعات من ملفات Dockerfiles ذات الأقسام الفرعية المتشابهة، ولكن بدون تجريدات مشتركة.
من الصعب كتابة ملفات Dockerfiles الفعالة . تتطلب كتابة ملف Dockerfile الذي يمكن تخزينه مؤقتًا إلى أقصى حد وبأقل مساحة ممكنة خبرة كبيرة. على سبيل المثال، من أجل apt-get install
، توصي وثائق Docker بما يلي:
RUN apt-get update && apt-get install -y
# Be sure to sort dependencies to maximize cacheability.
bzr
cvs
git
mercurial
subversion
# Clear the apt cache to minimize disk size.
&& rm -rf /var/lib/apt/lists/ *
حلقة تكرار CI/CD بطيئة جدًا . إن سير العمل الشائع لكتابة مسار GitHub Actions جديد، Jenkinsfile، وما إلى ذلك، هو الالتزام، والدفع، والانتظار حتى يقر النظام بالتغيير، ثم الانتظار حتى تفشل مهمتك - عشرات، أو حتى مئات المرات على التوالي. باستخدام حلول CI الحالية، أنت تكتب تعليمات برمجية لتشغيلها على نظام غير مألوف، خارج عن سيطرتك، بدون سير عمل تطوير من الدرجة الأولى.
تعمل أنظمة CI/CD على إنشاء قفل كبير . يتطلب نقل ملفات Jenkinsfiles أو YAML إلى GitHub Actions، أو العكس، التعامل مع التجريدات الخاصة بالنظام الأساسي.
تعمل Trellis على حل هذه المشكلات من خلال بعض قرارات التصميم المهمة.
أولاً: باستخدام Trellis، يمكنك تحديد مسارات Dockerfiles وCI/CD الخاصة بك في TypeScript. يمنحك هذا قوة لغة البرمجة "الكاملة" مع الاحتفاظ بواجهة برمجة التطبيقات التعريفية. مع TypeScript، نحصل على الفوائد التالية:
apt-get install
المعقدة يدويًا.deno.land
. ثانيًا: تجعل Trellis التنفيذ المحلي بدائيًا من الدرجة الأولى. لا ينبغي أن يبدو CI/CD وكأنه نظام منفصل تمامًا؛ يجب أن يبدو الأمر وكأنه تشغيل التعليمات البرمجية. تم بناء Trellis على Deno وهو سهل الحمل للغاية. يمكنك تشغيل trellis build
محليًا تمامًا كما تفعل في GitHub Actions أو في أي مكان آخر. بهذه الطريقة، تستمد Trellis الإلهام من أدوات مثل Earthly وDagger.
لدى Trellis بعض الأهداف الطموحة التي لم تتحقق بعد:
تعد Trellis مكتبة وواجهة سطر أوامر. باستخدام Trellis، يمكنك تصدير تعريفات Image
والوظائف القابلة للتشغيل (تسمى "المهام") من وحدات TypeScript الخاصة بك، ثم تنفيذها عبر واجهة سطر trellis
.
trellis preview
قم بإنشاء ملف Dockerfile محدد في وحدة TypeScript.
Usage: trellis preview [options] [file]
Generate a Dockerfile defined in a TypeScript module
Options:
-t, --target < TARGET > Image to build within the TypeScript module
-h, --help display help for command
trellis build
إنشاء صورة محددة في وحدة TypeScript.
Usage: trellis build [options] [file]
Build an Image defined in a TypeScript module
Options:
-t, --target < TARGET > Image to build within the TypeScript module
--push Whether to push the image to a remote registry
-h, --help display help for command
trellis ls
قم بإدراج كافة الصور والمهام المتوفرة في وحدة TypeScript.
Usage: trellis ls [options] [file]
List all Images and Tasks available in a TypeScript module
Options:
-h, --help display help for command
trellis run
قم بتشغيل مهمة محددة في وحدة TypeScript.
Run a Task defined in a TypeScript module
Options:
-t, --target <TARGET> Task to run within the TypeScript module
-h, --help display help for command
يوضح الدليل ./examples
مجموعة متنوعة من حالات الاستخدام للشبكة. تتميز Trellis بالمرونة ويمكن استخدامها فقط لإنشاء ملفات Dockerfiles للأنظمة الأخرى، أو لتحديد خطوط أنابيب CI/CD بالكامل.
rocket
: خادم ويب Rust أعلى إطار Rocket. يوضح عمليات الإنشاء والنشر متعددة المراحل عبر Fly.io من خلال الاستفادة من trellis preview
.ruff
: أداة سطر أوامر Rust. يوضح عمليات البناء الفعالة وفحوصات CI.runc
: حاوية تطوير Linux. يوضح إنشاء القطع الأثرية باستخدام Trellis ونسخها مرة أخرى إلى الجهاز المضيف.turborepo
: مثال Docker الخاص بـ Turborepo، تم تعديله لإنشاء ملفات Dockerfiles باستخدام Trellis.typescript
: مونوريبو تايبسكريبت. يوضح عمليات البناء الفعالة وفحوصات CI، إلى جانب دمج الثوابت (مثل قائمة مساحات عمل TypeScript).wasm
: "مرحبا بالعالم!" ثنائي الصدأ الذي تم تجميعه إلى Wasm واختباره على Wasmtime. تم بناء Trellis على Deno، والذي يتم توزيعه كملف ثنائي واحد قابل للتنفيذ دون أي تبعيات خارجية. استخدام Deno يعني أن تثبيت Trellis في أي مكان ) أمر بسيط مثل deno install ...
- لا يوجد package.json
ولا npm install
ولا خطوة ترجمة TypeScript.
على غرار Nixpacks، تقوم Trellis بإنشاء ملفات Dockerfiles. يعمل هذا على تبسيط تنفيذ Trellis، ولكنه يمكّن المستخدمين أيضًا من الاستفادة من Trellis لإنشاء ملف Dockerfile وحده، بدلاً من استخدامه كحل CI/CD كامل.
يعتمد trellis build
trellis run
على Docker ويفترض أن برنامج Docker الخفي يمكن الوصول إليه محليًا.
معهد ماساتشوستس للتكنولوجيا