ЁЯкк рдзрдбрд╛ 06 тАФ Secrets рдЖрдгрд┐ least privilege: рдХреБрд░рд┐рдЕрд░рдЪрд╛ рдмреЕрдЬ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 06 ┬╖ рдорд╛рдЧреЗ: lesson-05-artifacts-reports ┬╖ рдкреБрдвреЗ: lesson-07-build-push-image
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ05, рдЖрдгрд┐ mailroom рд╕реБрд░рдХреНрд╖рд┐рдд рдареЗрд╡рдгрд╛рд░рд╛ рдирд┐рдпрдо тАФ courier рд╢рд╛рд│реЗрдЪреА рдореБрдЦреНрдп рдХрд┐рд▓реНрд▓реА рдмрд╛рд│рдЧрдд рдирд╛рд╣реА. рдЦрд▒реНрдпрд╛ files:
- iam/github-oidc-trust-policy.json тАФ CI рдЪреА рдЯреЛрдкреА рдХреЛрдг рдШрд╛рд▓реВ рд╢рдХрддреЗ: рдпрд╛ repo рдЪреНрдпрд╛
mainbranch рдЪреЗ runs - iam/ci-role-policy.json тАФ рддреА рдЯреЛрдкреА рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЗ: рдПрдХрд╛ ECR repository рдордзреНрдпреЗ push, рдПрдХрд╛ cluster рдЪреЗ describe
- .github/workflows/ship.yml рдЖрдгрд┐ ci.yml тАФ
permissions:blocks рдЖрдгрд┐ЁЯкк show the badgestep - .circleci/config.yml, .gitlab-ci.yml, Jenkinsfile тАФ contexts,
id_tokens,withAWS
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдлреЛрдЯреЛрдХреЙрдкреА рдареЗрд╡рдгреНрдпрд╛рд╕рд╛рдареА courier robot ЁЯУо рд▓рд╛ рд▓реЙрдХрд░ рд░реВрдо ЁЯПж рдордзреНрдпреЗ рдЬрд╛рдпрдЪреЗ рдЖрд╣реЗ. рдЖрд│рд╢реА рдорд╛рд░реНрдЧ: рддреНрдпрд╛рд▓рд╛ рдореБрдЦреНрдп рдХрд┐рд▓реНрд▓реА ЁЯФС рджреНрдпрд╛ тАФ рддреА рд╕рдВрдкреВрд░реНрдг рдЗрдорд╛рд░рдд рдЙрдШрдбрддреЗ, рддрд┐рд▓рд╛ рд╕рдВрдкрдгреНрдпрд╛рдЪреА рддрд╛рд░реАрдЦ рдирд╛рд╣реА, рдЖрдгрд┐ robot рдиреЗ рддреА рдХреЙрд░рд┐рдбреЙрд░рдордзреНрдпреЗ рдЯрд╛рдХрд▓реА рддрд░ рдЬреНрдпрд╛рд▓рд╛ рд╕рд╛рдкрдбреЗрд▓ рддреЛ рд╢рд╛рд│реЗрдЪрд╛ рдорд╛рд▓рдХ рд╣реЛрддреЛ. CI рдордзреНрдпреЗ рддреА рдХрд┐рд▓реНрд▓реА рдореНрд╣рдгрдЬреЗ рд╕рд╛рдард╡рд▓реЗрд▓реА AWS access key.
рд╢рд╛рд│реЗрдЪрд╛ рдорд╛рд░реНрдЧ: robot рдПрдХ рдмреЕрдЬ ЁЯкк рдШрд╛рд▓рддреЛ рдЬреНрдпрд╛рд╡рд░ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЕрд╕рддреЗ "рдпрд╛ рд╢рд╛рд│реЗрдЪрд╛ courier, рдпрд╛ рдорд╛рд░реНрдЧрд╛рд╡рд░". рдкрд╣рд╛рд░реЗрдХрд░реА рддреЛ рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреНрдпрд╛ рдпрд╛рджреАрд╢реА рдЬреБрд│рд╡реВрди рдкрд╛рд╣рддреЛ тАФ рд╢рд╛рд│реЗрдЪреНрдпрд╛ office рдиреЗ рд╕рд╣реА рдХреЗрд▓реА рдЖрд╣реЗ рдХрд╛? рдпрд╛ рджрд╛рд░рд╛рд╕рд╛рдареА рдЖрд╣реЗ рдХрд╛? рдпрд╛ рдорд╛рд░реНрдЧрд╛рд╕рд╛рдареА? тАФ рдЖрдгрд┐ рдПрдХ рдбреЗ рдкрд╛рд╕ ЁЯОл рджреЗрддреЛ рдЬреЛ рдПрдХрдЪ рд▓реЙрдХрд░ рдЙрдШрдбрддреЛ рдЖрдгрд┐ рд╕реБрдорд╛рд░реЗ рдПрдХрд╛ рддрд╛рд╕рд╛рдд рдЪрд╛рд▓рдгреЗ рдмрдВрдж рд╣реЛрддреЛ. рддреЗрдЪ рдореНрд╣рдгрдЬреЗ OIDC: GitHub рдмреЕрдЬрд╡рд░ рд╕рд╣реА рдХрд░рддреЗ, AWS STS рд╣рд╛ рдкрд╣рд╛рд░реЗрдХрд░реА, trust policy рдореНрд╣рдгрдЬреЗ рдкрд╛рд╣реБрдгреНрдпрд╛рдВрдЪреА рдпрд╛рджреА, permissions policy рдореНрд╣рдгрдЬреЗ рдкрд╛рд╕ рдЙрдШрдбреВ рд╢рдХрдгрд╛рд▒реНрдпрд╛ рджрд╛рд░рд╛рдВрдЪреА рдпрд╛рджреА.
Courier рдЪреНрдпрд╛ рдЦрд┐рд╢рд╛рдд рдЖрдгрдЦреА рджреЛрди рдЧреЛрд╖реНрдЯреА. Variables рдореНрд╣рдгрдЬреЗ рд╕реВрдЪрдирд╛ рдлрд▓рдХрд╛рд╡рд░ рд▓рд╛рд╡рд▓реЗрд▓реНрдпрд╛ рдЪрд┐рдареНрдареНрдпрд╛ тАФ region, repository рдЪреЗ рдирд╛рд╡ тАФ рдХреЛрдгреАрд╣реА рд╡рд╛рдЪреВ рд╢рдХрддреЗ. Secrets рдореНрд╣рдгрдЬреЗ рд╕реАрд▓рдмрдВрдж рдкрд╛рдХрд┐рдЯреЗ, рдЬреА mailroom рддреА рдЫрд╛рдкрдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ logs рдордзреНрдпреЗ рдХрд╛рд│реА рдХрд░рддреЗ. рдкрдг marker рдлрдХреНрдд рдиреЗрдордХрд╛ рдордЬрдХреВрд░рдЪ рдУрд│рдЦрддреЛ; рдкрддреНрд░рд╛рдЪреА рддрд┐рд░рдХреА рдлреЛрдЯреЛрдХреЙрдкреА рдХрд╛рдврд╛ (base64 рдХрд░рд╛, рддреБрдХрдбреЗ рдХрд░рд╛, file рдордзреНрдпреЗ рд▓рд┐рд╣рд╛) рдЖрдгрд┐ marker рдЪреБрдХрддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
job["ЁЯУо push job<br/>permissions: id-token: write"]
gh["ЁЯПл GitHub OIDC<br/>signs a short-lived token"]
sts["ЁЯЫВ AWS STS<br/>checks the trust policy (WHO)<br/>aud + sub"]
ecr["ЁЯПж ECR hello-courier<br/>ci-role-policy (WHAT): one repo, one cluster"]
job -->|"1 ask for a badge"| gh
gh -->|"2 signed ID token"| job
job -->|"3 show the badge"| sts
sts -->|"4 day pass: temporary credentials, this job only"| ecr
тЭУ рдХрд╛рдп
- Secret = CI system encrypted рд╕реНрд╡рд░реВрдкрд╛рдд рдареЗрд╡рддреЗ, save рдХреЗрд▓реНрдпрд╛рд╡рд░ рд▓рдкрд╡рддреЗ рдЖрдгрд┐ logs рдордзреНрдпреЗ mask (
***) рдХрд░рддреЗ рдЕрд╕реЗ рдореВрд▓реНрдп:${{ secrets.NAME }}. Variable = рд╕рд╛рдзреА configuration, Settings рдордзреНрдпреЗ рд╡рд╛рдЪрддрд╛ рдпреЗрддреЗ, рдЬрд╢реАрдЪреНрдпрд╛ рддрд╢реА рдЫрд╛рдкрд▓реА рдЬрд╛рддреЗ:${{ vars.NAME }}. рдпрд╛ repo рдЪреНрдпрд╛ рдЪрд╛рд░ AWS settings variables рдЖрд╣реЗрдд тАФ role ARN рдЖрдгрд┐ region рд╣реЗ рдкрддреНрддреЗ рдЖрд╣реЗрдд, рдХрд┐рд▓реНрд▓реНрдпрд╛ рдирд╛рд╣реАрдд. - Masking = log рдордзреНрдпреЗ рдиреЗрдордХреНрдпрд╛ string рдЪреА рдЕрджрд▓рд╛рдмрджрд▓.
echo $SECRET***рдЫрд╛рдкрддреЗ, рдкрдг file, artifact рдХрд┐рдВрд╡рд╛ URL рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ, рдХрд┐рдВрд╡рд╛base64рдордзреВрди pipe рдХреЗрд▓реЗрд▓реЗ рдореВрд▓реНрдп рддрд░реАрд╣реА leak рдЪ рдЖрд╣реЗ. permissions:= run рдЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛GITHUB_TOKENрдХрд╛рдп рдХрд░реВ рд╢рдХрддреЛ; рдХреЛрдгрддреАрд╣реА permission рд▓рд┐рд╣рд┐рд▓реА рдХреА рди рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ none рд╣реЛрддрд╛рдд.id-token: writeрдореНрд╣рдгрдЬреЗ "OIDC token рдорд╛рдЧреВ рд╢рдХрддреЛ" тАФ "write" рдорд╛рдЧрдгреНрдпрд╛рдмрджреНрджрд▓ рдЖрд╣реЗ, рдХреБрдареЗ рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдмрджреНрджрд▓ рдирд╛рд╣реА.- Trust policy = role рдХреЛрдг assume рдХрд░реВ рд╢рдХрддреЗ рддреЗ, STS token рдЪреНрдпрд╛
audрдЖрдгрд┐subclaims рд╢реА рдЬреБрд│рд╡реВрди рдХреЛрдг рддреЗ рддрдкрд╛рд╕рддреЗ. Permissions policy = role рдХрд╛рдп рдХрд░реВ рд╢рдХрддреЗ.
ЁЯза рдореБрдЦреНрдп рдХрд┐рд▓реНрд▓реА рд╡рд┐рд░реБрджреНрдз рдмреЕрдЬ
| ЁЯФС рд╕рд╛рдард╡рд▓реЗрд▓реНрдпрд╛ access keys | ЁЯкк рдмреЕрдЬ тЖТ ЁЯОл рдбреЗ рдкрд╛рд╕ (OIDC) | |
|---|---|---|
| рддреЗ рдХреБрдареЗ рд░рд╛рд╣рддреЗ | secret рдордзреНрдпреЗ, рдХреЛрдгреА rotate рдХрд░реЗрдкрд░реНрдпрдВрдд | рдХреБрдареЗрдЪ рдирд╛рд╣реА тАФ рдкреНрд░рддреНрдпреЗрдХ job рд╕рд╛рдареА рдирд╡реЗ рдмрдирддреЗ |
| рддреЗ leak рдЭрд╛рд▓реЗ рддрд░ | рд▓рдХреНрд╖рд╛рдд рдпреЗрдКрди rotate рд╣реЛрдИрдкрд░реНрдпрдВрдд рд╡реИрдз | рддрд╛рд╕рд╛рднрд░рд╛рдд рд╕рдВрдкрддреЗ; trust policy рдЪреНрдпрд╛ рдмрд╛рд╣реЗрд░ рдирд┐рд░реБрдкрдпреЛрдЧреА |
| рддреЗ рдХрд╛рдп рдЙрдШрдбрддреЗ | IAM user рдХрдбреЗ рдЬреЗ рдХрд╛рд╣реА рдЖрд╣реЗ рддреЗ | рдлрдХреНрдд role рдЪреНрдпрд╛ policy рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ |
ЁЯдФ рдХрд╛
Leak рдЭрд╛рд▓реЗрд▓реА CI credentials рд╣реА рдПрдХ рдиреЗрд╣рдореАрдЪреА рдШрдЯрдирд╛ рдЖрд╣реЗ: log рдордзреНрдпреЗ рдЫрд╛рдкрд▓реЗрд▓реА key, artifact рдордзреНрдпреЗ copy рдЭрд╛рд▓реЗрд▓реА, рдХрд┐рдВрд╡рд╛ fork рдордзрд▓реНрдпрд╛ workflow рдиреЗ рд╡рд╛рдЪрд▓реЗрд▓реА. рд╕рд╛рдард╡рд▓реЗрд▓реА key rotate рдХрд░рд╛рд╡реА рд▓рд╛рдЧрддреЗ, рдЖрдгрд┐ рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдХреНрд╡рдЪрд┐рддрдЪ рдХреЗрд▓реА рдЬрд╛рддреЗ. OIDC рд╕рд╛рдард╡рд▓реЗрд▓реА key рдХрд╛рдвреВрди рдЯрд╛рдХрддреЗ, рдЖрдгрд┐ рджреЛрди IAM files рдиреБрдХрд╕рд╛рдирд╛рдЪрд╛ рдкрд░рд┐рдШ рдПрдХрд╛ repository рдЖрдгрд┐ рдПрдХрд╛ cluster рдкреБрд░рддрд╛ рд▓рд╣рд╛рди рдХрд░рддрд╛рдд. рд╣реЗ AWS рд╢рд╛рд│реЗрдЪреЗ "robots рд╕рд╛рдареА рдмреЕрдЬ" рдЖрд╣реЗ, EC2 instance рдРрд╡рдЬреА GitHub runner рд╕рд╣, рдЖрдгрд┐ рддреНрдпрд╛рдЪрд╛ IAM рд╕реНрд╡рдЪреНрдЫрддреЗрдЪрд╛ рдзрдбрд╛ pipeline рд▓рд╛ рд▓рд╛рд╡рд▓реЗрд▓рд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
Run рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ token рд╕рд╛рдареА least privilege. ci.yml рдлрдХреНрдд contents: read рджреЗрддреЗ; ship.yml рдмреЕрдЬрд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реА рдПрдХ рдЧреЛрд╖реНрдЯ рдЬреЛрдбрддреЗ:
permissions:
contents: read
id-token: write # lesson 06: lets this run ask for an OIDC badge тАФ no stored AWS keys
рдмреЕрдЬрдЪреА step. push job рдлрдХреНрдд variable рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛рдЪ рдЪрд╛рд▓рддреЛ (if: vars.AWS_ROLE_ARN != '' тАФ AWS рдирд╕рд▓реЗрд▓рд╛ fork рддреЛ рд╡рдЧрд│рддреЛ рдЖрдгрд┐ рд╣рд┐рд░рд╡рд╛рдЪ рд░рд╛рд╣рддреЛ). рдкрд╛рдЪ рдУрд│реА, рдЪрд╛рд░ рдкрд╛рдпрд▒реНрдпрд╛:
- name: ЁЯкк show the badge, get a day pass (OIDC тЖТ temporary credentials)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: ${{ vars.AWS_ROLE_ARN }}
aws-region: ${{ vars.AWS_REGION }}
id-token: writeрдиреЗ рдкрд░рд╡рд╛рдирдЧреА рдорд┐рд│рд╛рд▓реНрдпрд╛рд╡рд░, action GitHub рдХрдбреЗ token рдорд╛рдЧрддреЗ; GitHubaud=sts.amazonaws.comрдЖрдгрд┐sub=repo:BaluRaut/learn-cicd-school:ref:refs/heads/mainрдЕрд╕рд▓реЗрд▓реНрдпрд╛ token рд╡рд░ рд╕рд╣реА рдХрд░рддреЗ.- Action рддреЛ token рдЖрдгрд┐ role ARN рдШреЗрдКрди STS
AssumeRoleWithWebIdentitycall рдХрд░рддреЗ. - STS GitHub рдЪреА рд╕рд╣реА рддрдкрд╛рд╕рддреЗ, рдордЧ role рдЪреА trust policy рддрдкрд╛рд╕рддреЗ:
audрдмрд░реЛрдмрд░ рдЖрд╣реЗ рдХрд╛,subрдЬреБрд│рддреЛ рдХрд╛? - STS temporary credentials рдкрд░рдд рджреЗрддреЗ (key, secret, session token тАФ default рдиреБрд╕рд╛рд░ рдПрдХ рддрд╛рд╕), рдЬреА action рдлрдХреНрдд рдпрд╛ job рд╕рд╛рдареА environment variables рдореНрд╣рдгреВрди export рдХрд░рддреЗ. Job рд╕рдВрдкрд▓рд╛, credentials рдЧреЗрд▓реА.
рдХреЛрдг тАФ trust policy, iam/github-oidc-trust-policy.json:
"Principal": { "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com" },
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": { "token.actions.githubusercontent.com:aud": "sts.amazonaws.com" },
"StringLike": { "token.actions.githubusercontent.com:sub": "repo:BaluRaut/learn-cicd-school:ref:refs/heads/main" }
}
sub рдЪреА рдУрд│ рд╣рд╛рдЪ рд╕рдВрдкреВрд░реНрдг рдореБрджреНрджрд╛ рдЖрд╣реЗ: рджреБрд╕рд▒реНрдпрд╛ repository рдордзрд▓рд╛, рдХрд┐рдВрд╡рд╛ рдпрд╛рдЪ repo рдЪреНрдпрд╛ feature branch рд╡рд░рдЪрд╛ run
рд╡реЗрдЧрд│рд╛ sub рджрд╛рдЦрд╡рддреЛ рдЖрдгрд┐ рдирд╛рдХрд╛рд░рд▓рд╛ рдЬрд╛рддреЛ. рддреБрдордЪреНрдпрд╛ fork рдЪреЗ runs repo:<your-user>/learn-cicd-school:тАж рдШреЗрдКрди рдпреЗрддрд╛рдд, рдореНрд╣рдгреВрди рддреБрдордЪреНрдпрд╛ fork рд╕рд╛рдареАрдЪреНрдпрд╛ role рдордзреНрдпреЗ рддрд┐рдереЗ рддреБрдордЪреЗ рдирд╛рд╡ рд╣рд╡реЗ.
рдХрд╛рдп тАФ permissions policy, iam/ci-role-policy.json (рдордзрд▓реНрдпрд╛ statement рдордзрд▓реНрдпрд╛ рд╕рд╛рдд ecr: actions рд╡рдЧрд│рд▓реНрдпрд╛ рдЖрд╣реЗрдд):
{ "Sid": "EcrLogin", "Effect": "Allow", "Action": "ecr:GetAuthorizationToken", "Resource": "*" },
{
"Sid": "EcrPushOneRepo",
тАж
"Resource": "arn:aws:ecr:ap-south-1:123456789012:repository/hello-courier"
},
{ "Sid": "FindTheCluster", "Effect": "Allow", "Action": "eks:DescribeCluster",
"Resource": "arn:aws:eks:ap-south-1:123456789012:cluster/school-eks" }
GetAuthorizationToken рдореНрд╣рдгрдЬреЗ registry login, рдЖрдгрд┐ рддреЛ рд░рдЪрдиреЗрдиреБрд╕рд╛рд░рдЪ рд╕рдВрдкреВрд░реНрдг account рд╕рд╛рдареА рдЕрд╕рддреЛ, рдореНрд╣рдгреВрди рддреНрдпрд╛рд▓рд╛ * рд▓рд╛рдЧрддреЛ. рд╡рдЧрд│рд▓реЗрд▓реНрдпрд╛ actions
layers upload рдХрд░рддрд╛рдд рдЖрдгрд┐ image рдареЗрд╡рддрд╛рдд тАФ repositories delete рдХрд┐рдВрд╡рд╛ create рдХрд░рдгрд╛рд░реЗ рдХрд╛рд╣реАрд╣реА рдирд╛рд╣реА тАФ рдЖрдгрд┐ рдЙрд░рд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдУрд│ рдПрдХрдЪ repository рдХрд┐рдВрд╡рд╛ рдПрдХрдЪ cluster рдирд╛рд╡рд╛рдиреЗ рд╕рд╛рдВрдЧрддреЗ. ecr:* рдирд╛рд╣реА, eks:* рдирд╛рд╣реА, iam:* рдирд╛рд╣реА.
ЁЯФБ рд╣реЗрдЪ CircleCI рдордзреНрдпреЗ
- test: # NO context: tests never see cloud credentials
- build-and-push:
context: school-cicd
requires: [test]
Context рдореНрд╣рдгрдЬреЗ organization settings рдордзрд▓рд╛ environment variables рдЪрд╛ рдирд╛рд╡ рджрд┐рд▓реЗрд▓рд╛ рд╕рдВрдЪ; рдЬреЗ jobs рддреЛ
рдпрд╛рджреАрдд рд▓рд┐рд╣рд┐рддрд╛рдд рддреНрдпрд╛рдВрдирд╛рдЪ рддреЛ рдорд┐рд│рддреЛ. build-and-push рдордзреНрдпреЗ, role_arn: ${AWS_ROLE_ARN} рд╕рд╣ aws-cli/setup CircleCI рдЪреНрдпрд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ OIDC token рдиреЗ рддреАрдЪ рдмреЕрдЬрдЪреА рдЕрджрд▓рд╛рдмрджрд▓ рдХрд░рддреЗ.
ЁЯжК рд╣реЗрдЪ GitLab CI рдордзреНрдпреЗ
id_tokens:
GITLAB_OIDC_TOKEN:
aud: https://gitlab.com
id_tokens: рдореБрд│реЗ GitLab рдмреЕрдЬ $GITLAB_OIDC_TOKEN рдордзреНрдпреЗ рдмрдирд╡рддреЗ; рдордЧ .aws-badge anchor рдЪреЗ before_script
рд╣рд╛рддрд╛рдиреЗ aws sts assume-role-with-web-identity рдЪрд╛рд▓рд╡рддреЗ рдЖрдгрд┐ рддреАрди credentials export рдХрд░рддреЗ. <<: *aws-badge merge рдХрд░рдгрд╛рд▒реНрдпрд╛ jobs рдирд╛рдЪ рддреЗ рдорд┐рд│рддреЗ тАФ test job рд▓рд╛ рдирд╛рд╣реА.
ЁЯОй рд╣реЗрдЪ Jenkins рдордзреНрдпреЗ
withAWS(credentials: 'aws-school-cicd', region: env.AWS_REGION) {
Jenkins credentials рд╕реНрд╡рддрдГрдЪреНрдпрд╛ store рдордзреНрдпреЗ рдареЗрд╡рддреЗ рдЖрдгрд┐ withAWS (Pipeline: AWS Steps plugin) рддреА рдлрдХреНрдд block рдЪреНрдпрд╛ рдЖрддрдЪ рдЙрдШрдб рдХрд░рддреЗ.
Jenkins рд╕рд╛рдареА рдХреЛрдгрддреАрд╣реА hosted рд╕реЗрд╡рд╛ рдЖрдкреЛрдЖрдк рдмреЕрдЬрд╡рд░ рд╕рд╣реА рдХрд░рдд рдирд╛рд╣реА, рдореНрд╣рдгреВрди рдкреНрд░рд╛рдорд╛рдгрд┐рдХ setup рдореНрд╣рдгрдЬреЗ рдЖрдзреАрдЪ IAM role рдЕрд╕рд▓реЗрд▓реНрдпрд╛ EC2 instance рдХрд┐рдВрд╡рд╛ pod рд╡рд░рдЪрд╛ agent тАФ рдкреБрдиреНрд╣рд╛ AWS рд╢рд╛рд│реЗрдЪрд╛ рдзрдбрд╛ 05.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# 1) read the two lists тАФ no AWS needed
cat iam/github-oidc-trust-policy.json iam/ci-role-policy.json # WHO: aud + sub ┬╖ WHAT: one repo, one cluster
# 2) what your fork (lesson 03) carries: no variables тЖТ push/deploy skipped; no secrets тЖТ no stored keys
gh variable list && gh secret list
# 3) OPTIONAL тАФ needs an AWS account (ECR storage and transfer may cost a little)
ACCOUNT=$(aws sts get-caller-identity --query Account --output text); ME=$(gh api user --jq .login)
aws iam create-open-id-connect-provider --url https://token.actions.githubusercontent.com --client-id-list sts.amazonaws.com # older AWS CLIs also insist on --thumbprint-list
# drop the "_comment" line (IAM accepts only known keys); put YOUR account id and GitHub user in
grep -v '"_comment"' iam/github-oidc-trust-policy.json | sed -e "s/123456789012/$ACCOUNT/" -e "s|repo:BaluRaut/|repo:$ME/|" > /tmp/trust.json
grep -v '"_comment"' iam/ci-role-policy.json | sed "s/123456789012/$ACCOUNT/" > /tmp/perms.json
aws iam create-role --role-name learn-cicd-school-ci --assume-role-policy-document file:///tmp/trust.json
aws iam put-role-policy --role-name learn-cicd-school-ci --policy-name ci --policy-document file:///tmp/perms.json
aws ecr create-repository --repository-name hello-courier --region ap-south-1 --image-scanning-configuration scanOnPush=true
gh variable set AWS_ROLE_ARN --body "arn:aws:iam::$ACCOUNT:role/learn-cicd-school-ci"
gh variable set AWS_REGION --body ap-south-1 && gh variable set ECR_REPOSITORY --body hello-courier
# leave EKS_CLUSTER unset until lesson 10: the next push to main runs "push to ECR"; deploy stays skipped
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- "рд╕реБрд░рдХреНрд╖рд┐рдд рд░рд╛рд╣рд╛рд╡реЗ рдореНрд╣рдгреВрди" role ARN рдХрд┐рдВрд╡рд╛ region secret рдореНрд╣рдгреВрди рдареЗрд╡рдгреЗ тАФ рддреЗ рдкрддреНрддреЗ рдЖрд╣реЗрдд; рдордЧ masking рдЙрдкрдпреЛрдЧреА log рдУрд│реА рд▓рдкрд╡рддреЗ, рдЖрдгрд┐ job-level
if:varsрддрдкрд╛рд╕реВ рд╢рдХрддреЛ рдкрдгsecretsрдирд╛рд╣реА subcondition рдирд╕рд▓реЗрд▓реА (рдХрд┐рдВрд╡рд╛ рдореЛрдареЗ wildcard рдЕрд╕рд▓реЗрд▓реА) trust policy тАФ рдордЧsts.amazonaws.comрд╕рд╛рдареА token рдорд┐рд│рд╡реВ рд╢рдХрдгрд╛рд░реА рдХреЛрдгрддреАрд╣реА GitHub repository role assume рдХрд░реВ рд╢рдХрддреЗ- log рдордзрд▓реНрдпрд╛
***рд▓рд╛ рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪрд╛ рдкреБрд░рд╛рд╡рд╛ рд╕рдордЬрдгреЗ тАФ file, artifact, URL рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ, рдХрд┐рдВрд╡рд╛base64рдордзреВрди pipe рдХреЗрд▓реЗрд▓реЗ secret mask рд▓рд╛ рдЪреБрдХрд╡реВрди рдирд┐рдШреВрди рдЬрд╛рддреЗ
тПня╕П рдкреБрдвреЗ
рдбреЗ рдкрд╛рд╕ рд╣рд╛рддрд╛рдд рдШреЗрдКрди courier рдлреЛрдЯреЛрдХреЙрдкреА рдорд╢реАрдирдХрдбреЗ рдЬрд╛рддреЛ: рдбрдмрд╛ build рдХрд░рд╛, рддреЛ рд╕реБрд░реВ рд╣реЛрддреЛ рд╣реЗ рд╕рд┐рджреНрдз рдХрд░рд╛, рддреНрдпрд╛рд╡рд░ commit рдЪрд╛ рдард╕рд╛ рд▓рд┐рд╣рд╛, рд▓реЙрдХрд░рдордзреНрдпреЗ рдареЗрд╡рд╛. ЁЯУж
git checkout lesson-07-build-push-image