محیط Go Developer خود را قسمت کنید – قسمت 3


در این سری از پست های وبلاگ ، ما نشان می دهیم چگونه می توان یک محیط توسعه بهینه شده ظروف کانتینر شده را به کار برد. در قسمت 1 ، ما توضیح دادیم که چگونه یک محیط توسعه کانتینر شده برای توسعه Go محلی ایجاد کنیم ، یک ابزار CLI مثال برای سیستم عامل های مختلف ایجاد کنیم. قسمت 2 نحوه افزودن وابستگی Go ، حافظه پنهان برای ساخت سریعتر و آزمایش واحد را شامل می شود. این قسمت سوم و آخر به شما نشان می دهد که چگونه می توانید یک کد امنیتی ، یک عملکرد عملی GitHub Action CI و برخی از بهینه سازی های ساخت اضافی را اضافه کنید.

اضافه کردن یک آستر

ما می خواهیم به طور خودکار چک کردن رویه های خوب برنامه نویسی را به صورت خودکار انجام دهیم. تا آنجا که ممکن است ، بنابراین اجازه دهید یک اضافه کردن اضافه کردن به راه اندازی ما. قدم اول اصلاح Dockerfile است:

# syntax = docker / dockerfile: 1-آزمایشی

FROM - platform = $ U BUILDPLATFORM} [19659: 1.14.3-alpine AS base
WORKDIR / src
ENV CGO_ENABLED = 0
COPY ].
go mod download
COPY . .

از پایه AS ساخت
ARG TARGETOS
ARG TARGETARCH
RUN [19459010=c] target /root/.cache/go-build
GOOS = $ {TARGETOS} GOARCH = $ {TARGETARCH} go build -o / out / مثال.

FROM base AS واحد -test
RUN - mount = type = cache، target = / root / .cache / go-build
go test -v.

FROM golangci / golangci-lint : v1.27-alpine AS lint-base

از پایه AS lint
COPY - از = lint-base / usr / bin / golangci-lint / usr / bin / golangci-lint
RUN --mount = type = cache، target = / root / .cache / go-build
--mount = type = cache، target = / root / .cache / golangci-lint
golangci -lint run --time 10m0s ./...ivals19659006 FrenchFROMociation19659008 دفاعscratchivals19659017ociationASociation19459010] bin-unix
COPY - از = ساخت / بیرون / مثال /
...

اکنون ما یک مرحله ی پایه-پایه داریم که یک تصویر مستعار برای تصویر golangci-lint است که حاوی آستری است که ما می خواهیم از آن استفاده کنیم. سپس ما مرحله ای از خط را می گذاریم که میخ را بچرخاند و یک حافظه پنهان را در جای صحیح نصب کنیم.

در مورد آزمایش های واحد ، می توانیم یک قانون برای ایجاد پوشش به Makefile اضافه کنیم. همچنین می توانیم از قاعده آزمون برای اجرای تست های لاینر و واحد استفاده کنیم:

همه: bin / مثال
test : lint unit-test

PLATFORM = local

.PHONY : بن / نمونه
بن / مثال :
@ docker build. --target bin
- output bin /
- platform $ { PLATFORM }

.PHONY : unit-test
واحد تست :
@ docker build. - واحد هدف آزمون

.PHONY : lint
lint :
@ docker build. - خط هدف

افزودن CI

اکنون که ما پلت فرم توسعه خود را در آن قرار داده ایم ، اضافه کردن CI برای پروژه ما واقعاً آسان است. ما فقط باید docker خود را بسازیم یا دستوراتی را از متن CI بسازیم. برای نشان دادن این موضوع ، از اقدامات GitHub استفاده خواهیم کرد. برای تنظیم این موضوع می توانیم از پرونده زیر .github / workflows / ci.yaml استفاده کنید:

نام : ادغام مداوم

در : [ push ]

مشاغل :
ci :
name ] CI
اجرا : ubuntu- آخرین
env :
DOCKER_BUILDKIT : "1" [19] :
- name : کد پرداخت
از استفاده می کند: action / checkout v v2 - name ]: linter run
run : make lint
- name : Test test واحد
run ]: واحد آزمایش
- name : Build Lin ux binary
run : make PLATFORM = linux / amd64
- name : Build binary binary
run : ساخت PLATFORM = windows / amd64

توجه كنيد كه دستوراتي كه بر روي CI اجرا مي كنيم با ​​دستورالعمل هايي كه از آنها بصورت محلي استفاده مي كنيم يكسان است و نيازي به انجام هر گونه پيكربندي ابزار ابزار نداريم چون همه چيز قبلاً در Dockerfile تعريف شده است.

آخرین بهینه سازی

با انجام یک کپی ، یک لایه اضافی در تصویر کانتینر ایجاد می کنید که همه چیز را کند می کند و از فضای اضافی دیسک استفاده می کند. این می تواند با استفاده از RUN --mount اجتناب شود و اتصال را از متن ساخت ، از یک مرحله یا یک تصویر ببندید. با استفاده از این الگوی ، Dockerfile حاصل به شرح زیر است:

# syntax = docker / dockerfile: 1-Experiment

FROM - platform = $ {BUILDPLATFORM} ] golang : 1.14.3-alpine AS base
WORKDIR / src
ENV CGO_ENABLED = 0
COPY [[45] 19659009] RUN go mod download

FROM base AS build
ARG TARGETOS
ARG [TARGETARCH] سوار = هدف =.
--mount = type = cache، target = / root / .cache / go-build
GOOS = $ {TARGETOS O GOARCH = $ {TARGETARCH} بروید -o / out / مثال. [19659006] FROM
base AS واحد-آزمون
RUN - سوار = هدف =.
--mount = type = cache، target = / root / .cache / go-build
go test -v.

FROM golangci / golangci-lint : v1. 27-آلپ AS lint-base

از پایه AS lint
RUN - mount = target =.
--mount = از = lint-base، src = / usr / bin / golangci-lint، target = / usr / bin / golangci-lint
--mount = type = cache، target = / root / .cache / go-build
--mount = type = cache، target = / root / .cache / golangci-lint
golangci-lint run - runout 10m0s. / ...

از خراش ع بن یونیکس
COPY - از = ساخت / بیرون / مثال /

FROM bin-unix AS بن لینوکس
از بن یونیکس ع بن darwin

از خراش ع بن [پنجره]

COPY - از = build / out / مثال /example.exeociation19659006պաներենFROMociation19659008 غلطین19659120--{{AR TARGETOS}}191965650165659977]ASAS[45454545454545]]] bin

نوع پیش فرض کوه ، کوه اتصال فقط خواندنی است از بستری که با دستور docker build عبور می کنید. این بدان معنی است که می توانید کپی را جایگزین کنید. با RUN --mount = هدف =. در هر کجا که برای اجرای یک دستور از پرونده های خود استفاده کنید ، اما نیازی به ماندن آنها در تصویر نهایی نیست. go / pkg / mod .

نتیجه گیری

این مجموعه از پست ها نشان داد که چگونه می توان یک محیط بهینه سازی شده توسعه یافته Go را به کار برد و سپس چگونگی استفاده از همین محیط را روی CI تنظیم کرد. تنها وابستگی هایی که دوست دارند در چنین پروژه ای توسعه یابند ، داکر است و این دومی است که به صورت اختیاری با یک زبان برنامه نویسی دیگر جایگزین می شود.

شما می توانید منبع این مثال را در GitHub من پیدا کنید: https: // github. com / chris-crone / containerized-go-dev

می توانید اطلاعات بیشتر در مورد نحو تجربی Dockerfile را در اینجا بخوانید: https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md

اگر علاقه مند به ساخت Docker هستید ، به مخزن Buildx بنگرید: https://github.com/docker/buildxociation19659129]