์๋
ํ์ธ์ ์ฌ๋ฌ๋ถ. ์ค๋ ์ฐ๋ฆฌ๋ ๊ธฐ์ฌ์ ๋ง์ง๋ง ๋ถ๋ถ์ ์ฌ๋ฌ๋ถ๊ณผ ๊ณต์ ํฉ๋๋ค.
๋ฐฐํฌ ํ ์คํธ
์ด๋ฌํ ์คํ์ผ์ ํ
์คํธ๋ ๊ฐ๋ ฅํ ์ ๊ทผ ๋ฐฉ์์ด๋ฉฐ ์ด๋ฅผ ํตํด ํ์ดํธ๋ฐ์ค ํ
์คํธ๋ฅผ ์ํํ์ฌ ์ธํ๋ผ ์ฝ๋์ ๋ด๋ถ ์๋์ ํ
์คํธํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ
์คํธํ ์ ์๋ ๋ด์ฉ์ด ๋ค์ ์ ํ๋ฉ๋๋ค. ํ
์คํธ๋ ์ค์ ๋ฐฐํฌ ์ ํ๋ฃจ๋ฏธ์์ ์๋ฆฝํ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐฐํฌ ๊ณํ์ ๊ธฐ๋ฐ์ผ๋ก ์งํ๋๋ฏ๋ก ๋ฐฐํฌ ์์ฒด๋ฅผ ํ
์คํธํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ํด Pulumi์๋ ํตํฉ ํ
์คํธ ํ๋ ์์ํฌ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ์๋ก ์ ์๋ํฉ๋๋ค!
Pulumi ํตํฉ ํ
์คํธ ํ๋ ์์ํฌ๋ Go๋ก ์์ฑ๋์์ผ๋ฉฐ, ์ด๋ ๋๋ถ๋ถ์ ๋ด๋ถ ์ฝ๋๋ฅผ ํ
์คํธํ๋ ๋ฐฉ๋ฒ์
๋๋ค. ์ด์ ์ ๋
ผ์๋ ๋จ์ ํ
์คํธ ์ ๊ทผ ๋ฐฉ์์ ํ์ดํธ ๋ฐ์ค ํ
์คํธ์ ๊ฐ๊น์ง๋ง ํตํฉ ํ
์คํธ๋ ๋ธ๋ ๋ฐ์ค์
๋๋ค. (์๊ฒฉํ ๋ด๋ถ ํ
์คํธ๋ฅผ ์ํ ์ต์
๋ ์์ต๋๋ค.) ์ด ํ๋ ์์ํฌ๋ ์์ ํ Pulumi ํ๋ก๊ทธ๋จ์ ๊ฐ์ ธ์์ ์ ์คํ์ ์ฒ์๋ถํฐ ๋ฐฐํฌํ๊ณ ๋ณํ์ผ๋ก ์
๋ฐ์ดํธํ๊ณ ์ญ์ ํ๋ ๋ฑ ๋ค์ํ ์๋ช
์ฃผ๊ธฐ ์์
์ ์ํํ๊ธฐ ์ํด ๋ง๋ค์ด์ก์ต๋๋ค. . ์ ๊ธฐ์ ์ผ๋ก(์: ๋ฐค์) ์คํธ๋ ์ค ํ
์คํธ๋ก ์คํํฉ๋๋ค.
(์ฐ๋ฆฌ
์ด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ์ ์คํํ๋ฉด ๋ค์์ ํ์ธํ ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ ์ฝ๋๊ฐ ๊ตฌ๋ฌธ์ ์ผ๋ก ์ ํํ๊ณ ์ค๋ฅ ์์ด ์คํ๋ฉ๋๋ค.
- ์คํ ๋ฐ ๋น๋ฐ ๊ตฌ์ฑ ์ค์ ์ด ์๋ํ๊ณ ์ฌ๋ฐ๋ฅด๊ฒ ํด์๋ฉ๋๋ค.
- ๊ทํ์ ํ๋ก์ ํธ๋ ๊ทํ๊ฐ ์ ํํ ํด๋ผ์ฐ๋ ์ ๊ณต์ ์ฒด์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐํฌ๋ ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ๋ฅผ ์ด๊ธฐ ์ํ์์ ๋ค๋ฅธ N๊ฐ ์ํ๋ก ์ฑ๊ณต์ ์ผ๋ก ์ ๊ทธ๋ ์ด๋ํ ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ํ๊ธฐ๋๊ณ ํด๋ผ์ฐ๋ ๊ณต๊ธ์์์ ์ ๊ฑฐ๋ ์ ์์ต๋๋ค.
๊ณง ์ดํด๋ณด๊ฒ ์ง๋ง ์ด ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐํ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ ์๋ ์์ต๋๋ค.
๊ฐ๋จํ ํตํฉ ํ ์คํธ
์ด๊ฒ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ ์ฅ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. pulumi/examples
, ์ฐ๋ฆฌ ํ๊ณผ Pulumi ์ปค๋ฎค๋ํฐ๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒด ํ ์์ฒญ, ์ปค๋ฐ ๋ฐ ์ผ๊ฐ ๋น๋๋ฅผ ํ
์คํธํฉ๋๋ค.
๋ค์์ ์ฐ๋ฆฌ์ ๊ฐ๋จํ ํ
์คํธ์
๋๋ค.
example_test.go:
package test
import (
"os"
"path"
"testing"
"github.com/pulumi/pulumi/pkg/testing/integration"
)
func TestExamples(t *testing.T) {
awsRegion := os.Getenv("AWS_REGION")
if awsRegion == "" {
awsRegion = "us-west-1"
}
cwd, _ := os.Getwd()
integration.ProgramTest(t, &integration.ProgramTestOptions{
Quick: true,
SkipRefresh: true,
Dir: path.Join(cwd, "..", "..", "aws-js-s3-folder"),
Config: map[string]string{
"aws:region": awsRegion,
},
})
}
์ด ํ
์คํธ๋ ํด๋์ ์คํ์ ์์ฑ, ์์ , ์ญ์ ํ๋ ๊ธฐ๋ณธ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ฑฐ์นฉ๋๋ค. aws-js-s3-folder
. ํ
์คํธ ํต๊ณผ๋ฅผ ๋ณด๊ณ ํ๋ ๋ฐ ์ฝ XNUMX๋ถ ์ ๋ ๊ฑธ๋ฆฝ๋๋ค.
$ go test .
PASS
ok ... 43.993s
์ด๋ฌํ ํ
์คํธ์ ๋์์ ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ๋ค์ํ ์ต์
์ด ์์ต๋๋ค. ์ ์ฒด ์ต์
๋ชฉ๋ก์ ํ์ธํ์ธ์. ProgramTestOptions
. ์๋ฅผ ๋ค์ด Jaeger ์๋ํฌ์ธํธ๋ฅผ ๊ตฌ์ฑํ์ฌ ์ถ์ ํ ์ ์์ต๋๋ค(Tracing
), ํ
์คํธ๊ฐ ์์ฑ์ธ ๊ฒฝ์ฐ ํ
์คํธ๊ฐ ์คํจํ ๊ฒ์ผ๋ก ์์ํจ์ ๋ํ๋
๋๋ค(ExpectFailure
), ์์ฐจ์ ์ธ ์ํ ์ ํ์ ์ํด ํ๋ก๊ทธ๋จ์ ์ผ๋ จ์ "ํธ์ง"์ ์ ์ฉํฉ๋๋ค(EditDirs
) ๊ทธ๋ฆฌ๊ณ ํจ์ฌ ๋. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ๋ฅผ ํ
์คํธํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ฆฌ์์ค ์์ฑ ํ์ธ
์์์ ๋ ผ์ํ ํตํฉ์ ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ์ด ์ถฉ๋ํ์ง ์๊ณ "์๋"ํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ํ์ง๋ง ๊ฒฐ๊ณผ ์คํ์ ์์ฑ์ ํ์ธํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์? ์๋ฅผ ๋ค์ด ํน์ ์ ํ์ ๋ฆฌ์์ค๊ฐ ํ๋ก๋น์ ๋๋์๊ฑฐ๋ ํ๋ก๋น์ ๋๋์ง ์์์ผ๋ฉฐ ํน์ ์์ฑ์ด ์์ต๋๋ค.
๋งค๊ฐ ๋ณ์ ExtraRuntimeValidation
์ ProgramTestOptions
์ด๋ฅผ ํตํด Pulumi๊ฐ ๊ธฐ๋กํ ๋ฐฐํฌ ํ ์ํ๋ฅผ ํ์ธํ์ฌ ์ถ๊ฐ ํ์ธ์ ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๊ตฌ์ฑ, ๋ด๋ณด๋ธ ์ถ๋ ฅ ๊ฐ, ๋ชจ๋ ๋ฆฌ์์ค์ ํด๋น ์์ฑ ๊ฐ, ๋ฆฌ์์ค ๊ฐ์ ๋ชจ๋ ์ข
์์ฑ์ ํฌํจํ์ฌ ๊ฒฐ๊ณผ ์คํ ์ํ์ ์ ์ฒด ์ค๋
์ท์ด ํฌํจ๋ฉ๋๋ค.
์ด์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์๋ฅผ ๋ณด๋ ค๋ฉด ํ๋ก๊ทธ๋จ์ด ํ๋๋ฅผ ์์ฑํ๋์ง ํ์ธํด ๋ณด๊ฒ ์ต๋๋ค. S3 ๋ฒํท:
integration.ProgramTest(t, &integration.ProgramTestOptions{
// as before...
ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
var foundBuckets int
for _, res := range stack.Deployment.Resources {
if res.Type == "aws:s3/bucket:Bucket" {
foundBuckets++
}
}
assert.Equal(t, 1, foundBuckets, "Expected to find a single AWS S3 Bucket")
},
})
์ด์ go ํ ์คํธ๋ฅผ ์คํํ๋ฉด ์ผ๋ จ์ ์๋ช ์ฃผ๊ธฐ ํ ์คํธ๋ฅผ ๊ฑฐ์น ๋ฟ๋ง ์๋๋ผ ์คํ์ ์ฑ๊ณต์ ์ผ๋ก ๋ฐฐํฌํ ํ ๊ฒฐ๊ณผ ์ํ์ ๋ํ ์ถ๊ฐ ๊ฒ์ฌ๋ ์ํํฉ๋๋ค.
๋ฐํ์ ํ ์คํธ
์ง๊ธ๊น์ง ๋ชจ๋ ํ ์คํธ๋ ์์ ํ ๋ฐฐํฌ ๋์๊ณผ Pulumi ๋ฆฌ์์ค ๋ชจ๋ธ์ ๊ดํ ๊ฒ์ด์์ต๋๋ค. ํ๋ก๋น์ ๋๋ ์ธํ๋ผ๊ฐ ์ค์ ๋ก ์๋ํ๋์ง ํ์ธํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํฉ๋๊น? ์๋ฅผ ๋ค์ด, ๊ฐ์ ๋จธ์ ์ด ์คํ ์ค์ด๊ณ S3 ๋ฒํท์ ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ๋ ๋ด์ฉ์ด ํฌํจ๋์ด ์๋ ๊ฒฝ์ฐ ๋ฑ์ด ์์ต๋๋ค.
์ด ์์
์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ด๋ฏธ ์ง์ํ์ ์๋ ์์ต๋๋ค. ์ต์
ExtraRuntimeValidation
์ ProgramTestOptions
- ์ด๊ฒ์ ์ข์ ๊ธฐํ์
๋๋ค. ์ด ์์ ์์ ํ๋ก๊ทธ๋จ ๋ฆฌ์์ค์ ์ ์ฒด ์ํ์ ์ก์ธ์คํ์ฌ ์ฌ์ฉ์ ์ ์ Go ํ
์คํธ๋ฅผ ์คํํฉ๋๋ค. ์ด ์ํ์๋ ๊ฐ์ ๋จธ์ IP ์ฃผ์, URL, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ ํด๋ผ์ฐ๋ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ ์ธํ๋ผ์ ์ค์ ๋ก ์ํธ ์์ฉํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด ํ
์คํธ ํ๋ก๊ทธ๋จ์ ๋ค์ ์์ฑ์ ๋ด๋ณด๋
๋๋ค. webEndpoint
๋ฒํท ํธ์ถ๋จ websiteUrl
, ๊ตฌ์ฑ๋ URL์ ์ป์ ์ ์๋ ์ ์ฒด URL์
๋๋ค. index document
. ์ํ ํ์ผ์ ์์ธํ ์กฐ์ฌํ์ฌ ์ฐพ์ ์๋ ์์ง๋ง bucket
ํด๋น ์์ฑ์ ์ง์ ์ฝ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์คํ์ ํ์ธ์ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ ๋ค์๊ณผ ๊ฐ์ ์ ์ฉํ ์์ฑ์ ๋ด๋ณด๋
๋๋ค.
integration.ProgramTest(t, &integration.ProgramTestOptions{
// as before ...
ExtraRuntimeValidation: func(t *testing.T, stack integration.RuntimeValidationStackInfo) {
url := "http://" + stack.Outputs["websiteUrl"].(string)
resp, err := http.Get(url)
if !assert.NoError(t, err) {
return
}
if !assert.Equal(t, 200, resp.StatusCode) {
return
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if !assert.NoError(t, err) {
return
}
assert.Contains(t, string(body), "Hello, Pulumi!")
},
})
์ด์ ๋ฐํ์ ๊ฒ์ฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๊ฒ์ฌ๋ ์คํ์ ์ฌ๋ฆฐ ํ ์ฆ์ ์คํ๋๋ฉฐ ๋ชจ๋ ๊ฐ๋จํ ํธ์ถ์ ๋ํ ์๋ต์
๋๋ค. go test
. ์ด๋ ๋น์ฐ์ ์ผ๊ฐ์ ๋ถ๊ณผํฉ๋๋ค. ์ฝ๋๋ก ์์ฑํ ์ ์๋ ๋ชจ๋ Go ํ
์คํธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ง์์ ์ธ ์ธํ๋ผ ํตํฉ
๋ง์ ์ธํ๋ผ ๋ณ๊ฒฝ์ด ์์ ๋ ์ฝ๋ ๊ฒํ ๋ฅผ ์ํด ์ ์ถํ๊ธฐ ์ ์ ๋ฉํ์์ ํ ์คํธ๋ฅผ ์คํํ ์ ์๋ค๋ ์ ์ ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ์ ๋ง์ ๊ณ ๊ฐ์ ๊ฐ๋ฐ ์๋ช ์ฃผ๊ธฐ์ ๋ค์ํ ๋จ๊ณ์์ ์ธํ๋ผ๋ฅผ ํ ์คํธํฉ๋๋ค.
- ๋ณํฉ ์ ํ ์คํธ๋ฅผ ์ํ ๋ชจ๋ ๊ณต๊ฐ ํ ์์ฒญ์์.
- ๊ฐ ์ปค๋ฐ์ ๋ํ ์๋ต์ผ๋ก ๋ณํฉ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ํ๋์๋์ง ๋ค์ ํ์ธํฉ๋๋ค.
- ์ถ๊ฐ ํ ์คํธ๋ฅผ ์ํด ๋ฐค์ด๋ ๋งค์ฃผ ๋ฑ ์ ๊ธฐ์ ์ผ๋ก ์ค์ํฉ๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ฅ๊ธฐ๊ฐ์ ๊ฑธ์ณ ์คํ๋๊ณ ํ ์คํธ๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ๊ฑฐ๋ ๋์ผํ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ ๋ฒ ๋ฐฐํฌํ๋ ์ฑ๋ฅ ๋๋ ์คํธ๋ ์ค ํ ์คํธ์ ์ผ๋ถ์ ๋๋ค.
์ด๋ค ๊ฐ๊ฐ์ ๋ํด Pulumi๋ ๊ทํ๊ฐ ์ ํธํ๋ ์ง์์ ํตํฉ ์์คํ ๊ณผ์ ํตํฉ์ ์ง์ํฉ๋๋ค. ์ง์์ ์ธ ํตํฉ์ ํตํด ์ธํ๋ผ์ ๋ํด ์ ํ๋ฆฌ์ผ์ด์ ์ํํธ์จ์ด์ ๋์ผํ ํ ์คํธ ๋ฒ์๋ฅผ ์ ๊ณตํฉ๋๋ค.
Pulumi๋ ๊ณตํต CI ์์คํ ์ ์ง์ํฉ๋๋ค. ๊ทธ ์ค ์ผ๋ถ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
AWS ์ฝ๋ ์๋น์ค ์ ์ ๋ฐ๋ธ์ต์ค ์ํดCI GitHub ์ก์ ๊น๋ฉ CI ๊ตฌ๊ธ ํด๋ผ์ฐ๋ ๋น๋ ํธ๋๋น์ค
์์ธํ ๋ด์ฉ์ ์ ๋ํ ์ค๋ช
์๋ฅผ ์ฐธ์กฐํ์ธ์.
์์ ํ๊ฒฝ
๋งค์ฐ ๊ฐ๋ ฅํ ๊ธฐํ๋ ์น์ธ ํ
์คํธ ๋ชฉ์ ์ผ๋ก๋ง ์์ ํ๊ฒฝ์ ๋ฐฐํฌํ ์ ์๋ ๋ฅ๋ ฅ์
๋๋ค. ๊ฐ๋
GitHub๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Pulumi๋ ๋ค์์ ์ ๊ณตํฉ๋๋ค.
ํต์ฌ ์น์ธ ํ
์คํธ์ Pulumi๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์์ฐ์ฑ์ ํฅ์ํ๊ณ ๋ณ๊ฒฝ ์ฌํญ์ ํ์ง์ ๋ํ ํ์ ์ ์ฃผ๋ ์๋ก์ด ์๋ํ ๊ธฐ๋ฅ์ ์ป๊ฒ ๋ฉ๋๋ค.
ํฉ๊ณ
์ด ๊ธฐ์ฌ์์ ์ฐ๋ฆฌ๋ ๋ฒ์ฉ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ ์ฉํ ๋ง์ ์ํํธ์จ์ด ๊ฐ๋ฐ ๊ธฐ์ ์ ์ฌ์ฉํ ์ ์์์ ํ์ธํ์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋จ์ ํ ์คํธ, ํตํฉ ํ ์คํธ ๋ฐ ๊ด๋ฒ์ํ ๋ฐํ์ ํ ์คํธ๋ฅผ ์ํํ๊ธฐ ์ํด ํจ๊ป ์๋ํ๋ ๋ฐฉ๋ฒ์ด ํฌํจ๋ฉ๋๋ค. ํ ์คํธ๋ ์์ฒญ ์ ๋๋ CI ์์คํ ์์ ์ฝ๊ฒ ์คํํ ์ ์์ต๋๋ค.
ํ ๋ฃจ๋ฏธ - ์คํ ์์ค ์ํํธ์จ์ด, ๋ฌด๋ฃ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ ์ ํธํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฐ ํด๋ผ์ฐ๋์ ํจ๊ป ์๋ -
โ
์ถ์ฒ : habr.com