منصوبے کے بارے میں
# go-docker-testsuite
انٹیگریشن ٹیسٹنگ کے لیے Docker کنٹینرز میں تھرڈ پارٹی ڈیپنڈنسیز چلانے کے لیے ایک Go لائبریری۔ یہ آپ کو کوئی بھی Docker امیج—ڈیٹا بیس، قطاریں، کیشے، یا آبجیکٹ اسٹوریج—اسپن اپ کرنے اور اپنے Go ٹیسٹس سے ان سے کنیکٹ کرنے دیتی ہے۔
## خصوصیات
- **Container** — کسی بھی Docker امیج کو بنانے، چلانے، آؤٹ پٹ کا انتظار کرنے، اور صاف کرنے کے لیے نچلی سطح کا ریپر
- **Group** — IP سطح کی کنیکٹیویٹی کے ساتھ ایک الگ تھلگ Docker نیٹ ورک میں متعدد کنٹینرز چلائیں
- **Applications** — مقبول سروسز (MySQL، PostgreSQL، Redis، Kafka، وغیرہ) کے لیے تیار ریپرز
- **Hooks** — فی کنٹینر لائف سائیکل کال بیکس (BeforeRun، AfterRun، BeforeClose، AfterClose)
- **Exec** — چل رہے کنٹینر کے اندر کمانڈز چلائیں اور stdout، stderr، اور exit code حاصل کریں
- **Lifecycle commands** — exec کے ذریعے اسٹارٹ اپ / تیار ہونے کے بعد کی کمانڈز چلائیں
- **کنٹینرز میں فائلیں کاپی کریں** — `WithFiles` کے ساتھ شروع سے پہلے فائلیں سیڈ کریں
- **کنٹینرز سے فائلیں کاپی کریں** — چل رہے کنٹینر سے فائلیں tar اسٹریم کے طور پر واپس پڑھیں
- **Resource limits** — میزبان اور CI کی حفاظت کے لیے CPU/میموری/pids کی حد مقرر کریں
- **Matchers** — substring، exact، یا regexp میچرز کے ساتھ کنٹینر لاگز کا انتظار کریں
- **Wait strategies** — کمپوز ایبل ریڈینس پروبز (ForLog، ForHTTPGet، ForCommand، ForTCPConnection)
- **Environment builder** — ٹائپڈ ماحول متغیرات کے لیے فلوئنٹ DSL
- **Port bindings** — بے ترتیب یا ون ٹو ون ایلوکیشن کے ساتھ DNAT پورٹ میپنگ
- **Network mode** — host یا کسٹم نیٹ ورک سپورٹ
- **IMAGE_PREFIX** — امیجز کو پراکسی/مرر کے ذریعے روٹ کریں
- **`*testing.T` binding** — محفوظ `t.Parallel()` کے ساتھ خودکار ٹیئر ڈاؤن اور لاگنگ
## تقاضے
- Go 1.26+
- ایک چل رہا Docker ڈیمون (`DOCKER_HOST` کے ذریعے ریموٹ ہوسٹس کے ساتھ کام کرتا ہے)
## انسٹالیشن
ملٹی ماڈیول ورک اسپیس: روٹ کور ماڈیول ہے، اور `applications/<name>` کے تحت ہر ایپلیکیشن اپنا Go ماڈیول ہے۔ صرف وہی حاصل کریں جو آپ کو درکار ہے:
```sh
go get github.com/teran/go-docker-testsuite
# مخصوص ایپلیکیشن ریپر:
go get github.com/teran/go-docker-testsuite/applications/redis
go get github.com/teran/go-docker-testsuite/applications/postgres
```
## ایپلیکیشنز
تیار ریپرز (ہر ایک ٹائپڈ کلائنٹ انٹرفیس واپس کرتا ہے اور اسٹارٹ اپ، ہیلتھ چیکس، اور کلین اپ سنبھالتا ہے):
- Ceph (RGW) AWS SDK v2 کے ساتھ
- ClickHouse clickhouse-go کے ساتھ
- Forgejo SQLite کے ساتھ
- FRR روٹنگ سوٹ vtysh کے ساتھ
- K3s client-go کے ساتھ
- Kafka Sarama کے ساتھ
- Memcache gomemcache کے ساتھ
- MinIO (S3-کمپیٹیبل)
- MongoDB mongo-driver کے ساتھ
- MySQL / MariaDB / Percona Server
- NetBox PostgreSQL + Redis کے ساتھ
- Nginx
- OpenSearch opensearch-go کے ساتھ
- Paperless-ngx PostgreSQL + Valkey کے ساتھ
- PostgreSQL pgx کے ساتھ
- Prometheus prometheus/client_golang کے ساتھ
- RabbitMQ (AMQP + Management API)
- Redis go-redis کے ساتھ
- ScyllaDB gocql کے ساتھ
- Vault
- Libvirtd (KVM/QEMU)
بہت سے پیکجز میں pkg.go.dev پر قابلِ ٹیسٹ مثالیں شامل ہیں۔
## استعمال
### فوری آغاز — MySQL
```go
package main
import (
"context"
"database/sql"
"time"
_ "github.com/go-sql-driver/mysql"
"github.com/teran/go-docker-testsuite/applications/mysql"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
app, err := mysql.New(ctx, "index.docker.io/library/mysql:8.0.4")
if err != nil {
panic(err)
}
defer app.Close(ctx)
if err := app.CreateDB(ctx, "important_database"); err != nil {
panic(err)
}
db, err := sql.Open("mysql", app.MustDSN("important_database"))
if err != nil {
panic(err)
}
defer db.Close()
if _, err := db.ExecContext(ctx, "SELECT 1"); err != nil {
panic(err)
}
}
```
### ملٹی کنٹینر گروپ
```go
package main
import (
"context"
"time"
"github.com/teran/go-docker-testsuite"
"github.com/teran/go-docker-testsuite/wait"
)
func main() {
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute)
defer cancel()
app := docker.NewApplication(
c,
docker.HookFunc(func(ctx context.Context, ht docker.HookType, c docker.Container) error {
return wait.Wait(ctx, c, wait.ForLog(docker.NewSubstringMatcher("ready")))
}),
)
g, err := docker.NewGroup("my-services", app1, app2)
if err != nil {
panic(err)
}
if err := g.Run(ctx); err != nil {
panic(err)
}
defer g.Close(ctx)
}
```
### انتظار کی حکمت عملیاں
```go
if err := wait.Wait(ctx, c, wait.ForHTTPGet(8080,
wait.WithPath("/health"),
wait.WithResponseStatuses(200),
)); err != nil {
panic(err)
}
```
دیگر حکمت عملیاں: `ForLog`، `ForCommand`، `ForTCPConnection`۔ `ForAll` / `ForAny` / `ForAtLeast` کے ساتھ ملائیں۔
### `*testing.T` binding
```go
func TestRedis(t *testing.T) {
t.Parallel()
c, err := docker.NewContainerWithT(
t,
"redis",
images.Redis,
nil,
docker.NewEnvironment(),
docker.NewPortBindings().PortDNAT(docker.ProtoTCP, 6379),
)
if err != nil {
t.Fatal(err)
}
c.RunT(ctx) // fail-fast؛ t.Cleanup رجسٹر کرتا ہے
}
```
### لائف سائیکل ہکس
```go
docker.HookTypeBeforeRun // کنٹینر شروع ہونے سے پہلے
docker.HookTypeAfterRun // کنٹینر شروع ہونے کے بعد
docker.HookTypeBeforeClose // کنٹینر بند ہونے سے پہلے
docker.HookTypeAfterClose // کنٹینر بند ہونے کے بعد
```
### Exec اور لائف سائیکل کمانڈز
```go
res, err := c.Exec(ctx, []string{"echo", "hello"})
if err != nil {
panic(err)
}
if err := res.Error(); err != nil {
panic(err)
}
fmt.Printf("exit code: %d\n", res.ExitCode)
fmt.Printf("stdout: %s", res.Stdout)
```
### کنٹینرز میں/سے فائلیں کاپی کرنا
چھوٹے مواد کے لیے `FileFromBytes` کے ساتھ `WithFiles` استعمال کریں یا بڑی فائلوں کے لیے `io.Reader` + `Size`۔ فائلیں `docker.CopyFromContainer` کے ساتھ واپس پڑھیں۔
### امیج پری فکس / پراکسی
```sh
export IMAGE_PREFIX=registry-mirror.example.com
```
## ماڈیولز اور ریلیزز
ایک ہی ورژن نمبر کے ساتھ ملٹی ماڈیول ورک اسپیس، الگ الگ ٹیگ شدہ (مثلاً، کور `v1.6.0`، ایپلیکیشن `applications/redis/v1.6.0`)۔ ریلیز کی ترتیب: پہلے کور، پھر ایپلیکیشنز۔ ٹیگ کرنے کے لیے Makefile استعمال کریں۔
## لائسنس
Apache License, Version 2.0
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.