GitOps ããŒã«ã«ã€ããŠã¯ãã§ã«äœåºŠã話ããŸããã
ãµã€ãæ§é ã®åŸ®åŠãªéãã«èžã¿èŸŒã¿ãŸãããã¹ãŠã®ããŒãžã§ã³ã«å
±éã®ã¡ãã¥ãŒããªãªãŒã¹ã«é¢ããæ
å ±ãå«ãããŒãžãªã©ãçæããŸãã - æã
ã¯ããŸããã代ããã«ãåçã¢ã»ã³ããªã®åé¡ãšæ©èœãããã³ããã«ä»éãã CI/CD ããã»ã¹ã«å°ãçŠç¹ãåœãŠãŸãããã
ã¯ããã«: ãµã€ãã®ä»çµã¿
ãŸããwerf ããã¥ã¡ã³ãã¯ã³ãŒããšãšãã«ä¿åãããŸããããã«ãããäžè¬ã«ãã®èšäºã®ç¯å²ãè¶ ããç¹å®ã®éçºèŠä»¶ã課ããããŸãããå°ãªããšã次ã®ããšãèšããŸãã
- æ°ãã werf é¢æ°ã¯ããã¥ã¡ã³ããæŽæ°ããã«ãªãªãŒã¹ãã¹ãã§ã¯ãããŸãããéã«ãããã¥ã¡ã³ãã®å€æŽã¯ werf ã®æ°ããããŒãžã§ã³ã®ãªãªãŒã¹ãæå³ããŸãã
- ãã®ãããžã§ã¯ãã¯ããªãéäžçãªéçºãè¡ã£ãŠããŸããæ°ããããŒãžã§ã³ã¯ 1 æ¥ã«æ°åãªãªãŒã¹ãããããšããããŸãã
- æ°ããããŒãžã§ã³ã®ããã¥ã¡ã³ãã䜿çšããŠãµã€ããå±éããããã®æåæäœã¯ãå°ãªããšãé¢åã§ãã
- ãããžã§ã¯ãã¯ã»ãã³ãã£ãã¯ãªã¢ãããŒããæ¡çšããŠããŸã
ããŒãžã§ã³ç®¡ç ã5ã€ã®å®å®æ§ãã£ã³ãã«ãåããŠããŸãããªãªãŒã¹ ããã»ã¹ã§ã¯ãå®å®æ§ãé«ãŸãé ã«ãã£ãã«ãä»ããŠããŒãžã§ã³ãé 次ééãããŸããã€ãŸããã¢ã«ãã¡çããç€ç³çãŸã§ã§ãã - ãã®ãµã€ãã«ã¯ãã·ã¢èªçããããã¡ã€ã³ (è±èª) ããŒãžã§ã³ãšäžŠè¡ããŠãåç¶ããã³çºå±ãããŠããŸã (ã€ãŸããã³ã³ãã³ããæŽæ°ãããŠããŸã)ã
ãã®ãã€ã³ããŒãããã³ãããã¹ãŠãŠãŒã¶ãŒããé ãããã¡ããã©ããããã®ãæäŸããããã«ãç§ãã¡ã¯æ¬¡ã®ããšãè¡ããŸããã å¥åã® werf ã€ã³ã¹ããŒã«ããã³æŽæ°ããŒã« - ã§ã
Web ãµã€ãã®ããŒãžã§ã³éžæã¡ãã¥ãŒã§ã¯ãåãã£ãã«ã® werf ã®ææ°ããŒãžã§ã³ãå
¥æå¯èœã§ããããã©ã«ãã§ã¯ãã¢ãã¬ã¹ã«ãã£ãŠ
åèšãããšããã®ãµã€ãã§ã¯æ¬¡ã®ããŒãžã§ã³ãå©çšå¯èœã§ãã
- root (ããã©ã«ãã§éããŸã)ã
- åãªãªãŒã¹ã®ã¢ã¯ãã£ããªæŽæ°ãã£ãã«ããšã« (ããšãã°ã
werf.io/v1.0-ããŒã¿ ).
ãµã€ãã®ç¹å®ã®ããŒãžã§ã³ãçæããã«ã¯ãéåžžã次ã®ããã«ã³ã³ãã€ã«ããã ãã§ååã§ãã /docs
werfãªããžããªå¯Ÿå¿ã³ãã³ã(jekyll build
)ãå¿
èŠãªããŒãžã§ã³ã® Git ã¿ã°ã«åãæ¿ããåŸã
ããšã¯æ¬¡ã®ããšãä»ãå ããã ãã§ãã
- ãŠãŒãã£ãªãã£èªäœ (werf) ãã¢ã»ã³ããªã«äœ¿çšãããŸãã
- CI/CD ããã»ã¹ã¯ GitLab CI ã«åºã¥ããŠæ§ç¯ãããŠããŸãã
- ãã¡ããããããã¯ãã¹ãŠ Kubernetes ã§å®è¡ãããŸãã
ã¿ã¹ã¯
ããã§ã説æãããŠãããã¹ãŠã®è©³çŽ°ãèæ ®ããŠã¿ã¹ã¯ãäœæããŸãããã
- æŽæ°ãã£ãã«ã§ wef ããŒãžã§ã³ãå€æŽããåŸ ãµã€ãäžã®ããã¥ã¡ã³ãã¯èªåçã«æŽæ°ãããå¿ èŠããããŸã.
- éçºã®ããã«ã¯ã次ã®ããšãã§ããå¿ èŠããããŸãã ãµã€ãã®ãã¬ãã¥ãŒ ããŒãžã§ã³ã衚瀺ãã.
察å¿ãã Git ã¿ã°ããä»»æã®ãã£ãã«ã®ããŒãžã§ã³ãå€æŽããåŸããµã€ããåã³ã³ãã€ã«ããå¿ èŠããããŸãããã€ã¡ãŒãžãæ§ç¯ããéçšã§æ¬¡ã®æ©èœãåŸãããŸãã
- ãã£ãã«äžã®ããŒãžã§ã³ã®ãªã¹ãã¯å€æŽããããããããŒãžã§ã³ãå€æŽããããã£ãã«ã®ããã¥ã¡ã³ããåæ§ç¯ããã ãã§æžã¿ãŸããçµå±ã®ãšããããã¹ãŠãåæ§ç¯ããã®ã¯ããŸãè¯ãããšã§ã¯ãããŸããã
- ãªãªãŒã¹ã®ãã£ãã«ã®ã»ããã¯å€æŽãããå ŽåããããŸããããšãã°ãããæç¹ã§ã¯ãæ©æã¢ã¯ã»ã¹ 1.1 ãªãªãŒã¹ãããå®å®ããããŒãžã§ã³ããã£ãã«äžã«ååšããªãå¯èœæ§ããããŸãããæéã®çµéãšãšãã«ãããã衚瀺ãããããã«ãªããŸãããã®å Žåãã¢ã»ã³ããªãæåã§å€æŽããå¿ èŠã¯ãããŸããã?
ããã¯ãããšãå€æ ã¢ã»ã³ããªã¯å€éšããŒã¿ã®å€æŽã«äŸåããŸã.
å ·çŸå
ã¢ãããŒãã®éžæ
ãããã¯ãå¿ èŠãªåããŒãžã§ã³ã Kubernetes ã®åå¥ã®ããããšããŠå®è¡ã§ããŸãããã®ãªãã·ã§ã³ã¯ãã¯ã©ã¹ã¿ãŒå ã®ãªããžã§ã¯ãã®æ°ãå¢ããããšãæå³ããå®å®ãã werf ãªãªãŒã¹ã®æ°ãå¢ããã«ã€ããŠå¢å ããŸãããããŠãããã¯ãããè€éãªã¡ã³ããã³ã¹ãæå³ããŸããåããŒãžã§ã³ã«ã¯ç¬èªã® HTTP ãµãŒããŒããããè² è·ã¯ãããã§ãããã¡ãããããã«ã¯ããå€ãã®ãªãœãŒã¹ã³ã¹ããããããŸãã
ç§ãã¡ã¯åãéããã©ããŸãã å¿ èŠãªãã¹ãŠã®ããŒãžã§ã³ã 1 ã€ã®ã€ã¡ãŒãžã«ãŸãšããŸãããµã€ãã®ãã¹ãŠã®ããŒãžã§ã³ã®ã³ã³ãã€ã«ãããéçæ å ±ã¯ NGINX ã®ã³ã³ãããŒã«é 眮ããã察å¿ãããããã€ã¡ã³ããžã®ãã©ãã£ãã¯ã¯ NGINX Ingress çµç±ã§éä¿¡ãããŸããã·ã³ãã«ãªæ§é (ã¹ããŒãã¬ã¹ ã¢ããªã±ãŒã·ã§ã³) ã«ãããKubernetes èªäœã䜿çšã㊠(è² è·ã«å¿ããŠ) ãããã€ã¡ã³ããç°¡åã«ã¹ã±ãŒã«ã§ããŸãã
ããæ£ç¢ºã«ã¯ã2 ã€ã®ã€ã¡ãŒãžãåéããŠããŸãã1 ã€ã¯å®çšŒååè·¯çšã§ã2 çªç®ã¯éçºåè·¯çšã®è¿œå ã€ã¡ãŒãžã§ããè¿œå ã®ã€ã¡ãŒãžã¯ãã¡ã€ã³ã®ã€ã¡ãŒãžãšãšãã«éçºåç·ã§ã®ã¿äœ¿çš (èµ·å) ãããã¬ãã¥ãŒ ã³ãããããã®ãµã€ãã®ããŒãžã§ã³ãå«ãŸããŠããããããã®éã®ã«ãŒãã£ã³ã°ã¯ Ingress ãªãœãŒã¹ã䜿çšããŠå®è¡ãããŸãã
werf vs git ã¯ããŒã³ãšã¢ãŒãã£ãã¡ã¯ã
ãã§ã«è¿°ã¹ãããã«ãããã¥ã¡ã³ãã®ç¹å®ã®ããŒãžã§ã³ã®ãµã€ãéçæ å ±ãçæããã«ã¯ãé©åãªãªããžã㪠ã¿ã°ã«åãæ¿ããŠãã«ãããå¿ èŠããããŸãããã«ããããã³ã«ãªããžããªã®ã¯ããŒã³ãäœæãããªã¹ãããé©åãªã¿ã°ãéžæããããšã«ãã£ãŠãããè¡ãããšãã§ããŸãããã ããããã¯ããªããªãœãŒã¹ã倧éã«æ¶è²»ããæäœã§ãããããã«ãéèŠãªåœä»€ãèšè¿°ããå¿ èŠããããŸã...ãã 1 ã€ã®é倧ãªæ¬ ç¹ã¯ããã®ã¢ãããŒãã§ã¯ã¢ã»ã³ããªäžã«äœãããã£ãã·ã¥ããæ¹æ³ããªãããšã§ãã
ããã§ã¯ãwerf ãŠãŒãã£ãªãã£èªäœã圹ã«ç«ã¡ã以äžãå®è£
ããŸãã ã¹ããŒããã£ãã·ã³ã° ãããŠããªãã«äœ¿çšãèš±å¯ããŸã fetch
å¿
èŠã§ããã°ãããã«ããªããžããªããããŒã¿ãè¿œå ãããšãã«ãå¿
èŠãªãã£ã¬ã¯ããªã®ã¿ãéžæã§ããŸã (ãã®å Žåãããã¯ãã£ã¬ã¯ããªã§ã) docs
ïŒãè¿œå ãããããŒã¿ã®éã倧å¹
ã«åæžãããŸãã
Jekyll ã¯éçããŒã¿ãã³ã³ãã€ã«ããããã«èšèšãããããŒã«ã§ãããæçµã€ã¡ãŒãžã«ã¯å¿
èŠãªããããã§ã³ã³ãã€ã«ããã®ãè«ççã§ãã
werf.yaml ãæžããŸã
ããã§ãåããŒãžã§ã³ãåå¥ã® werf ã¢ãŒãã£ãã¡ã¯ãã«ã³ã³ãã€ã«ããããšã«ããŸãããããããç§ãã¡ã¯ çµã¿ç«ãŠäžã«ãããã®ã¢ãŒãã£ãã¡ã¯ããã©ãã ãçºçãããã¯ããããŸãããã®ãããåºå®ã®ãã«ãæ§æãäœæããããšã¯ã§ããŸãã (å³å¯ã«èšãã°ããŸã äœæã§ããŸãããå®å šã«å¹æãããããã§ã¯ãããŸãã)ã
werf ã䜿çšãããšã werf.yaml
)ãããã«ããå¯èœã«ãªããŸã ãªã³ã¶ãã©ã€ã§æ§æãçæãã å€éšããŒã¿ïŒå¿
èŠãªãã®ïŒã«å¿ããŠããã®å Žåã®å€éšããŒã¿ã¯ãããŒãžã§ã³ãšãªãªãŒã¹ã«é¢ããæ
å ±ã§ãããããã«åºã¥ããŠå¿
èŠãªæ°ã®ã¢ãŒãã£ãã¡ã¯ããåéãããã®çµæã次㮠2 ã€ã®ã€ã¡ãŒãžãååŸããŸãã werf-doc
О werf-dev
ããŸããŸãªãµãŒãããã§èµ°è¡ããŸãã
å€éšããŒã¿ã¯ç°å¢å€æ°ãä»ããŠæž¡ãããŸãã圌ãã®æ§æã¯æ¬¡ã®ãšããã§ãã
-
RELEASES
â ãªãªãŒã¹ã®ãªã¹ããšã察å¿ãã werf ã®çŸåšã®ããŒãžã§ã³ãã次ã®åœ¢åŒã®å€ã®ã¹ããŒã¹åºåããªã¹ãã®åœ¢åŒã§å«ãè¡<ÐÐÐÐÐ _Ð ÐÐÐÐÐ>%<ÐÐÐÐÐ _ÐÐРСÐÐ>
ã äŸïŒ1.0%v1.0.4-beta.20
-
CHANNELS
â ãã£ãã«ã®ãªã¹ããšå¯Ÿå¿ãã werf ã®çŸåšã®ããŒãžã§ã³ãå«ãè¡ã次ã®åœ¢åŒã®å€ã®ã¹ããŒã¹åºåããªã¹ãã®åœ¢åŒã§ãã<ÐÐÐÐÐ>%<ÐÐÐÐÐ _ÐÐРСÐÐ>
ã äŸïŒ1.0-beta%v1.0.4-beta.20 1.0-alpha%v1.0.5-alpha.22
-
ROOT_VERSION
â ãµã€ãäžã«ããã©ã«ãã§è¡šç€ºããã werf ãªãªãŒã¹ ããŒãžã§ã³ (ããã¥ã¡ã³ããæãé«ããªãªãŒã¹çªå·ã§è¡šç€ºããå¿ èŠã¯å¿ ããããããŸãã)ãäŸïŒv1.0.4-beta.20
-
REVIEW_SHA
â ãã¹ãã«ãŒãçšã®ããŒãžã§ã³ãæ§ç¯ããããã«å¿ èŠãªã¬ãã¥ãŒã³ãããã®ããã·ã¥ã
ãããã®å€æ°ã¯ GitLab CI ãã€ãã©ã€ã³ã«å ¥åãããŸãããã®å ·äœçãªæ¹æ³ã¯ä»¥äžã§èª¬æããŸãã
ãŸã䟿å®äžã次ã®ããã«å®çŸ©ããŸãã werf.yaml
Go ãã³ãã¬ãŒãå€æ°ã«ç°å¢å€æ°ããå€ãå²ãåœãŠãŸãã
{{ $_ := set . "WerfVersions" (cat (env "CHANNELS") (env "RELEASES") | splitList " ") }}
{{ $Root := . }}
{{ $_ := set . "WerfRootVersion" (env "ROOT_VERSION") }}
{{ $_ := set . "WerfReviewCommit" (env "REVIEW_SHA") }}
ãµã€ãã®éçããŒãžã§ã³ãã³ã³ãã€ã«ããããã®ã¢ãŒãã£ãã¡ã¯ãã®èª¬æã¯ãéåžžãå¿
èŠãªãã¹ãŠã®ã±ãŒã¹ã§åãã§ã (ã«ãŒã ããŒãžã§ã³ãšéçºåè·¯ã®ããŒãžã§ã³ã®çæãå«ã)ããããã£ãŠãé¢æ°ã䜿çšããŠå¥ã®ãããã¯ã«ç§»åããŸãã define
- åŸã§åå©çšããããã«äœ¿çšããŸã include
ã次ã®åŒæ°ããã³ãã¬ãŒãã«æž¡ããŸãã
-
Version
- çæãããããŒãžã§ã³ (ã¿ã°å); -
Channel
â ã¢ãŒãã£ãã¡ã¯ããçæãããæŽæ°ãã£ãã«ã®ååã -
Commit
â ã¬ãã¥ãŒã³ãããçšã«ã¢ãŒãã£ãã¡ã¯ããçæãããå Žåã¯ãã³ãããããã·ã¥ã - ã³ã³ãã¯ã¹ãã
ã¢ãŒãã£ãã¡ã¯ããã³ãã¬ãŒãã®èª¬æ
{{- define "doc_artifact" -}}
{{- $Root := index . "Root" -}}
artifact: doc-{{ .Channel }}
from: jekyll/builder:3
mount:
- from: build_dir
to: /usr/local/bundle
ansible:
install:
- shell: |
export PATH=/usr/jekyll/bin/:$PATH
- name: "Install Dependencies"
shell: bundle install
args:
executable: /bin/bash
chdir: /app/docs
beforeSetup:
{{- if .Commit }}
- shell: echo "Review SHA - {{ .Commit }}."
{{- end }}
{{- if eq .Channel "root" }}
- name: "releases.yml HASH: {{ $Root.Files.Get "releases.yml" | sha256sum }}"
copy:
content: |
{{ $Root.Files.Get "releases.yml" | indent 8 }}
dest: /app/docs/_data/releases.yml
{{- else }}
- file:
path: /app/docs/_data/releases.yml
state: touch
{{- end }}
- file:
path: "{{`{{ item }}`}}"
state: directory
mode: 0777
with_items:
- /app/main_site/
- /app/ru_site/
- file:
dest: /app/docs/pages_ru/cli
state: link
src: /app/docs/pages/cli
- shell: |
echo -e "werfVersion: {{ .Version }}nwerfChannel: {{ .Channel }}" > /tmp/_config_additional.yml
export PATH=/usr/jekyll/bin/:$PATH
{{- if and (ne .Version "review") (ne .Channel "root") }}
{{- $_ := set . "BaseURL" ( printf "v%s" .Channel ) }}
{{- else if ne .Channel "root" }}
{{- $_ := set . "BaseURL" .Channel }}
{{- end }}
jekyll build -s /app/docs -d /app/_main_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/tmp/_config_additional.yml
jekyll build -s /app/docs -d /app/_ru_site/{{ if .BaseURL }} --baseurl /{{ .BaseURL }}{{ end }} --config /app/docs/_config.yml,/app/docs/_config_ru.yml,/tmp/_config_additional.yml
args:
executable: /bin/bash
chdir: /app/docs
git:
- url: https://github.com/flant/werf.git
to: /app/
owner: jekyll
group: jekyll
{{- if .Commit }}
commit: {{ .Commit }}
{{- else }}
tag: {{ .Version }}
{{- end }}
stageDependencies:
install: ['docs/Gemfile','docs/Gemfile.lock']
beforeSetup: '**/*'
includePaths: 'docs'
excludePaths: '**/*.sh'
{{- end }}
ã¢ãŒãã£ãã¡ã¯ãåã¯äžæã§ããå¿
èŠããããŸããããã¯ãããšãã°ããã£ãã«å (å€æ°ã®å€) ãè¿œå ããããšã§å®çŸã§ããŸãã .Channel
) ãã¢ãŒãã£ãã¡ã¯ãåã®æ¥å°ŸèŸãšããŠäœ¿çšããŸãã artifact: doc-{{ .Channel }}
ããã ããã¢ãŒãã£ãã¡ã¯ãããã€ã³ããŒãããå Žåã¯ãåãååãåç
§ããå¿
èŠãããããšãç解ããå¿
èŠããããŸãã
ã¢ãŒãã£ãã¡ã¯ããèšè¿°ããéã«ã¯ã次㮠werf æ©èœã䜿çšãããŸãã build_dir
ãã€ãã©ã€ã³ã®å®è¡ã®éã« Jekyll ãã£ãã·ã¥ãä¿åã§ããŸãã åçµã¿ç«ãŠã倧å¹
ã«ã¹ããŒãã¢ãã.
ãã¡ã€ã«ã®äœ¿çšã«ãæ°ã¥ãããããããŸãã releases.yml
ãããªã¯ãšã¹ãããããªãªãŒã¹ ããŒã¿ãå«ã YAML ãã¡ã€ã«ã§ã
ããã¯æ¡ä»¶æã䜿çšããŠå®è£
ãããŸã if
Go ã®ãã³ãã¬ãŒããšãã¶ã€ã³ {{ $Root.Files.Get "releases.yml" | sha256sum }}
ã¹ããŒãžã§ .Channel
çãã root
) ãã¡ã€ã«ããã·ã¥ releases.yml
Ansible ã¿ã¹ã¯ã®ååã®äžéšã§ãããããã¹ããŒãžå
šäœã®çœ²åã«åœ±é¿ããŸã (ãã©ã¡ãŒã¿ãŒ name
ïŒããããã£ãŠãå€æŽãããšãã¯ã ã³ã³ãã³ã ãã¡ã€ã« releases.yml
察å¿ããã¢ãŒãã£ãã¡ã¯ããåçµã¿ç«ãŠãããŸãã
å€éšãªããžããªã®æäœã«ã泚æããŠãã ãããããã®ã¢ãŒãã£ãã¡ã¯ãã®ã€ã¡ãŒãžã§ /docs
ãæž¡ããããã©ã¡ãŒã¿ã«å¿ããŠãå¿
èŠãªã¿ã°ãŸãã¯ã¬ãã¥ãŒã³ãããã®ããŒã¿ãããã«è¿œå ãããŸãã
ã¢ãŒãã£ãã¡ã¯ã ãã³ãã¬ãŒãã䜿çšããŠããã£ãã«ãšãªãªãŒã¹ã®è»¢éãããããŒãžã§ã³ã®ã¢ãŒãã£ãã¡ã¯ãã®èª¬æãçæããã«ã¯ãå€æ°ã®ã«ãŒããç·šæããŸãã .WerfVersions
в werf.yaml
:
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ dict "Version" $VersionsDict._1 "Channel" $VersionsDict._0 "Root" $Root | include "doc_artifact" }}
---
{{ end -}}
ãªããªãã«ãŒãã¯ããã€ãã®ã¢ãŒãã£ãã¡ã¯ããçæããŸã (ããã§ããããšãé¡ã£ãŠããŸã)ããããã®éã®åºåãæåãã€ãŸãã·ãŒã±ã³ã¹ãèæ
®ããå¿
èŠããããŸãã ---
(æ§æãã¡ã€ã«ã®æ§æã®è©³çŽ°ã«ã€ããŠã¯ãã
åæ§ã«ãã«ãŒãã¯ãããŸããããã«ãŒã ããŒãžã§ã³ãšã¬ãã¥ãŒ ã³ãããããã®ããŒãžã§ã³ã®ãç¹å¥ãªå Žåãã«ã¢ãŒãã£ãã¡ã¯ã ãã³ãã¬ãŒããåŒã³åºããŸãã
{{ dict "Version" .WerfRootVersion "Channel" "root" "Root" $Root | include "doc_artifact" }}
---
{{- if .WerfReviewCommit }}
{{ dict "Version" "review" "Channel" "review" "Commit" .WerfReviewCommit "Root" $Root | include "doc_artifact" }}
{{- end }}
ã¬ãã¥ãŒã³ãããã®ã¢ãŒãã£ãã¡ã¯ãã¯ãå€æ°ãèšå®ãããŠããå Žåã«ã®ã¿æ§ç¯ãããããšã«æ³šæããŠãã ããã .WerfReviewCommit
.
ã¢ãŒãã£ãã¡ã¯ãã®æºåãã§ããŸãããã€ã³ããŒããéå§ããŸãã
Kubernetes äžã§å®è¡ããããã«èšèšãããæçµã€ã¡ãŒãžã¯ããµãŒããŒæ§æãã¡ã€ã«ãè¿œå ãããéåžžã® NGINX ã§ãã nginx.conf
ãããŠã¢ãŒãã£ãã¡ã¯ãããã®éé»æ°ããµã€ãã®ã«ãŒã ããŒãžã§ã³ã®ã¢ãŒãã£ãã¡ã¯ãã«å ããŠãå€æ°ã«å¯ŸããŠã«ãŒããç¹°ãè¿ãå¿
èŠããããŸãã .WerfVersions
ãã£ãã«ããã³ãªãªãŒã¹ ããŒãžã§ã³ã®ã¢ãŒãã£ãã¡ã¯ããã€ã³ããŒããã以åã«æ¡çšããã¢ãŒãã£ãã¡ã¯ãã®åœåèŠåã«åŸããŸããåã¢ãŒãã£ãã¡ã¯ãã«ã¯ 2 ã€ã®èšèªã®ãµã€ãã®ããŒãžã§ã³ãä¿åãããŠãããããããããæ§æã§æå®ãããå Žæã«ã€ã³ããŒãããŸãã
æçµã€ã¡ãŒãžã®èª¬æ werf-doc
image: werf-doc
from: nginx:stable-alpine
ansible:
setup:
- name: "Setup /etc/nginx/nginx.conf"
copy:
content: |
{{ .Files.Get ".werf/nginx.conf" | indent 8 }}
dest: /etc/nginx/nginx.conf
- file:
path: "{{`{{ item }}`}}"
state: directory
mode: 0777
with_items:
- /app/main_site/assets
- /app/ru_site/assets
import:
- artifact: doc-root
add: /app/_main_site
to: /app/main_site
before: setup
- artifact: doc-root
add: /app/_ru_site
to: /app/ru_site
before: setup
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
add: /app/_main_site
to: /app/main_site/v{{ $Channel }}
before: setup
{{ end -}}
{{ range .WerfVersions -}}
{{ $VersionsDict := splitn "%" 2 . -}}
{{ $Channel := $VersionsDict._0 -}}
{{ $Version := $VersionsDict._1 -}}
- artifact: doc-{{ $Channel }}
add: /app/_ru_site
to: /app/ru_site/v{{ $Channel }}
before: setup
{{ end -}}
è¿œå ã®ã€ã¡ãŒãžã¯ãã¡ã€ã³ã®ã€ã¡ãŒãžãšãšãã«éçºåè·¯äžã§èµ·åãããŸããããµã€ãã® 2 ã€ã®ããŒãžã§ã³ã®ã¿ãå«ãŸããŠããŸããã¬ãã¥ãŒ ã³ãããããã®ããŒãžã§ã³ãšããµã€ãã®ã«ãŒã ããŒãžã§ã³ã§ã (äžè¬çãªã¢ã»ãããšãèŠããŠããã®ã§ããã°ã ããªãªãŒã¹ããŒã¿ïŒããããã£ãŠãè¿œå ã®ã€ã¡ãŒãžã¯ã€ã³ããŒã ã»ã¯ã·ã§ã³ (ãããŠãã¡ããåå) ãã¡ã€ã³ã®ã€ã¡ãŒãžãšç°ãªããŸãã
image: werf-dev
...
import:
- artifact: doc-root
add: /app/_main_site
to: /app/main_site
before: setup
- artifact: doc-root
add: /app/_ru_site
to: /app/ru_site
before: setup
{{- if .WerfReviewCommit }}
- artifact: doc-review
add: /app/_main_site
to: /app/main_site/review
before: setup
- artifact: doc-review
add: /app/_ru_site
to: /app/ru_site/review
before: setup
{{- end }}
äžã§è¿°ã¹ãããã«ãã¬ãã¥ãŒã³ãããã®ã¢ãŒãã£ãã¡ã¯ãã¯ãèšå®ãããç°å¢å€æ°ãå®è¡ãããå Žåã«ã®ã¿çæãããŸãã REVIEW_SHA
ãç°å¢å€æ°ããªãå Žåãwerf-dev ã€ã¡ãŒãžããŸã£ããçæããªãå¯èœæ§ããããŸãã REVIEW_SHA
ããããããã®ããã«ã¯
çµã¿ç«ãŠã®æºåã¯å®äºã§ãïŒ CI/CD ãšéèŠãªãã¥ã¢ã³ã¹ã«ç§»ããŸãããã
GitLab CI ã®ãã€ãã©ã€ã³ãšåçãã«ãã®æ©èœ
ãã«ããå®è¡ãããšãã¯ãã§äœ¿çšãããç°å¢å€æ°ãèšå®ããå¿
èŠããããŸãã werf.yaml
ãããã¯ãGitHub ããã¯ãããã€ãã©ã€ã³ãåŒã³åºããšãã«èšå®ãã REVIEW_SHA å€æ°ã«ã¯é©çšãããŸããã
å¿
èŠãªå€éšããŒã¿ã Bash ã¹ã¯ãªããã§çæããŸãã generate_artifacts
ããã«ããã2 ã€ã® GitLab ãã€ãã©ã€ã³ ã¢ãŒãã£ãã¡ã¯ããçæãããŸãã
- Ñайл
releases.yml
ãªãªãŒã¹ããŒã¿ä»ãã - Ñайл
common_envs.sh
ããšã¯ã¹ããŒããããç°å¢å€æ°ãå«ãŸããŠããŸãã
ãã¡ã€ã«ã®å
容 generate_artifacts
ããªãã¯ç§ãã¡ã®äžã§èŠã€ããã§ããã common_envs.sh
ã¯ç§ãã¡ã«ãšã£ãŠéèŠã§ãããªããªãwerf ã®ä»äºã¯ããã«äŸåããŸãããã®å
容ã®äŸ:
export RELEASES='1.0%v1.0.6-4'
export CHANNELS='1.0-alpha%v1.0.7-1 1.0-beta%v1.0.7-1 1.0-ea%v1.0.6-4 1.0-stable%v1.0.6-4 1.0-rock-solid%v1.0.6-4'
export ROOT_VERSION='v1.0.6-4'
ãã®ãããªã¹ã¯ãªããã®åºåã¯ãããšãã° Bash é¢æ°ã䜿çšããŠäœ¿çšã§ããŸãã source
.
ããããã楜ããéšåã§ããã¢ããªã±ãŒã·ã§ã³ã®ãã«ããšãããã€ã®äž¡æ¹ãæ£ããæ©èœããã«ã¯ã次ã®ããšã確èªããå¿
èŠããããŸãã werf.yaml
ããã§ãã åã å°ãªããšã 1 ã€ã®ãã€ãã©ã€ã³å
ã§ããã®æ¡ä»¶ãæºããããªãå Žåãwerf ãçµã¿ç«ãŠäžãå±éäžãªã©ã«èšç®ããã¹ããŒãžã®çœ²åã¯ç°ãªããŸããããã¯ãããã€ã¡ã³ã ãšã©ãŒã«ã€ãªãããŸãããªããªã...ãããã€ã¡ã³ãã«å¿
èŠãªã€ã¡ãŒãžãæ¬ èœããŸãã
ã€ãŸãããµã€ã ã€ã¡ãŒãžã®ã¢ã»ã³ããªäžã«ãªãªãŒã¹ãšããŒãžã§ã³ã«é¢ããæ å ±ãåãã§ãå±éæã«æ°ããããŒãžã§ã³ããªãªãŒã¹ãããç°å¢å€æ°ã®å€ãç°ãªãå Žåãå±éã¯ãšã©ãŒã§å€±æããŸããçµå±ã®ãšãããæ°ããããŒãžã§ã³ã®ã¢ãŒãã£ãã¡ã¯ãã¯ãŸã æ§ç¯ãããŠããŸããã
äžä»£ã®å Žå werf.yaml
å€éšããŒã¿ (ããšãã°ãä»åã®å Žåã®ããã«çŸåšã®ããŒãžã§ã³ã®ãªã¹ã) ã«äŸåããå Žåããã®ãããªããŒã¿ã®æ§æãšå€ããã€ãã©ã€ã³å
ã«èšé²ããå¿
èŠããããŸããããã¯ãå€éšãã©ã¡ãŒã¿ãé »ç¹ã«å€æŽãããå Žåã«ç¹ã«éèŠã§ãã
ç§ãã¡ã¯ å€éšããŒã¿ãåä¿¡ããŠââèšé²ãã GitLab ã®ãã€ãã©ã€ã³ã®æåã®æ®µé (ããªãã«ãïŒãããŠããããããã«ãã©ãŒã ã§éä¿¡ããŸã GitLab CI ã¢ãŒãã£ãã¡ã¯ããããã«ãããåãæ§æã§ãã€ãã©ã€ã³ ãžã§ã (ãã«ãããããã€ãã¯ãªãŒã³ã¢ãã) ãå®è¡ããã³åéã§ããããã«ãªããŸãã werf.yaml
.
ã¹ããŒãžã®å
容 ããªãã«ã ãã¡ã€ã« .gitlab-ci.yml
:
Prebuild:
stage: prebuild
script:
- bash ./generate_artifacts 1> common_envs.sh
- cat ./common_envs.sh
artifacts:
paths:
- releases.yml
- common_envs.sh
expire_in: 2 week
ã¢ãŒãã£ãã¡ã¯ãå ã®å€éšããŒã¿ããã£ããã£ããããæšæºã® GitLab CI ãã€ãã©ã€ã³ ã¹ããŒãžã§ãããã«ããšãããã€ã䜿çšããŠãã«ããšãããã€ãè¡ãããšãã§ããŸãã GitHub werf ãªããžããªããã®ããã¯ã䜿çšããŠãã€ãã©ã€ã³èªäœãèµ·åããŸã (ã€ãŸããGitHub äžã®ãªããžããªã«å€æŽããã£ãå Žå)ããããã®ããŒã¿ã¯ãã»ã¯ã·ã§ã³ã® GitLab ãããžã§ã¯ã ããããã£ã«ãããŸãã CI/CD èšå® -> ãã€ãã©ã€ã³ ããªã¬ãŒã次ã«ã察å¿ãã Webhook ã GitHub ã«äœæããŸã (èšå® -> Webhook).
ãã«ãã¹ããŒãžã¯æ¬¡ã®ããã«ãªããŸãã
Build:
stage: build
script:
- type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
- type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
- source common_envs.sh
- werf build-and-publish --stages-storage :local
except:
refs:
- schedules
dependencies:
- Prebuild
GitLab ã¯ã¹ããŒãžãããã«ãã¹ããŒãžã« 2 ã€ã®ã¢ãŒãã£ãã¡ã¯ããè¿œå ããŸã ããªãã«ããããã£ãŠã次ã®æ§æã䜿çšããŠãæºåãããå
¥åããŒã¿ãå«ãå€æ°ããšã¯ã¹ããŒãããŸãã source common_envs.sh
ãã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠãã€ãã©ã€ã³ãèµ·åããå Žåãé€ãããã¹ãŠã®ã±ãŒã¹ã§ãã«ã ã¹ããŒãžãéå§ããŸããã¹ã±ãžã¥ãŒã«ã«åŸã£ãŠãã¯ãªãŒãã³ã°çšã®ãã€ãã©ã€ã³ãå®è¡ããŸãããã®å Žåãçµã¿ç«ãŠãè¡ãå¿
èŠã¯ãããŸããã
ãããã€ã¡ã³ã段éã§ã¯ãYAML ãã³ãã¬ãŒãã䜿çšããŠãéçšåç·ãšéçºåç·ãžã®ãããã€ã¡ã³ãã«åã㊠2 ã€ã®ã¿ã¹ã¯ã説æããŸãã
.base_deploy: &base_deploy
stage: deploy
script:
- type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
- type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
- source common_envs.sh
- werf deploy --stages-storage :local
dependencies:
- Prebuild
except:
refs:
- schedules
Deploy to Production:
<<: *base_deploy
variables:
WERF_KUBE_CONTEXT: prod
environment:
name: production
url: werf.io
only:
refs:
- master
except:
variables:
- $REVIEW_SHA
refs:
- schedules
Deploy to Test:
<<: *base_deploy
variables:
WERF_KUBE_CONTEXT: dev
environment:
name: test
url: werf.test.flant.com
except:
refs:
- schedules
only:
variables:
- $REVIEW_SHA
ãããã®ã¿ã¹ã¯ã¯åºæ¬çã«ãwerf ããããã€ã¡ã³ããå®è¡ããã¯ã©ã¹ã¿ ã³ã³ããã¹ãã瀺ãç¹ã ããç°ãªããŸã (WERF_KUBE_CONTEXT
)ãã«ãŒãç°å¢å€æ°ã®èšå® (environment.name
О environment.url
)ãããã㯠Helm ãã£ãŒã ãã³ãã¬ãŒãã§äœ¿çšãããŸãããã³ãã¬ãŒãã®å
容ã¯æäŸããŸããããªããªã...åé¡ã®ãããã¯ã«é¢ããŠèå³æ·±ããã®ã¯äœããããŸãããã次ã®å Žæã§èŠã€ããããšãã§ããŸãã
æåŸã®ä»äžã
werf ããŒãžã§ã³ã¯é »ç¹ã«ãªãªãŒã¹ããããããæ°ããã€ã¡ãŒãžãé »ç¹ã«æ§ç¯ãããDocker ã¬ãžã¹ããªã¯åžžã«å¢å ããŸãããããã£ãŠãããªã·ãŒã«åºã¥ããŠèªåã€ã¡ãŒãž ã¯ãªãŒã³ã¢ãããæ§æããããšãäžå¯æ¬ ã§ããããæ¹ã¯ãšãŠãç°¡åã§ãã
å®è£ ããã«ã¯æ¬¡ã®ãã®ãå¿ èŠã§ãã
- ã¯ãªãŒãã³ã°æé ãè¿œå ãã
.gitlab-ci.yml
; - ã¯ãªãŒãã³ã°ã¿ã¹ã¯ã®å®æçãªå®è¡ãè¿œå ããŸãã
- æžã蟌ã¿ã¢ã¯ã»ã¹ ããŒã¯ã³ã䜿çšããŠç°å¢å€æ°ãèšå®ããŸãã
ã¯ãªãŒãã³ã°ã¹ããŒãžã®è¿œå .gitlab-ci.yml
:
Cleanup:
stage: cleanup
script:
- type multiwerf && . $(multiwerf use 1.0 alpha --as-file)
- type werf && source <(werf ci-env gitlab --tagging-strategy tag-or-branch --verbose)
- source common_envs.sh
- docker login -u nobody -p ${WERF_IMAGES_CLEANUP_PASSWORD} ${WERF_IMAGES_REPO}
- werf cleanup --stages-storage :local
only:
refs:
- schedules
ãã®ã»ãšãã©ãã¹ãŠãããå°ã詳ãã説æããŸãããã¯ãªãŒã³ã¢ããããå Žåã®ã¿ãæåã« Docker ã¬ãžã¹ããªå
ã®ã€ã¡ãŒãžãåé€ããæš©éãæã€ããŒã¯ã³ã䜿çšã㊠Docker ã¬ãžã¹ããªã«ãã°ã€ã³ããå¿
èŠããããŸã (èªåçã«çºè¡ããã GitLab CI ã¿ã¹ã¯ ããŒã¯ã³ã«ã¯æš©éããããŸãã)ããã®ãããªæš©å©ãæã£ãŠããŸãïŒãäºåã«GitLabã§ããŒã¯ã³ãäœæãããã®å€ãç°å¢å€æ°ã«æå®ããå¿
èŠããããŸã WERF_IMAGES_CLEANUP_PASSWORD
ãããžã§ã¯ã (CI/CD èšå® -> å€æ°).
å¿
èŠãªã¹ã±ãžã¥ãŒã«ãå«ãã¯ãªãŒãã³ã° ã¿ã¹ã¯ã®è¿œå ã¯ã CI/CD ->
æ¥çš.
以äžã§ããDocker ã¬ãžã¹ããªå ã®ãããžã§ã¯ãã¯ãæªäœ¿çšã®ã€ã¡ãŒãžããç¶ç¶çã«æé·ããããšããªããªããŸãã
å®è·µçãªéšåã®æåŸã«ããã®èšäºã®å®å
šãªãªã¹ãã¯æ¬¡ã®ãªã³ã¯ããå
¥æã§ããããšãæãåºããŠãã ããã
çµæ
- ããŒãžã§ã³ããšã« 1 ã€ã®ã¢ãŒãã£ãã¡ã¯ããšããè«çã¢ã»ã³ããªæ§é ãåãåããŸããã
- ã¢ã»ã³ããªã¯ãŠãããŒãµã«ã§ãããwerf ã®æ°ããããŒãžã§ã³ããªãªãŒã¹ããããšãã«æåã§å€æŽããå¿ èŠã¯ãããŸãããWeb ãµã€ãäžã®ããã¥ã¡ã³ãã¯èªåçã«æŽæ°ãããŸãã
- 2 ã€ã®ç»åãç°ãªã茪éã«å¯ŸããŠçµã¿ç«ãŠãããŠããŸãã
- äœæ¥ãæ©ãã®ã§ããã£ãã·ã¥ã¯å¯èœãªéã䜿çšãããŸããwerf ã®æ°ããããŒãžã§ã³ããªãªãŒã¹ãããããã¬ãã¥ãŒ ã³ãããã®ããã« GitHub ããã¯ãåŒã³åºããããšããå€æŽãããããŒãžã§ã³ã®å¯Ÿå¿ããã¢ãŒãã£ãã¡ã¯ãã®ã¿ãåæ§ç¯ãããŸãã
- æªäœ¿çšã®ã€ã¡ãŒãžã®åé€ã«ã€ããŠèããå¿ èŠã¯ãããŸãããwerf ããªã·ãŒã«åŸã£ãŠã¯ãªãŒãã³ã°ãããšãDocker ã¬ãžã¹ããªãæ£åžžã«ä¿ãããŸãã
æèŠ
- werf ã䜿çšãããšãã¢ã»ã³ããªèªäœã®ãã£ãã·ã¥ãšå€éšãªããžããªãæäœãããšãã®ãã£ãã·ã¥ã®äž¡æ¹ã«ãããã¢ã»ã³ããªãè¿ éã«åäœãããããšãã§ããŸãã
- å€éš Git ãªããžããªã䜿çšãããšãæ¯åãªããžããªå
šäœã®ã¯ããŒã³ãäœæããããé£ããæé©åããžãã¯ã䜿çšããŠè»èŒªãåçºæãããããå¿
èŠããªããªããŸãã werf ã¯ãã£ãã·ã¥ã䜿çšããŠã¯ããŒã³äœæã 1 åã ãå®è¡ãããã®åŸã
fetch
ãããŠå¿ èŠãªå Žåã«ã®ã¿ã - ãã«ãæ§æãã¡ã€ã«ã§ Go ãã³ãã¬ãŒãã䜿çšããæ©èœ
werf.yaml
çµæãå€éšããŒã¿ã«äŸåããã¢ã»ã³ããªãèšè¿°ããããšãã§ããŸãã - werf ã§ããŠã³ãã䜿çšãããšããã¹ãŠã®ãã€ãã©ã€ã³ã«å ±éã®ãã£ãã·ã¥ã«ãããã¢ãŒãã£ãã¡ã¯ãã®åéãå€§å¹ ã«é«éåãããŸãã
- wef ã䜿çšãããšãã¯ãªãŒã³ã¢ããã®æ§æãç°¡åã«ãªããŸããããã¯ãåçã«æ§ç¯ããå Žåã«ç¹ã«éèŠã§ãã
PS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «
æ°ããã¢ããªã±ãŒã·ã§ã³ ãªãªãŒã¹ã Kubernetes ã«é ä¿¡ããéã®ã³ãã³ãã®å®è¡ "; - «
werf ãš GitLab CI ã䜿çšããŠåãã¿ã€ãã®ãã€ã¯ããµãŒãã¹ãæ§ç¯ããŠãããã€ãã "; - «
wef ã䜿çšããŠè€é㪠Helm ãã£ãŒããå±éãã "; - «
werf 1.0 å®å®çã®çŽ¹ä»: GitOps ãšãããšã®é¢ä¿ãã¹ããŒã¿ã¹ãèšç» 'ã
åºæïŒ habr.com