рдкреБрд▓реБрдореАрд╕рд╣ рдХреЛрдб рдореНрд╣рдгреВрди рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдХрд░рдгреЗ. рднрд╛рдЧ 2

рд╕рд░реНрд╡рд╛рдВрдирд╛ рдирдорд╕реНрдХрд╛рд░. рдЖрдЬ рдЖрдореНрд╣реА рддреБрдордЪреНрдпрд╛рд╕реЛрдмрдд рд▓реЗрдЦрд╛рдЪрд╛ рд╢реЗрд╡рдЯрдЪрд╛ рднрд╛рдЧ рд╢реЗрдЕрд░ рдХрд░рдд рдЖрд╣реЛрдд. "рдкреБрд▓реБрдореАрд╕рд╣ рдХреЛрдб рдореНрд╣рдгреВрди рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдХрд░рдгреЗ", рдЬреНрдпрд╛рдЪреЗ рднрд╛рд╖рд╛рдВрддрд░ рд╡рд┐рд╢реЗрд╖рддрдГ рдЕрднреНрдпрд╛рд╕рдХреНрд░рдорд╛рдЪреНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рдВрд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓реЗ рд╣реЛрддреЗ "DevOps рд╕рд░рд╛рд╡ рдЖрдгрд┐ рд╕рд╛рдзрдиреЗ".

рдкреБрд▓реБрдореАрд╕рд╣ рдХреЛрдб рдореНрд╣рдгреВрди рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдХрд░рдгреЗ. рднрд╛рдЧ 2

рдЙрдкрдпреЛрдЬрди рдЪрд╛рдЪрдгреА

рдЪрд╛рдЪрдгреАрдЪреА рд╣реА рд╢реИрд▓реА рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рджреГрд╖реНрдЯреАрдХреЛрди рдЖрд╣реЗ рдЖрдгрд┐ рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреНрдпрд╛ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛ рдХреЛрдбрдЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдХрд╛рдордХрд╛рдЬрд╛рдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╡реНрд╣рд╛рдИрдЯ рдмреЙрдХреНрд╕ рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рд╕ рдЕрдиреБрдорддреА рджреЗрддреЗ. рддрдерд╛рдкрд┐, рдЖрдореНрд╣реА рдХрд╛рдп рдЪрд╛рдЪрдгреА рдХрд░реВ рд╢рдХрддреЛ рд╣реЗ рдХрд╛рд╣реА рдкреНрд░рдорд╛рдгрд╛рдд рдорд░реНрдпрд╛рджрд┐рдд рдХрд░рддреЗ. рд╡рд╛рд╕реНрддрд╡рд┐рдХ рддреИрдирд╛рддреАрдкреВрд░реНрд╡реА рдкреБрд▓реБрдореАрдиреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЗрди-рдореЗрдорд░реА рдЙрдкрдпреЛрдЬрди рдпреЛрдЬрдиреЗрд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЪрд╛рдЪрдгреНрдпрд╛ рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдореБрд│реЗ рддреИрдирд╛рддреАрдЪреАрдЪ рдЪрд╛рдЪрдгреА рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА. рдЕрд╢рд╛ рдкреНрд░рдХрд░рдгрд╛рдВрд╕рд╛рдареА, рдкреБрд▓реБрдореАрдХрдбреЗ рдПрдХреАрдХрд░рдг рдЪрд╛рдЪрдгреА рдлреНрд░реЗрдорд╡рд░реНрдХ рдЖрд╣реЗ. рдЖрдгрд┐ рд╣реЗ рджреЛрди рджреГрд╖реНрдЯрд┐рдХреЛрди рдПрдХрддреНрд░ рдЪрд╛рдВрдЧрд▓реЗ рдХрд╛рдо рдХрд░рддрд╛рдд!

Pulumi рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди рдЪрд╛рдЪрдгреА рдлреНрд░реЗрдорд╡рд░реНрдХ Go рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗ, рдЬреНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдЕрдВрддрд░реНрдЧрдд рдХреЛрдбрдЪреА рдмрд╣реБрддреЗрдХ рдЪрд╛рдЪрдгреА рдХрд░рддреЛ. рдкреВрд░реНрд╡реА рдЪрд░реНрдЪрд╛ рдХреЗрд▓реЗрд▓рд╛ рдпреБрдирд┐рдЯ рдЪрд╛рдЪрдгреА рджреГрд╖реНрдЯреАрдХреЛрди рд╡реНрд╣рд╛рдИрдЯ рдмреЙрдХреНрд╕ рдЪрд╛рдЪрдгреАрд╕рд╛рд░рдЦрд╛ рд╣реЛрддрд╛, рдПрдХреАрдХрд░рдг рдЪрд╛рдЪрдгреА рд╣реА рдмреНрд▓реЕрдХ рдмреЙрдХреНрд╕ рдЖрд╣реЗ. (рдХрдареЛрд░ рдЕрдВрддрд░реНрдЧрдд рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдкрд░реНрдпрд╛рдп рджреЗрдЦреАрд▓ рдЖрд╣реЗрдд.) рд╣реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреВрд░реНрдг рдкреБрд▓реБрдореА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреНрдпрд╛рд╡рд░ рд╡рд┐рд╡рд┐рдз рдЬреАрд╡рдирдЪрдХреНрд░ рдСрдкрд░реЗрд╢рдиреНрд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ, рдЬрд╕реЗ рдХреА рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди рдирд╡реАрди рд╕реНрдЯреЕрдХ рддреИрдирд╛рдд рдХрд░рдгреЗ, рднрд┐рдиреНрдирддреЗрд╕рд╣ рддреЗ рдЕрджреНрдпрддрдирд┐рдд рдХрд░рдгреЗ рдЖрдгрд┐ рддреЗ рд╣рдЯрд╡рдгреЗ, рд╢рдХреНрдпрддреЛ рдЕрдиреЗрдХ рд╡реЗрд│рд╛. . рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдирд╛ рдирд┐рдпрдорд┐рддрдкрдгреЗ рдЪрд╛рд▓рд╡рддреЛ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд░рд╛рддреНрд░реА) рдЖрдгрд┐ рддрдгрд╛рд╡ рдЪрд╛рдЪрдгреА рдореНрд╣рдгреВрди.

(рдЖрдореНрд╣реА рдЖрдореНрд╣реА рддреНрдпрд╛рд╡рд░ рдХрд╛рдо рдХрд░рдд рдЖрд╣реЛрдд, рдЬреЗрдгреЗрдХрд░реВрди рд╕рдорд╛рди рдПрдХреАрдХрд░рдг рдЪрд╛рдЪрдгреА рдХреНрд╖рдорддрд╛ рднрд╛рд╖рд╛рдВрдЪреНрдпрд╛ рдореВрд│ SDK рдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд. рддреБрдордЪрд╛ рдкреБрд▓реБрдореА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдгрддреНрдпрд╛ рднрд╛рд╖реЗрдд рд▓рд┐рд╣рд┐рд▓рд╛ рдЧреЗрд▓рд╛ рдЖрд╣реЗ рдпрд╛рдЪреА рдкрд░реНрд╡рд╛ рди рдХрд░рддрд╛ рддреБрдореНрд╣реА рдЧреЛ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди рдЪрд╛рдЪрдгреА рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛).

рдпрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЪрд╛рд▓рд╡реВрди рддреБрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рддрдкрд╛рд╕реВ рд╢рдХрддрд╛:

  • рддреБрдордЪрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рд╕рд┐рдВрдЯреЕрдХреНрдЯрд▓реА рдмрд░реЛрдмрд░ рдЖрд╣реЗ рдЖрдгрд┐ рддреНрд░реБрдЯреАрдВрд╢рд┐рд╡рд╛рдп рдЪрд╛рд▓рддреЛ.
  • рд╕реНрдЯреЕрдХ рдЖрдгрд┐ рд╕рд┐рдХреНрд░реЗрдЯреНрд╕ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪрд╛ рдпреЛрдЧреНрдп рдЕрд░реНрде рд▓рд╛рд╡рд▓рд╛ рдЬрд╛рддреЛ.
  • рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рддреБрдордЪреНрдпрд╛ рдЖрд╡рдбреАрдЪреНрдпрд╛ рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддреНрдпрд╛рдордзреНрдпреЗ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рддреИрдирд╛рдд рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.
  • рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рд╕реБрд░реБрд╡рд╛рддреАрдЪреНрдпрд╛ рд╕реНрдерд┐рддреАрддреВрди N рдЗрддрд░ рд░рд╛рдЬреНрдпрд╛рдВрдордзреНрдпреЗ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдЕрдкрдЧреНрд░реЗрдб рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.
  • рддреБрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рдирд╖реНрдЯ рдХреЗрд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдХреНрд▓рд╛рдЙрдб рдкреНрд░рджрд╛рддреНрдпрд╛рдХрдбреВрди рдХрд╛рдврд▓рд╛ рдЬрд╛рдК рд╢рдХрддреЛ.

рдЬрд╕реЗ рдЖрдкрдг рд▓рд╡рдХрд░рдЪ рдкрд╛рд╣рдгрд╛рд░ рдЖрд╣реЛрдд, рд╣реЗ рдлреНрд░реЗрдорд╡рд░реНрдХ рд░рдирдЯрд╛рдЗрдо рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рджреЗрдЦреАрд▓ рд╡рд╛рдкрд░рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ.

рд╕рд╛рдзреА рдПрдХрддреНрд░реАрдХрд░рдг рдЪрд╛рдЪрдгреА

рд╣реЗ рдХреГрддреАрдд рдкрд╛рд╣рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рд░реЗрдкреЙрдЬрд┐рдЯрд░реА рдкрд╛рд╣реВ pulumi/examples, рдЖрдордЪрд╛ рдХрд╛рд░реНрдпрд╕рдВрдШ рдЖрдгрд┐ рдкреБрд▓реБрдореА рд╕рдореБрджрд╛рдп рдЖрдордЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рдкреБрд▓ рд╡рд┐рдирдВрддреНрдпрд╛, рдХрдорд┐рдЯ рдЖрдгрд┐ рд░рд╛рддреНрд░реАрдЪреНрдпрд╛ рдмрд┐рд▓реНрдбрдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдпрд╛рдЪрд╛ рд╡рд╛рдкрд░ рдХрд░рддреЛ.

рдЦрд╛рд▓реА рдЖрдордЪреА рдПрдХ рд╕рд░рд▓реАрдХреГрдд рдЪрд╛рдЪрдгреА рдЖрд╣реЗ рдЙрджрд╛рд╣рд░рдг рдЬреЗ S3 рдмрд╛рджрд▓реА рдЖрдгрд┐ рдХрд╛рд╣реА рдЗрддрд░ рд╡рд╕реНрддреВ рдкреНрд░рджрд╛рди рдХрд░рддреЗ:

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. рдЙрддреНрддреАрд░реНрдг рдЭрд╛рд▓реЗрд▓реНрдпрд╛ рдЪрд╛рдЪрдгреАрдЪрд╛ рдЕрд╣рд╡рд╛рд▓ рджреЗрдгреНрдпрд╛рд╕рд╛рдареА рд╕реБрдорд╛рд░реЗ рдПрдХ рдорд┐рдирд┐рдЯ рд▓рд╛рдЧреЗрд▓:

$ go test .
PASS
ok      ... 43.993s

рдпрд╛ рдЪрд╛рдЪрдгреНрдпрд╛рдВрдЪреЗ рд╡рд░реНрддрди рд╕рд╛рдиреБрдХреВрд▓рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрдиреЗрдХ рдкрд░реНрдпрд╛рдп рдЖрд╣реЗрдд. рдкрд░реНрдпрд╛рдпрд╛рдВрдЪреА рд╕рдВрдкреВрд░реНрдг рдпрд╛рджреА рдкрд╣рд╛. рд░рдЪрдирд╛ рдордзреНрдпреЗ ProgramTestOptions. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рддреБрдореНрд╣реА рдЬреЗрдЧрд░ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдЯреНрд░реЗрд╕ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░реВ рд╢рдХрддрд╛ (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")
        },
    })

рдЖрддрд╛, рдЬреЗрд╡реНрд╣рд╛ рдЖрдореНрд╣реА рдЧреЛ рдЯреЗрд╕реНрдЯ рдЪрд╛рд▓рд╡рддреЛ, рддреЗрд╡реНрд╣рд╛ рддреА рдХреЗрд╡рд│ рд▓рд╛рдЗрдлрд╕рд╛рдпрдХрд▓ рдЪрд╛рдЪрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рдмреЕрдЯрд░реАрдордзреВрди рдЬрд╛рдгрд╛рд░ рдирд╛рд╣реА, рддрд░ рд╕реНрдЯреЕрдХ рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рддреИрдирд╛рдд рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдкрд░рд┐рдгрд╛рдореА рд╕реНрдерд┐рддреАрд╡рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рддрдкрд╛рд╕рдгреА рджреЗрдЦреАрд▓ рдХрд░реЗрд▓.

рд░рдирдЯрд╛рдЗрдо рдЪрд╛рдЪрдгреНрдпрд╛

рдЖрддрд╛рдкрд░реНрдпрдВрдд, рд╕рд░реНрд╡ рдЪрд╛рдЪрдгреНрдпрд╛ рдирд┐рд╡реНрд╡рд│ рдЙрдкрдпреЛрдЬрди рд╡рд░реНрддрди рдЖрдгрд┐ рдкреБрд▓реБрдореА рд╕рдВрд╕рд╛рдзрди рдореЙрдбреЗрд▓рдмрджреНрджрд▓ рдЖрд╣реЗрдд. рддреБрдордЪреА рддрд░рддреВрдж рдХреЗрд▓реЗрд▓реА рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХрд╛рдо рдХрд░рдд рдЕрд╕рд▓реНрдпрд╛рдЪреА рдкрдбрддрд╛рд│рдгреА рдХрд░рд╛рдпрдЪреА рдЕрд╕рд▓реНрдпрд╛рд╕? рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди рдЪрд╛рд▓реВ рдЖрд╣реЗ, S3 рдмрдХреЗрдЯрдордзреНрдпреЗ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЧреЛрд╖реНрдЯреА рдЖрд╣реЗрдд рдЖрдгрд┐ рдЕрд╕реЗрдЪ.

рд╣реЗ рдХрд╕реЗ рдХрд░рд╛рдпрдЪреЗ рдпрд╛рдЪрд╛ рдЕрдВрджрд╛рдЬ рддреБрдореНрд╣реА рдЖрдзреАрдЪ рд▓рд╛рд╡рд▓рд╛ рдЕрд╕реЗрд▓: рдкрд░реНрдпрд╛рдп ExtraRuntimeValidation рддреЗ ProgramTestOptions - рдпрд╛рд╕рд╛рдареА рд╣реА рдПрдХ рдЙрддреНрддрдо рд╕рдВрдзреА рдЖрд╣реЗ. рдпрд╛ рдЯрдкреНрдкреНрдпрд╛рд╡рд░, рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдордЪреНрдпрд╛ рд╕рдВрд╕рд╛рдзрдирд╛рдВрдЪреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг рд╕реНрдерд┐рддреАрдд рдкреНрд░рд╡реЗрд╢рд╛рд╕рд╣ рд╕рд╛рдиреБрдХреВрд▓ рдЧреЛ рдЪрд╛рдЪрдгреА рдЪрд╛рд▓рд╡рддрд╛. рдпрд╛ рд╕реНрдерд┐рддреАрдордзреНрдпреЗ рд╡реНрд╣рд░реНрдЪреНрдпреБрдЕрд▓ рдорд╢реАрди IP рдкрддреНрддреЗ, URL рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдореА рдХреНрд▓рд╛рдЙрдб рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕ рдЖрдгрд┐ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрд╢реА рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрд╡рд╛рдж рд╕рд╛рдзрдгреНрдпрд╛рд╕рд╛рдареА рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ.

рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдЖрдордЪрд╛ рдЪрд╛рдЪрдгреА рдХрд╛рд░реНрдпрдХреНрд░рдо рдорд╛рд▓рдорддреНрддрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддреЛ webEndpoint рдмрд╛рджрд▓реА рдореНрд╣рдгрддрд╛рдд websiteUrl, рдЬреА рдкреВрд░реНрдг 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. рдЖрдгрд┐ рд╣реЗ рдлрдХреНрдд рд╣рд┐рдордирдЧрд╛рдЪреЗ рдЯреЛрдХ рдЖрд╣реЗтАФрддреБрдореНрд╣реА рдХреЛрдбрдордзреНрдпреЗ рд▓рд┐рд╣реВ рд╢рдХрдгрд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ рдЧреЛ рдЪрд╛рдЪрдгреА рд╡реИрд╢рд┐рд╖реНрдЯреНрдп рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ.

рд╕рддрдд рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреЗ рдПрдХрддреНрд░реАрдХрд░рдг

рд▓реЕрдкрдЯреЙрдкрд╡рд░ рдЪрд╛рдЪрдгреНрдпрд╛ рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕ рд╕рдХреНрд╖рдо рдЕрд╕рдгреЗ рдЪрд╛рдВрдЧрд▓реЗ рдЖрд╣реЗ рдЬреЗрд╡реНрд╣рд╛ рдХреЛрдб рдкреБрдирд░рд╛рд╡рд▓реЛрдХрдирд╛рд╕рд╛рдареА рд╕рдмрдорд┐рдЯ рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рддреНрдпрд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдордзреНрдпреЗ рдмрд░реЗрдЪ рдмрджрд▓ рдХреЗрд▓реЗ рдЬрд╛рддрд╛рдд. рдкрд░рдВрддреБ рдЖрдореНрд╣реА рдЖрдгрд┐ рдЖрдордЪреЗ рдмрд░реЗрдЪ рдЧреНрд░рд╛рд╣рдХ рд╡рд┐рдХрд╛рд╕рд╛рдЪреНрдпрд╛ рдЬреАрд╡рди рдЪрдХреНрд░рд╛рдЪреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рдЯрдкреНрдкреНрдпрд╛рдВрд╡рд░ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдШреЗрддреЛ:

  • рд╡рд┐рд▓реАрди рдХрд░рдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рдкреНрд░рддреНрдпреЗрдХ рдЦреБрд▓реНрдпрд╛ рдкреБрд▓ рд╡рд┐рдирдВрддреАрдордзреНрдпреЗ.
  • рдкреНрд░рддреНрдпреЗрдХ рдХрдорд┐рдЯрдЪреНрдпрд╛ рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдд, рд╡рд┐рд▓реАрдиреАрдХрд░рдг рдпреЛрдЧреНрдпрд░рд┐рддреНрдпрд╛ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗ рд╣реЗ рджреЛрдирджрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА.
  • рдХрд╛рд▓рд╛рдВрддрд░рд╛рдиреЗ, рдЬрд╕реЗ рдХреА рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд╛рдЪрдгреАрд╕рд╛рдареА рд░рд╛рддреНрд░реА рдХрд┐рдВрд╡рд╛ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ.
  • рдХрд╛рд░реНрдпрдкреНрд░рджрд░реНрд╢рди рдХрд┐рдВрд╡рд╛ рддрдгрд╛рд╡ рдЪрд╛рдЪрдгреАрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди, рдЬреЗ рд╕рд╛рдорд╛рдиреНрдпрдд: рджреАрд░реНрдШ рдХрд╛рд▓рд╛рд╡рдзреАрд╕рд╛рдареА рдЪрд╛рд▓рддреЗ рдЖрдгрд┐ рд╕рдорд╛рдВрддрд░ рдЪрд╛рдЪрдгреА рдЪрд╛рд▓рд╡рддреЗ рдЖрдгрд┐/рдХрд┐рдВрд╡рд╛ рд╕рдорд╛рди рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдиреЗрдХ рд╡реЗрд│рд╛ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рддреЗ.

рдпрд╛рдкреИрдХреА рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА, Pulumi рддреБрдордЪреНрдпрд╛ рдЖрд╡рдбрддреНрдпрд╛ рд╕рддрдд рдПрдХреАрдХрд░рдг рдкреНрд░рдгрд╛рд▓реАрд╕рд╣ рдПрдХрддреНрд░реАрдХрд░рдгрд╛рд╕ рд╕рдорд░реНрдерди рджреЗрддреЗ. рд╕рддрдд рдПрдХрддреНрд░реАрдХрд░рдгрд╛рд╕рд╣, рд╣реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░рд╕рд╛рдареА рддреБрдордЪреНрдпрд╛ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдкреНрд░рдорд╛рдгреЗрдЪ рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ рджреЗрддреЗ.

рдкреБрд▓реБрдореАрд▓рд╛ рд╕рд╛рдорд╛рдиреНрдп CI рд╕рд┐рд╕реНрдЯреАрдорд╕рд╛рдареА рд╕рдорд░реНрдерди рдЖрд╣реЗ. рддреНрдпрд╛рдкреИрдХреА рдХрд╛рд╣реА рдпреЗрдереЗ рдЖрд╣реЗрдд:

рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдорд╛рд╣рд┐рддреАрд╕рд╛рдареА, рдХреГрдкрдпрд╛ рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдг рдкрд╣рд╛ рд╕рддрдд рд╡рд┐рддрд░рдг.

рдХреНрд╖рдгрднрдВрдЧреБрд░ рд╡рд╛рддрд╛рд╡рд░рдг

рдПрдХ рдЕрддрд┐рд╢рдп рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рдВрдзреА рдЬреА рдЙрдШрдбрддреЗ рддреА рдореНрд╣рдгрдЬреЗ рдХреЗрд╡рд│ рд╕реНрд╡реАрдХреГрддреА рдЪрд╛рдЪрдгреАрдЪреНрдпрд╛ рдЙрджреНрджреЗрд╢рд╛рдВрд╕рд╛рдареА рдХреНрд╖рдгрд┐рдХ рд╡рд╛рддрд╛рд╡рд░рдг рддреИрдирд╛рдд рдХрд░рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛. рд╕рдВрдХрд▓реНрдкрдирд╛ рдкреНрд░рдХрд▓реНрдк рдЖрдгрд┐ рд╕реНрдЯреЕрдХ рдХрд╛рд╣реА рд╕реЛрдкреНрдпрд╛ CLI рдХрдорд╛рдВрдбрдордзреНрдпреЗ рдХрд┐рдВрд╡рд╛ рдЗрдВрдЯрд┐рдЧреНрд░реЗрд╢рди рдЯреЗрд╕реНрдЯрд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд╛рдкрд░реВрди, рдкреВрд░реНрдгрдкрдгреЗ рд╡реЗрдЧрд│реНрдпрд╛ рдЖрдгрд┐ рд╕реНрд╡рддрдВрддреНрд░ рд╡рд╛рддрд╛рд╡рд░рдгрд╛рдд рд╕рд╣рдЬрдкрдгреЗ рдЙрдкрдпреЛрдЬрд┐рдд рдЖрдгрд┐ рдирд╖реНрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Pulumi рдбрд┐рдЭрд╛рдЗрди рдХреЗрд▓реЗ рдЖрд╣реЗ.

рддреБрдореНрд╣реА рдЧрд┐рдЯрд╣рдм рд╡рд╛рдкрд░рдд рдЕрд╕рд╛рд▓ рддрд░ рдкреБрд▓реБрдореА рдСрдлрд░ рдХрд░рддреЗ GitHub рдЕреЕрдк, рдЬреЗ рддреБрдореНрд╣рд╛рд▓рд╛ рддреБрдордЪреНрдпрд╛ CI рдкрд╛рдЗрдкрд▓рд╛рдЗрдирдордзреНрдпреЗ рд╡рд┐рдирдВрддреНрдпрд╛ рдЦреЗрдЪрдгреНрдпрд╛рд╕рд╛рдареА рд╕реНрд╡реАрдХреГрддреА рдЪрд╛рдЪрдгреА рдХрдиреЗрдХреНрдЯ рдХрд░рдгреНрдпрд╛рдд рдорджрдд рдХрд░реЗрд▓. GitHub рд░реЗрдкреЙрдЬрд┐рдЯрд░реАрдордзреНрдпреЗ рдлрдХреНрдд рдЕреЕрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдиреНрд╕реНрдЯреЙрд▓ рдХрд░рд╛, рдЖрдгрд┐ Pulumi рддреБрдордЪреНрдпрд╛ CI рдЖрдгрд┐ рдкреВрд▓ рд╡рд┐рдирдВрддреНрдпрд╛рдВрдирд╛ рдЗрдиреНрдлреНрд░рд╛рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди, рдЕрдкрдбреЗрдЯреНрд╕ рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рдкрд░рд┐рдгрд╛рдорд╛рдВрдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рдЬреЛрдбреЗрд▓:

рдкреБрд▓реБрдореАрд╕рд╣ рдХреЛрдб рдореНрд╣рдгреВрди рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдХрд░рдгреЗ. рднрд╛рдЧ 2

рдЬреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣реА рддреБрдордЪреНрдпрд╛ рдореБрдЦреНрдп рд╕реНрд╡реАрдХреГрддреА рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╕рд╛рдареА Pulumi рд╡рд╛рдкрд░рддрд╛, рддреЗрд╡реНрд╣рд╛ рддреБрдореНрд╣рд╛рд▓рд╛ рдирд╡реАрди рдСрдЯреЛрдореЗрд╢рди рдХреНрд╖рдорддрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреАрд▓ рдЬреНрдпрд╛рдореБрд│реЗ рдЯреАрдордЪреА рдЙрддреНрдкрд╛рджрдХрддрд╛ рд╕реБрдзрд╛рд░реЗрд▓ рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдмрджрд▓рд╛рдВрдЪреНрдпрд╛ рдЧреБрдгрд╡рддреНрддреЗрд╡рд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдорд┐рд│реЗрд▓.

рдкрд░рд┐рдгрд╛рдо

рдпрд╛ рд▓реЗрдЦрд╛рдд, рдЖрдореНрд╣реА рдкрд╛рд╣рд┐рд▓реЗ рдЖрд╣реЗ рдХреА рд╕рд╛рдорд╛рдиреНрдп рдЙрджреНрджреЗрд╢ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╡рд╛рдкрд░реВрди, рдЕрдиреЗрдХ рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░ рдбреЗрд╡реНрд╣рд▓рдкрдореЗрдВрдЯ рддрдВрддреНрд░реЗ рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЭрд╛рд▓реА рдЖрд╣реЗрдд рдЬреА рдЖрдордЪреЗ рдНрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдЖрд╣реЗрдд. рддреНрдпрд╛рдордзреНрдпреЗ рдпреБрдирд┐рдЯ рдЪрд╛рдЪрдгреА, рдПрдХрддреНрд░реАрдХрд░рдг рдЪрд╛рдЪрдгреА рдЖрдгрд┐ рд╡рд┐рд╕реНрддреГрдд рд░рдирдЯрд╛рдЗрдо рдЪрд╛рдЪрдгреА рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреЗ рдПрдХрддреНрд░ рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдпрд╛рдЪрд╛ рд╕рдорд╛рд╡реЗрд╢ рдЖрд╣реЗ. рдЪрд╛рдЪрдгреНрдпрд╛ рдорд╛рдЧрдгреАрдиреБрд╕рд╛рд░ рдХрд┐рдВрд╡рд╛ рддреБрдордЪреНрдпрд╛ CI рд╕рд┐рд╕реНрдЯреАрдордордзреНрдпреЗ рдЪрд╛рд▓рд╡рдгреЗ рд╕реЛрдкреЗ рдЖрд╣реЗ.

рдкреБрд▓реБрдореА - рдореБрдХреНрдд рд╕реНрд░реЛрдд рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░, рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕ рд╡рд┐рдирд╛рдореВрд▓реНрдп рдЖрдгрд┐ рддреБрдордЪреНрдпрд╛ рдЖрд╡рдбрддреНрдпрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдЖрдгрд┐ рдХреНрд▓рд╛рдЙрдбрд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рддреЗ - рдЖрдЬ рдкреНрд░рдпрддреНрди рдХрд░рд╛!

тЖТ рдкрд╣рд┐рд▓рд╛ рднрд╛рдЧ

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛