GitOpsããŒã«ã«ã€ããŠã¯ãã§ã«äœåºŠã話ããŠããŸãã ä»åã¯ããŠã§ããµã€ãæ§ç¯ã®çµéšããããžã§ã¯ãèªäœã®ããã¥ã¡ã³ããšãšãã«å ±æããããšæããŸãã ïŒãã·ã¢èªç㯠ïŒãããã¯éåžžã®éçãµã€ãã§ãããåçãªæ°ã®ææç©ã䜿çšããŠæ§ç¯ãããŠããç¹ã§ãã®ã¢ã»ã³ããªã¯è峿·±ããã®ã§ãã

ãã¹ãŠã®ããŒãžã§ã³ã«å
±éã®ã¡ãã¥ãŒããªãªãŒã¹ã«é¢ããæ
å ±ãå«ãããŒãžãªã©ã®çæãšãã£ããµã€ãæ§é ã®ãã¥ã¢ã³ã¹ã«ã€ããŠã¯èª¬æããŸããã代ããã«ãåçã¢ã»ã³ããªã®åé¡ãšæ©èœãããã³ä»éãã CI/CD ããã»ã¹ã«ã€ããŠå°ãçŠç¹ãåœãŠãŸãã
ã¯ããã«: ãµã€ãã®ä»çµã¿
ãŸããwerfã®ããã¥ã¡ã³ããã³ãŒããšäžç·ã«ä¿åããããšããäºå®ããå§ããŸããããããã¯éçºã«äžå®ã®èŠä»¶ã課ããŸããããã®èšäºã®ç¯å²å€ã§ããããšã¯æŠãçè§£ã§ããŸãããå°ãªããšã以äžã®ç¹ãææã§ããŸãã
- æ°ãã werf 颿°ã¯ããã¥ã¡ã³ããæŽæ°ããã«ãªãªãŒã¹ããŠã¯ãªãããéã«ãããã¥ã¡ã³ãã®å€æŽã¯ werf ã®æ°ããããŒãžã§ã³ã®ãªãªãŒã¹ãæå³ããŸãã
- ãã®ãããžã§ã¯ãã¯éåžžã«éäžçã«éçºãããŠãããæ°ããããŒãžã§ã³ã 1 æ¥ã«æ°åãªãªãŒã¹ãããããšããããŸãã
- æ°ããããŒãžã§ã³ã®ããã¥ã¡ã³ããå«ããµã€ããå±éããããã®æåæäœã¯ãå°ãªããšãé¢åã§ãã
- ãã®ãããžã§ã¯ãã¯ã»ãã³ãã£ãã¯ã¢ãããŒããæ¡çšããŠãã 5ã€ã®å®å®æ§ãã£ãã«ãåããŠããŸãããªãªãŒã¹ããã»ã¹ã§ã¯ãã¢ã«ãã¡ããããã¯ãœãªãããŸã§ãå®å®æ§ãå¢ãé ã«ãã£ãã«ãéããŠããŒãžã§ã³ãé æ¬¡éä¿¡ãããŸãã
- ãã®ãµã€ãã«ã¯ãã·ã¢èªçããããã¡ã€ã³ïŒè±èªïŒçãšäžŠè¡ããŠãåç¶ããçºå±ãããŠããŸãïŒã€ãŸããã³ã³ãã³ããæŽæ°ãããŸãïŒã
ãã®ãå éšã®ä»çµã¿ãããŠãŒã¶ãŒããé ããŠãããã åäœããããã®ãæäŸããããã«ãç§ãã¡ã¯ werfã®ã€ã³ã¹ããŒã«ãšã¢ããããŒãã®ããã®å¥ã®ããŒã« - ã§ã 䜿çšãããªãªãŒã¹çªå·ãšå®å®æ§ãã£ãã«ãæå®ããã ãã§ãmultiwerf ã¯ãã£ãã«ã«æ°ããããŒãžã§ã³ããããã©ããã確èªããå¿ èŠã«å¿ããŠããŠã³ããŒãããŸãã
werfã®ææ°ããŒãžã§ã³ã¯ããµã€ãã®ããŒãžã§ã³éžæã¡ãã¥ãŒã®åãã£ã³ãã«ã§å©çšå¯èœã§ããããã©ã«ãã§ã¯ã ææ°ãªãªãŒã¹ã®æãå®å®ãããã£ã³ãã«ããŒãžã§ã³ãå ¬éãããæ€çŽ¢ãšã³ãžã³ã«ãã€ã³ããã¯ã¹ãããŸãããã£ã³ãã«ã®ããã¥ã¡ã³ãã¯å¥ã®ã¢ãã¬ã¹ïŒäŸïŒ (ããŒã¿ãªãªãŒã¹ 1.0 ã®å Žå)ã
åèšãããšããã®ãµã€ãã§ã¯æ¬¡ã®ããŒãžã§ã³ãå©çšå¯èœã§ã:
- ã«ãŒãïŒããã©ã«ãã§éããŸãïŒã
- åãªãªãŒã¹ã®ã¢ã¯ãã£ããªæŽæ°ãã£ãã«ããšã« (äŸ: ).
ãµã€ãã®ç¹å®ã®ããŒãžã§ã³ãçæããã«ã¯ãéåžžã以äžã䜿çšããŠã³ã³ãã€ã«ããã ãã§ååã§ãã ããã£ã¬ã¯ããªå
ã§å®è¡äž /docs werfãªããžããªå¯Ÿå¿ã³ãã³ã(jekyll build) ã§ãå¿
èŠãªããŒãžã§ã³ã® Git ã¿ã°ã«åãæ¿ããŸããã
æ®ã£ãŠããã®ã¯ã次ã®ç¹ãä»ãå ããããšã ãã§ãã
- ãŠãŒãã£ãªãã£èªäœ (werf) ã¯çµã¿ç«ãŠã«äœ¿çšãããŸãã
- CI/CD ããã»ã¹ã¯ GitLab CI ã«åºã¥ããŠæ§ç¯ãããŸãã
- ãã¡ãããããããã¹ãŠã¯ Kubernetes ã§å®è¡ãããŸãã
ã¿ã¹ã¯
ããã§ã説æãããã¹ãŠã®è©³çްãèæ ®ããã¿ã¹ã¯ãå®åŒåããŠã¿ãŸãããã
- ä»»æã®ã¢ããããŒããã£ãã«ã§werfããŒãžã§ã³ã倿ŽããåŸ ãµã€ãäžã®ããã¥ã¡ã³ãã¯èªåçã«æŽæ°ãããå¿ èŠããã.
- æé·ããã«ã¯ãæã«ã¯ ãµã€ãã®ãã¬ãã¥ãŒã衚瀺ãã.
ãµã€ãã®åã³ã³ãã€ã«ã¯ã察å¿ãã Git ã¿ã°ããä»»æã®ãã£ãã«ã®ããŒãžã§ã³ã倿ŽããåŸã«å®è¡ããå¿ èŠããããŸãããã€ã¡ãŒãžãçµã¿ç«ãŠãããã»ã¹äžã«æ¬¡ã®æ©èœãåŸãããŸãã
- ãã£ã³ãã«ã®ããŒãžã§ã³ãªã¹ãã¯å€æŽããããããããŒãžã§ã³ã倿Žããããã£ã³ãã«ã®ããã¥ã¡ã³ãã®ã¿ãåæ§ç¯ããå¿ èŠããããŸããçµå±ã®ãšããããã¹ãŠããŒãããåæ§ç¯ããã®ã¯ããŸãè¯ãããšã§ã¯ãããŸããã
- ãªãªãŒã¹çšã®ãã£ã³ãã«ã»ããã¯å€æŽãããå¯èœæ§ããããŸããäŸãã°ãããæç¹ã§ã¯ãæ©æã¢ã¯ã»ã¹çã®1.1ãªãªãŒã¹ãããå®å®ããããŒãžã§ã³ããã£ã³ãã«äžã«ååšããªãå¯èœæ§ããããŸãããæéã®çµéãšãšãã«ãããã®ããŒãžã§ã³ãç»å ŽããŸãããã®å Žåããã«ããæåã§å€æŽããããšã¯ã§ããŸããããïŒ
ããã¯ãããšã倿 ã¢ã»ã³ããªã¯å€éšããŒã¿ã®å€æŽã«äŸåããŸã.
å ·çŸå
ã¢ãããŒãã®éžæ
ãããã¯ãKubernetes å ã§å¿ èŠãªããŒãžã§ã³ããšã«åå¥ã®ããããšããŠå®è¡ããããšãã§ããŸãããã®ãªãã·ã§ã³ã§ã¯ãã¯ã©ã¹ã¿ãŒå ã®ãªããžã§ã¯ãæ°ãå¢å ããå®å®ãã werf ãªãªãŒã¹ã®æ°ãå¢ããã«ã€ããŠãªããžã§ã¯ãæ°ãå¢å ããŸãããŸããããã¯ã¡ã³ããã³ã¹ã®è€éåãæããŸããåããŒãžã§ã³ã«ã¯ããããè² è·ã®å°ãã HTTP ãµãŒããŒãçšæãããããã§ããåœç¶ããªãœãŒã¹ã³ã¹ããå¢å ããŸãã
ç§ãã¡ã¯åãéãè¡ããŸãã å¿ èŠãªãã¹ãŠã®ããŒãžã§ã³ã 1 ã€ã®ã€ã¡ãŒãžã«ãã«ãããŸããµã€ãã®å šããŒãžã§ã³ã®çµ±èšããŒã¿ã¯NGINXã³ã³ããã«æ ŒçŽããã察å¿ãããããã€ã¡ã³ããžã®ãã©ãã£ãã¯ã¯NGINX Ingressãä»ããŠéä¿¡ãããŸããã¹ããŒãã¬ã¹ã¢ããªã±ãŒã·ã§ã³ãšããã·ã³ãã«ãªæ§é ã«ãããKubernetesèªäœã䜿çšããŠãè² è·ã«å¿ããŠãããã€ã¡ã³ããç°¡åã«ã¹ã±ãŒã«ã§ããŸãã
ããæ£ç¢ºã«èšããšã2ã€ã®ã€ã¡ãŒãžãæ§ç¯ããŸãã1ã€ã¯æ¬çªç°å¢çšããã1ã€ã¯éçºç°å¢çšã®è¿œå ã€ã¡ãŒãžã§ãã远å ã€ã¡ãŒãžã¯ãã¡ã€ã³ã€ã¡ãŒãžãšå ±ã«éçºç°å¢çšã§ã®ã¿äœ¿çšïŒå®è¡ïŒãããã¬ãã¥ãŒã³ãããã®ãµã€ãããŒãžã§ã³ãå«ã¿ãŸãããããã®ã€ã¡ãŒãžéã®ã«ãŒãã£ã³ã°ã¯IngressãªãœãŒã¹ã䜿çšããŠå®è¡ãããŸãã
werf vs git clone ãšã¢ãŒãã£ãã¡ã¯ã
åè¿°ã®éããç¹å®ã®ããŒãžã§ã³ã®ããã¥ã¡ã³ãã®ãµã€ãçµ±èšæ å ±ãçæããã«ã¯ã察å¿ãããªããžããªã¿ã°ã«åãæ¿ããŠãã«ãããå¿ èŠããããŸãããŸãããã«ãã®ãã³ã«ãªããžããªãã¯ããŒã³ãããªã¹ããã察å¿ããã¿ã°ãéžæããããšãã§ããŸãããã ããããã¯ããªããªãœãŒã¹ãæ¶è²»ããæäœã§ãããããã«è€éãªåœä»€ãèšè¿°ããå¿ èŠããããŸããããã«ããã®ã¢ãããŒãã§ã¯ãã«ãäžã«äœããã£ãã·ã¥ã§ããªããšãã倧ããªæ¬ ç¹ããããŸãã
ããã§werfãŠãŒãã£ãªãã£èªäœãç§ãã¡ãå©ããå®è£
ããŸã ã¹ããŒããã£ãã·ã¥ ãããŠãããªã㯠werfã䜿ã£ãŠãªããžããªããã³ãŒãã远å ãããšã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 -}} ãµã€ã¯ã«ã¯è€æ°ã®ã¢ãŒãã£ãã¡ã¯ããçæããã®ã§ïŒããé¡ã£ãŠããŸãïŒããããã®éã®åºåããã€ãŸãã·ãŒã±ã³ã¹ãèæ
®ããå¿
èŠããããŸãã --- ïŒèšå®ãã¡ã€ã«ã®æ§æã®è©³çްã«ã€ããŠã¯ã ïŒãå
ã»ã©å®çŸ©ããããã«ãã«ãŒãå
ã§ãã³ãã¬ãŒããåŒã³åºããšãã¯ãããŒãžã§ã³ ãã©ã¡ãŒã¿ãŒãURLãã«ãŒã ã³ã³ããã¹ããæž¡ããŸãã
åæ§ã«ããµã€ã¯ã«ãªãã§ãã¢ãŒãã£ãã¡ã¯ããã³ãã¬ãŒãããç¹å¥ãªã±ãŒã¹ããšåŒã³ãŸããã«ãŒãããŒãžã§ã³ãšã¬ãã¥ãŒã³ãããã®ããŒãžã§ã³çšã§ãã
{{ 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ãããã werf ã® Docker ã€ã¡ãŒãžã¯ werf-dev ã€ã¡ãŒãžã§æ©èœããŸããããã€ãã©ã€ã³æ§é ãç°¡çŽ åããããã«ãã«ãŒã ããŒãžã§ã³ ã¢ãŒãã£ãã¡ã¯ã (ãã§ã«ãã«ãæžã¿) ã®ã¿ã䜿çšããŠãã«ããããããã«ããŸãã
ãã«ãã®æºåãã§ããŸããïŒæ¬¡ã¯ 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ãã€ãã©ã€ã³ã®æšæºã¹ããŒãžã§ãããã«ããšãããã€ã䜿ã£ãŠãã«ããšãããã€ãè¡ãããšãã§ããŸãããã€ãã©ã€ã³èªäœã¯ãwerf GitHubãªããžããªã®ããã¯ã䜿ã£ãŠèµ·åããŸãïŒGitHubãªããžããªã«å€æŽããã£ãå Žåãªã©ïŒããããã®ããŒã¿ã¯ãGitLabãããžã§ã¯ãã®ããããã£ã®ã»ã¯ã·ã§ã³ããååŸã§ããŸãã CI/CD èšå® -> ãã€ãã©ã€ã³ããªã¬ãŒããããŠGitHubã§å¯Ÿå¿ããWebhookãäœæããŸãïŒèšå® -> Webhooks).
ãã«ãã¹ããŒãžã¯æ¬¡ã®ããã«ãªããŸãã
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 Chartãã³ãã¬ãŒãã§äœ¿çšãããŸãããã³ãã¬ãŒãã®å
容ã¯ããã§ã¯æäŸããŸããããããã§ã¯ä»¥äžã®ãªã³ã¯ããåç
§ã§ããŸãã .
æåŸã®ä»äžã
werfã®ããŒãžã§ã³ã¯é »ç¹ã«ãªãªãŒã¹ããããããæ°ããã€ã¡ãŒãžãé »ç¹ã«ãã«ããããDocker Registryã¯åžžã«æ¡åŒµãããŸãããã®ãããããªã·ãŒã«ããèªåã€ã¡ãŒãžã¯ãªãŒãã³ã°ã®èšå®ãå¿ èŠã§ããããã¯éåžžã«ç°¡åã«èšå®ã§ããŸãã
å®è£ ã«ã¯æ¬¡ã®ãã®ãå¿ èŠã§ã:
- ã¯ãªãŒãã³ã°ã¹ãããã远å ãã
.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 Registryå
ã®ã€ã¡ãŒãžãåé€ããæš©éãæã€ããŒã¯ã³ã§Docker Registryã«ãã°ã€ã³ããå¿
èŠããããŸãïŒGitLab CIã¿ã¹ã¯ã§èªåçã«çºè¡ãããããŒã¯ã³ã«ã¯ãã®ãããªæš©éã¯ãããŸããïŒãããŒã¯ã³ã¯äºåã«GitLabã§äœæãããã®å€ãç°å¢å€æ°ã«æå®ããå¿
èŠããããŸãã WERF_IMAGES_CLEANUP_PASSWORD ãããžã§ã¯ã ïŒCI/CDèšå® -> 倿°ïŒ.
å¿
èŠãªã¹ã±ãžã¥ãŒã«ã§æž
æã¿ã¹ã¯ã远å ããã«ã¯ã CI/CD ->
æ¥çš.
ããã§å®äºã§ããDocker Registry ãããžã§ã¯ãã¯ãæªäœ¿çšã®ã€ã¡ãŒãžããç¶ç¶çã«æ¡å€§ããããšã¯ãªããªããŸãã
å®è·µçãªéšåã®çµè«ãšããŠããã®èšäºã®å®å šãªãªã¹ãã¯ä»¥äžã§å ¥æå¯èœã§ããããšããç¥ããããããšæããŸãã :
- ;
- .
çµæ
- è«çã¢ã»ã³ããªæ§é ïŒããŒãžã§ã³ããšã« 1 ã€ã®ã¢ãŒãã£ãã¡ã¯ãïŒãåŸãããŸããã
- ã¢ã»ã³ããªã¯æ±çšçã§ãããwerf ã®æ°ããããŒãžã§ã³ããªãªãŒã¹ãããŠãæåã§ã®å€æŽã¯å¿ èŠãããŸããããµã€ãäžã®ããã¥ã¡ã³ãã¯èªåçã«æŽæ°ãããŸãã
- ç°ãªã茪éã«å¯Ÿã㊠2 ã€ã®ç»åãåéãããŸãã
- ãã£ãã·ã¥ãæå€§éã«äœ¿çšããããããåäœãé«éã«ãªããŸããwerf ã®æ°ããããŒãžã§ã³ããªãªãŒã¹ãããããã¬ãã¥ãŒ ã³ãããã®ããã« GitHub ããã¯ãåŒã³åºããããšã倿ŽãããããŒãžã§ã³ã®å¯Ÿå¿ããææç©ã®ã¿ãåæ§ç¯ãããŸãã
- æªäœ¿çšã®ã€ã¡ãŒãžãåé€ããå¿é ã¯ãããŸãããwerf ããªã·ãŒããŒã¹ã®ã¯ãªãŒã³ã¢ããã«ãããDocker ã¬ãžã¹ããªãæŽçãããç¶æ ã«ä¿ãããŸãã
æèŠ
- werf ã䜿çšãããšããã«ãèªäœã®ãã£ãã·ã¥ãšå€éšãªããžããªãæäœãããšãã®ãã£ãã·ã¥ã®äž¡æ¹ã«ããããã«ããé«éåãããŸãã
- å€éšã®Gitãªããžããªã䜿çšãããšãæ¯åãªããžããªãå®å
šã«ã¯ããŒã³ããããè€éãªæé©åããžãã¯ã䜿ã£ãŠè»èŒªã®åçºæããããããå¿
èŠããªããªããŸããwerfã¯ãã£ãã·ã¥ã䜿çšããŠäžåºŠã ãã¯ããŒã³ãäœæãããã®åŸ
fetchå¿ èŠãªå Žåã®ã¿ã - ãã«ãæ§æãã¡ã€ã«ã§ Go ãã³ãã¬ãŒãã䜿çšããæ©èœ
werf.yamlçµæãå€éšããŒã¿ã«äŸåããã¢ã»ã³ããªãèšè¿°ã§ããŸãã - werf ã§ããŠã³ãã䜿çšãããšããã¹ãŠã®ãã€ãã©ã€ã³ã«å ±éã®ãã£ãã·ã¥ã«ãããã¢ãŒãã£ãã¡ã¯ãã®åéé床ãå€§å¹ ã«åäžããŸãã
- werf ã䜿çšãããšãã¯ãªãŒã³ã¢ãããç°¡åã«æ§æã§ããŸããããã¯ãåçãã«ãã«ãšã£ãŠç¹ã«éèŠã§ãã
PS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «";
- «";
- «";
- «'ã
åºæïŒ habr.com
