OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

์•ˆ๋…•ํ•˜์„ธ์š”, ์ด ๋ธ”๋กœ๊ทธ์˜ ์—ฌ๋Ÿฌ๋ถ„! ์ด๋Š” Red Hat OpenShift์—์„œ ์ตœ์‹  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” ์‹œ๋ฆฌ์ฆˆ์˜ ์„ธ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ์ž…๋‹ˆ๋‹ค.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

์ด์ „ ๋‘ ๊ฒŒ์‹œ๋ฌผ์—์„œ ์šฐ๋ฆฌ๋Š” ๋‹จ ๋ช‡ ๋‹จ๊ณ„๋งŒ์œผ๋กœ ์ตœ์‹  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ๋ฅผ ์กฐ์œจํ•˜๊ธฐ ์œ„ํ•ด ์ฒด์ธ ๋นŒ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NGINX์™€ ๊ฐ™์€ ๊ธฐ์„ฑ HTTP ์„œ๋ฒ„ ์ด๋ฏธ์ง€์™€ ํ•จ๊ป˜ ์ƒˆ S2I ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. .

์˜ค๋Š˜์€ OpenShift ํ”Œ๋žซํผ์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด๋ฅผ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๊ณ  OpenShift ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฌด์—‡์ธ์ง€, ์—ฐ๊ฒฐ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ์˜ ๋Œ€์•ˆ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift

๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ

์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ฒซ ๋ฒˆ์งธ ๊ฒŒ์‹œ๋ฌผ, ์ตœ์‹  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ฐ˜์ ์ธ ๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹จ์ˆœํžˆ ๋กœ์ปฌ ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๋Š” ์ผ์ข…์˜ "๊ฐœ๋ฐœ ์„œ๋ฒ„"์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋œ ๋‹ค์Œ ๋ธŒ๋ผ์šฐ์ €์— ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” ์ด๋Ÿฌํ•œ "๊ฐœ๋ฐœ ์„œ๋ฒ„"๊ฐ€ ํ•ด๋‹น ๋ช…๋ น์ค„ ๋„๊ตฌ์— ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ˜„์ง€ ์‚ฌ๋ก€

๋จผ์ €, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•  ๋•Œ ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ˜์‘ ์ด์ „ ๊ธฐ์‚ฌ์—์„œ ๋‹ค๋ฃจ์—ˆ์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“  ์ตœ์‹  ํ”„๋ ˆ์ž„์›Œํฌ์—๋Š” ๊ฑฐ์˜ ๋™์ผํ•œ ์›Œํฌํ”Œ๋กœ ๊ฐœ๋…์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ React ์˜ˆ์ œ์—์„œ "dev ์„œ๋ฒ„"๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

$ npm run start

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ„ฐ๋ฏธ๋„ ์ฐฝ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

๊ทธ๋Ÿฌ๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด๋ฆฝ๋‹ˆ๋‹ค.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

์ด์ œ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—…๋ฐ์ดํŠธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๋ชจ๋“œ์—์„œ ๊ฐœ๋ฐœํ•˜๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ OpenShift์—์„œ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

OpenShift์˜ ๊ฐœ๋ฐœ ์„œ๋ฒ„

๊ธฐ์–ตํ•˜์‹ ๋‹ค๋ฉด, ์ด์ „ ๊ฒŒ์‹œ๋ฌผ, ์šฐ๋ฆฌ๋Š” ์†Œ์œ„ S2I ์ด๋ฏธ์ง€์˜ ์‹คํ–‰ ๋‹จ๊ณ„๋ฅผ ์‚ดํŽด๋ณด๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋น„์Šค ๋ชจ๋“ˆ์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰ ์ด ์˜ˆ์—์„œ๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” $NPM_RUN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด nodeshift ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ npx nodeshift --deploy.env NPM_RUN="yarn start" --dockerImage=nodeshift/ubi8-s2i-web-app

์ฐธ๊ณ : ์œ„์˜ ์˜ˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์ถ•์•ฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋Š” NPM_RUN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋ฐฐํฌ์— ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ณ€์ˆ˜๋Š” OpenShift ํฌ๋“œ ๋‚ด์—์„œ React ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๋Š” Yarn start ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ๋Ÿฐํƒ€์ž„์— ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์ค‘์ธ Pod์˜ ๋กœ๊ทธ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

๋ฌผ๋ก  ์ด ๋ชจ๋“  ๊ฒƒ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์ง€๋งŒ ์›๊ฒฉ ์„œ๋ฒ„์— ์žˆ๋Š” ์ฝ”๋“œ์™€ ๋กœ์ปฌ ์ฝ”๋“œ๋ฅผ ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๊นŒ์ง€ ์•„๋ฌด ๊ฒƒ๋„ ์•„๋‹™๋‹ˆ๋‹ค.

์›๊ฒฉ ๋ฐ ๋กœ์ปฌ ์ฝ”๋“œ ๋™๊ธฐํ™”

๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ nodeshift๋Š” ๋™๊ธฐํ™”์— ์‰ฝ๊ฒŒ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ watch ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ช…๋ น์„ ์‹คํ–‰ํ•œ ํ›„ ๋‹ค์Œ ๋ช…๋ น์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ npx nodeshift watch

๊ฒฐ๊ณผ์ ์œผ๋กœ ์กฐ๊ธˆ ๋” ์ผ์ฐ ์ƒ์„ฑํ•œ ์‹คํ–‰ ์ค‘์ธ ํฌ๋“œ์— ์—ฐ๊ฒฐ๋˜๊ณ  ๋กœ์ปฌ ํŒŒ์ผ๊ณผ ์›๊ฒฉ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋™๊ธฐํ™”๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉฐ ๋กœ์ปฌ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ชจ๋‹ˆํ„ฐ๋ง๋˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด์ œ src/App.js ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋ฐ˜์‘ํ•˜์—ฌ ์ด๋ฅผ ์›๊ฒฉ ํด๋Ÿฌ์Šคํ„ฐ์— ๋ณต์‚ฌํ•˜๊ณ  ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆผ์„ ์™„์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ๋ช…๋ น์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ๋ณด์—ฌ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

$ npx nodeshift --strictSSL=false --dockerImage=nodeshift/ubi8-s2i-web-app --build.env YARN_ENABLED=true --expose --deploy.env NPM_RUN="yarn start" --deploy.port 3000

$ npx nodeshift watch --strictSSL=false

watch ๋ช…๋ น์€ oc rsync ๋ช…๋ น ์œ„์— ์ถ”์ƒํ™”๋˜์–ด ์žˆ์œผ๋ฉฐ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

์ด๋Š” React์— ๋Œ€ํ•œ ์˜ˆ์ด์ง€๋งŒ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ NPM_RUN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
โ€ƒ

์˜คํ”ˆ์‹œํ”„ํŠธ ํŒŒ์ดํ”„๋ผ์ธ

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

๋‹ค์Œ์œผ๋กœ OpenShift Pipelines์™€ ๊ฐ™์€ ๋„๊ตฌ์™€ ์ด๋ฅผ ์ฒด์ธ ๋นŒ๋“œ์˜ ๋Œ€์•ˆ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

OpenShift ํŒŒ์ดํ”„๋ผ์ธ์ด๋ž€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

OpenShift Pipelines๋Š” Tekton์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•˜๋„๋ก ์„ค๊ณ„๋œ ํด๋ผ์šฐ๋“œ ๋„ค์ดํ‹ฐ๋ธŒ CI/CD ์ง€์†์ ์ธ ํ†ตํ•ฉ ๋ฐ ์ œ๊ณต ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. Tekton์€ ๊ธฐ๋ณธ ๊ณ„์ธต์—์„œ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ(Kubernetes, ์„œ๋ฒ„๋ฆฌ์Šค, ๊ฐ€์ƒ ๋จธ์‹  ๋“ฑ)์—์„œ ๋ฐฐํฌ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์—ฐํ•œ ์˜คํ”ˆ ์†Œ์Šค Kubernetes ๊ธฐ๋ฐ˜ CI/CD ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์„œ๋ฅผ ์ดํ•ดํ•˜๋ ค๋ฉด ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์ง€์‹์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋จผ์ € ์ฝ์–ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๊ณต์‹ ๊ต๊ณผ์„œ.

์ž‘์—… ํ™˜๊ฒฝ ์„ค์ •

์ด ๋ฌธ์„œ์˜ ์˜ˆ์ œ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋จผ์ € ์ž‘์—… ํ™˜๊ฒฝ์„ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. OpenShift 4 ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์ œ์—์„œ๋Š” ์ด๋ฅผ ์œ„ํ•ด CodeReady Containers(CRD)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์„ค์น˜ ์ง€์นจ์€ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.
  2. ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ค€๋น„๋˜๋ฉด ์—ฌ๊ธฐ์— Pipeline Operator๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‘๋ ค์›Œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์‰ฝ์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ์ง€์นจ ์—ฌ๊ธฐ์—.
  3. ๋‹ค์šด๋กœ๋“œ ํ…ํ†ค CLI (ใ…‹) ์—ฌ๊ธฐ์—.
  4. create-react-app ๋ช…๋ น์ค„ ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๋ฐฐํฌํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค(์ด๊ฒƒ์€ ๊ฐ„๋‹จํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ž…๋‹ˆ๋‹ค. ๋ฐ˜์‘).
  5. (์„ ํƒ ์‚ฌํ•ญ) ์ €์žฅ์†Œ๋ฅผ ๋ณต์ œํ•˜์—ฌ npm install๊ณผ npm start๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ์—์„œ ์˜ˆ์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ €์žฅ์†Œ์—๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” Kubernetes/OpenShift YAML์„ ํฌํ•จํ•˜๋Š” k8s ํด๋”๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒ์„ฑํ•  ์ž‘์—…, ClusterTasks, ๋ฆฌ์†Œ์Šค ๋ฐ ํŒŒ์ดํ”„๋ผ์ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ €์žฅ์†Œ.

์‹œ์ž‘ํ•˜์ž

์˜ˆ์ œ์˜ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” OpenShift ํด๋Ÿฌ์Šคํ„ฐ์— ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ webapp-pipeline์„ ํ˜ธ์ถœํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ oc new-project webapp-pipeline

์ด ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์€ ๋‚˜์ค‘์— ์ฝ”๋“œ์— ํ‘œ์‹œ๋˜๋ฏ€๋กœ ๋‹ค๋ฅธ ์ด๋ฆ„์œผ๋กœ ์ง€์ •ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ๊ฒฝ์šฐ ๊ทธ์— ๋”ฐ๋ผ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ์ด ์‹œ์ ๋ถ€ํ„ฐ ์šฐ๋ฆฌ๋Š” ํ•˜ํ–ฅ์‹์ด ์•„๋‹Œ ์ƒํ–ฅ์‹์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋จผ์ € ์ปจ๋ฒ ์ด์–ด์˜ ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ์ปจ๋ฒ ์ด์–ด ์ž์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์šฐ์„ ...

์ž‘์—…

ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ž‘์—…์ธ apply_manifests_task๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ k8s ํด๋”์— ์žˆ๋Š” Kubernetes ๋ฆฌ์†Œ์Šค(์„œ๋น„์Šค, ๋ฐฐํฌ ๋ฐ ๊ฒฝ๋กœ)์˜ YAML์„ ์ ์šฉํ•˜๋Š” ์ผ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์ž‘์—…์ธ update_deployment_task๋Š” ์ด๋ฏธ ๋ฐฐํฌ๋œ ์ด๋ฏธ์ง€๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ƒ์„ฑ๋œ ์ด๋ฏธ์ง€๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ผ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ฑฑ์ •ํ•˜์ง€ ๋งˆ์„ธ์š”. ์‹ค์ œ๋กœ ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ์œ ํ‹ธ๋ฆฌํ‹ฐ์™€ ๋น„์Šทํ•˜๋ฉฐ ๋‚˜์ค‘์— ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ง€๊ธˆ์€ ๊ทธ๋ƒฅ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/tasks/update_deployment_task.yaml
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/tasks/apply_manifests_task.yaml

๊ทธ๋Ÿฐ ๋‹ค์Œ tkn CLI ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์ด ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

$ tkn task ls

NAME                AGE
apply-manifests     1 minute ago
update-deployment   1 minute ago

์ฐธ๊ณ : ์ด๋Š” ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋กœ์ปฌ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…

ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‹จ์ˆœ ์ž‘์—…๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ํŠน์ • ์ž‘์—…์„ ์‹คํ–‰ํ•  ๋•Œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๊ฒฐํ•ฉ๋˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ๊ณ„ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค. ์ฐจ์ด์ ์€ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์€ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ชจ๋“  ๊ณณ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. Pipeline Operator๋ฅผ ์ถ”๊ฐ€ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—… ๋ชฉ๋ก์„ ๋ณด๋ ค๋ฉด tkn CLI ๋ช…๋ น์„ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

$ tkn clustertask ls

NAME                       AGE
buildah                    1 day ago
buildah-v0-10-0            1 day ago
jib-maven                  1 day ago
kn                         1 day ago
maven                      1 day ago
openshift-client           1 day ago
openshift-client-v0-10-0   1 day ago
s2i                        1 day ago
s2i-go                     1 day ago
s2i-go-v0-10-0             1 day ago
s2i-java-11                1 day ago
s2i-java-11-v0-10-0        1 day ago
s2i-java-8                 1 day ago
s2i-java-8-v0-10-0         1 day ago
s2i-nodejs                 1 day ago
s2i-nodejs-v0-10-0         1 day ago
s2i-perl                   1 day ago
s2i-perl-v0-10-0           1 day ago
s2i-php                    1 day ago
s2i-php-v0-10-0            1 day ago
s2i-python-3               1 day ago
s2i-python-3-v0-10-0       1 day ago
s2i-ruby                   1 day ago
s2i-ruby-v0-10-0           1 day ago
s2i-v0-10-0                1 day ago

์ด์ œ ๋‘ ๊ฐœ์˜ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์„ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” S2I ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋‚ด๋ถ€ OpenShift ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์ด๋ฏธ ์ฝ˜ํ…์ธ ๋กœ ๊ตฌ์ถ•ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ NGINX๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€ ์ƒ์„ฑ ๋ฐ ๋ณด๋‚ด๊ธฐ

์ฒซ ๋ฒˆ์งธ ์ž‘์—…์„ ์ƒ์„ฑํ•  ๋•Œ ์—ฐ๊ฒฐ๋œ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•ด ์ด์ „ ๊ธฐ์‚ฌ์—์„œ ์ด๋ฏธ ์ˆ˜ํ–‰ํ•œ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค. S2I ์ด๋ฏธ์ง€(ubi8-s2i-web-app)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ "๊ตฌ์ถ•"ํ–ˆ๊ณ  ๊ฒฐ๊ตญ OpenShift ๋‚ด๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋˜์—ˆ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์ด์ œ ์ด S2I ์›น ์•ฑ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ์šฉ DockerFile์„ ์ƒ์„ฑํ•œ ๋‹ค์Œ Buildah๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€๋ฅผ OpenShift ๋‚ด๋ถ€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ํ‘ธ์‹œํ•ฉ๋‹ˆ๋‹ค. NodeShift๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ OpenShift๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์ด ๋ฐ”๋กœ ์ด๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. .

์šฐ๋ฆฌ๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์•Œ์•˜๋‚˜์š”? ์—์„œ ๊ณต์‹ Node.js์˜ ๊ณต์‹ ๋ฒ„์ „, ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ณต์‚ฌํ•˜๊ณ  ์Šค์Šค๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ s2i-web-app ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์„ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/s2i-web-app-task.yaml

์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ž์„ธํžˆ ๋ถ„์„ํ•˜์ง€ ์•Š๊ณ  OUTPUT_DIR ๋งค๊ฐœ๋ณ€์ˆ˜์—๋งŒ ์ค‘์ ์„ ๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

params:
      - name: OUTPUT_DIR
        description: The location of the build output directory
        default: build

๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” React๊ฐ€ ์กฐ๋ฆฝ๋œ ์ฝ˜ํ…์ธ ๋ฅผ ๋„ฃ๋Š” ์œ„์น˜์ธ build์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Ember์—์„œ๋Š” dist์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์˜ ์ถœ๋ ฅ์€ ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์ง‘ํ•œ HTML, JavaScript ๋ฐ CSS๊ฐ€ ํฌํ•จ๋œ ์ด๋ฏธ์ง€์ž…๋‹ˆ๋‹ค.

NGINX๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ

๋‘ ๋ฒˆ์งธ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์—์„œ๋Š” ์ด๋ฏธ ๊ตฌ์ถ•ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ NGINX ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋ฅผ ๊ตฌ์ถ•ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ์งˆ์ ์œผ๋กœ ์ด๋Š” ์ฒด์ธ ๋นŒ๋“œ๋ฅผ ์‚ดํŽด๋ณธ ์ด์ „ ์„น์…˜์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์œ„์™€ ์ •ํ™•ํžˆ ๋™์ผํ•˜๊ฒŒ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—… webapp-build-runtime์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/webapp-build-runtime-task.yaml

์ด๋Ÿฌํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—… ์ค‘์ธ Git ์ €์žฅ์†Œ๋‚˜ ์ƒ์„ฑ ์ค‘์ธ ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Git์œผ๋กœ ์ „์†กํ•  ๋‚ด์šฉ์ด๋‚˜ ์ตœ์ข… ์ด๋ฏธ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜์–ด์•ผ ํ•˜๋Š” ํŠน์ • ์ด๋ฏธ์ง€๋งŒ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ž‘์—…ํ•  ๋•Œ ์ด๋Ÿฌํ•œ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์šฐ์•„ํ•˜๊ฒŒ ๋‹ค์Œ ์ง€์ ์œผ๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

๋ฆฌ์†Œ์Šค

๋”ฐ๋ผ์„œ ๋ฐฉ๊ธˆ ๋งํ–ˆ๋“ฏ์ด ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์€ ๊ฐ€๋Šฅํ•œ ํ•œ ์ผ๋ฐ˜์ ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ ์ž…๋ ฅ(Git ์ €์žฅ์†Œ) ๋ฐ ์ถœ๋ ฅ(์ตœ์ข… ์ด๋ฏธ์ง€)์œผ๋กœ ์‚ฌ์šฉ๋  ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ ํ•„์š”ํ•œ ์ฒซ ๋ฒˆ์งธ ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋Š” Git์ž…๋‹ˆ๋‹ค.

# This resource is the location of the git repo with the web application source
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: web-application-repo
spec:
  type: git
  params:
    - name: url
      value: https://github.com/nodeshift-starters/react-pipeline-example
    - name: revision
      value: master

์—ฌ๊ธฐ์„œ PipelineResource๋Š” git ์œ ํ˜•์ž…๋‹ˆ๋‹ค. params ์„น์…˜์˜ url ํ‚ค๋Š” ํŠน์ • ์ €์žฅ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ๋งˆ์Šคํ„ฐ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค(์„ ํƒ ์‚ฌํ•ญ์ด์ง€๋งŒ ์™„์ „์„ฑ์„ ์œ„ํ•ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค).

์ด์ œ s2i-web-app ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ €์žฅ๋  ์ด๋ฏธ์ง€์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

# This resource is the result of running "npm run build",  the resulting built files will be located in /opt/app-root/output
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: built-web-application-image
spec:
  type: image
  params:
    - name: url
      value: image-registry.openshift-image-registry.svc:5000/webapp-pipeline/built-web-application:latest

์—ฌ๊ธฐ์„œ PipelineResource๋Š” ์ด๋ฏธ์ง€ ์œ ํ˜•์ด๊ณ  url ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋‚ด๋ถ€ OpenShift ์ด๋ฏธ์ง€ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ, ํŠนํžˆ webapp-pipeline ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์žˆ๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ด ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”.

๋งˆ์ง€๋ง‰์œผ๋กœ ํ•„์š”ํ•œ ๋งˆ์ง€๋ง‰ ๋ฆฌ์†Œ์Šค๋„ ์ด๋ฏธ์ง€ ์œ ํ˜•์ด ๋  ๊ฒƒ์ด๋ฉฐ ์ด๊ฒƒ์ด ๋ฐฐํฌ ์ค‘์— ์‚ฌ์šฉ๋  ์ตœ์ข… NGINX ์ด๋ฏธ์ง€๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

# This resource is the image that will be just the static html, css, js files being run with nginx
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: runtime-web-application-image
spec:
  type: image
  params:
    - name: url
      value: image-registry.openshift-image-registry.svc:5000/webapp-pipeline/runtime-web-application:latest

๋‹ค์‹œ ํ•œ๋ฒˆ ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ, ์ด ๋ฆฌ์†Œ์Šค๋Š” webapp-pipeline ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋‚ด๋ถ€ OpenShift ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ํ•œ ๋ฒˆ์— ์ƒ์„ฑํ•˜๋ ค๋ฉด create ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/resources/resource.yaml

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ tkn resource ls

์ปจ๋ฒ ์ด์–ด ํŒŒ์ดํ”„๋ผ์ธ

์ด์ œ ํ•„์š”ํ•œ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ชจ๋‘ ์ค€๋น„๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ์ƒ์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/pipelines/build-and-deploy-react.yaml

ํ•˜์ง€๋งŒ ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
  name: build-and-deploy-react

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์–‘ ์„น์…˜์—์„œ ์ด์ „์— ์ƒ์„ฑํ•œ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ‘œ์‹œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

spec:
  resources:
    - name: web-application-repo
      type: git
    - name: built-web-application-image
      type: image
    - name: runtime-web-application-image
      type: image

๊ทธ๋Ÿฐ ๋‹ค์Œ ํŒŒ์ดํ”„๋ผ์ธ์ด ์™„๋ฃŒํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ , ์ด๋ฏธ ์ƒ์„ฑํ•œ s2i-web-app ์ž‘์—…์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

tasks:
    - name: build-web-application
      taskRef:
        name: s2i-web-app
        kind: ClusterTask

์ด ์ž‘์—…์€ ์ž…๋ ฅ(gir ๋ฆฌ์†Œ์Šค) ๋ฐ ์ถœ๋ ฅ(build-web-application-image ๋ฆฌ์†Œ์Šค) ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž์ฒด ์„œ๋ช…๋œ ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ TLS๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๋„๋ก ํŠน์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

resources:
        inputs:
          - name: source
            resource: web-application-repo
        outputs:
          - name: image
            resource: built-web-application-image
      params:
        - name: TLSVERIFY
          value: "false"

๋‹ค์Œ ์ž‘์—…์€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ด๋ฏธ ์ƒ์„ฑํ•œ webapp-build-runtime ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…๋งŒ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

name: build-runtime-image
    taskRef:
      name: webapp-build-runtime
      kind: ClusterTask

์ด์ „ ์ž‘์—…๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋‹ฌํ•˜์ง€๋งŒ ์ด์ œ๋Š” build-web-application-image(์ด์ „ ์ž‘์—…์˜ ์ถœ๋ ฅ)์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ถœ๋ ฅ์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์‹œ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ์ด์ „ ์ž‘์—… ์ดํ›„์— ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ runAfter ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

resources:
        inputs:
          - name: image
            resource: built-web-application-image
        outputs:
          - name: image
            resource: runtime-web-application-image
        params:
        - name: TLSVERIFY
          value: "false"
      runAfter:
        - build-web-application

๋‹ค์Œ ๋‘ ์ž‘์—…์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ k8s ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ์„œ๋น„์Šค, ๊ฒฝ๋กœ ๋ฐ ๋ฐฐํฌ YAML ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ด ๋ฐฐํฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์ž‘์—…์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ธฐ์‚ฌ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ์ด ๋‘ ๊ฐ€์ง€ ํด๋Ÿฌ์Šคํ„ฐ ์ž‘์—…์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปจ๋ฒ ์ด์–ด ์‹œ์ž‘

๋”ฐ๋ผ์„œ ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ชจ๋“  ๋ถ€๋ถ„์ด ์ƒ์„ฑ๋˜์—ˆ์œผ๋ฉฐ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

$ tkn pipeline start build-and-deploy-react

์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋ช…๋ น์ค„์ด ๋Œ€ํ™”ํ˜•์œผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ฐ ์š”์ฒญ์— ๋Œ€ํ•œ ์‘๋‹ต์œผ๋กœ ์ ์ ˆํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์„ ํƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. git ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด web-application-repo๋ฅผ ์„ ํƒํ•œ ๋‹ค์Œ ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด build-web-application์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. -image, ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‘ ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค โ€“runtime-web-application-image:

? Choose the git resource to use for web-application-repo: web-application-repo (https://github.com/nodeshift-starters/react-pipeline-example)
? Choose the image resource to use for built-web-application-image: built-web-application-image (image-registry.openshift-image-registry.svc:5000/webapp-pipeline/built-web-
application:latest)
? Choose the image resource to use for runtime-web-application-image: runtime-web-application-image (image-registry.openshift-image-registry.svc:5000/webapp-pipeline/runtim
e-web-application:latest)
Pipelinerun started: build-and-deploy-react-run-4xwsr

์ด์ œ ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ดํ”„๋ผ์ธ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

$ tkn pipeline logs -f

ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹œ์ž‘๋˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฐฐํฌ๋˜๋ฉด ๋‹ค์Œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒŒ์‹œ๋œ ๊ฒฝ๋กœ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

$ oc get route react-pipeline-example --template='http://{{.spec.host}}'

๋” ๋‚˜์€ ์‹œ๊ฐํ™”๋ฅผ ์œ„ํ•ด ์›น ์ฝ˜์†”์˜ ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ ์„น์…˜์—์„œ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ์ดํ”„ ๋ผ์ธ, ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด. 1.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

๊ทธ๋ฆผ 1. ์‹คํ–‰ ์ค‘์ธ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ ์ค‘์ธ ํŒŒ์ดํ”„๋ผ์ธ์„ ํด๋ฆญํ•˜๋ฉด ๊ทธ๋ฆผ 2์™€ ๊ฐ™์ด ์ถ”๊ฐ€ ์„ธ๋ถ€ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

์Œ€. 2. ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด.

์ž์„ธํ•œ ๋‚ด์šฉ์„ ํ™•์ธํ•œ ํ›„ ๋ณด๊ธฐ์—์„œ ์‹คํ–‰ ์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํด๋กœ์ง€, ๊ทธ๋ฆผ 3๊ณผ ๊ฐ™์ด.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

๊ทธ๋ฆผ 3. ์ถœ์‹œ๋œ ํฌ๋“œ.

์•„์ด์ฝ˜์˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์— ์žˆ๋Š” ์›์„ ํด๋ฆญํ•˜๋ฉด ๊ทธ๋ฆผ 4์™€ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—ด๋ฆฝ๋‹ˆ๋‹ค.

OpenShift์˜ ์ตœ์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, 3๋ถ€: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ์„œ์˜ OpenShift ๋ฐ OpenShift Pipelines

์Œ€. 4. React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๋”ฐ๋ผ์„œ OpenShift์—์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์šฉ ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ด๋ฅผ ๋กœ์ปฌ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ OpenShift Pipelines๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒด์ธ ๋นŒ๋“œ ํ…œํ”Œ๋ฆฟ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ์˜ ๋ชจ๋“  ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—.

์ถ”๊ฐ€ ์ž๋ฃŒ(EN)

๋‹ค๊ฐ€์˜ค๋Š” ์›น ์„ธ๋ฏธ๋‚˜ ๊ณต์ง€

Red Hat OpenShift Container Platform ๋ฐ Kubernetes๋ฅผ ์‚ฌ์šฉํ•œ ๊ธฐ๋ณธ ๊ฒฝํ—˜์— ๊ด€ํ•œ ์ผ๋ จ์˜ ๊ธˆ์š”์ผ ์›น ์„ธ๋ฏธ๋‚˜๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€