
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдПрдХ рдХрд╛рдордХрд╛рдЬреА рдХреНрд▓рд╕реНрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдк-рдЯреВ-рдбреЗрдЯ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рдЙрд╕ рдкрд░ рдиреНрдпреВрдирддрдо рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╕рд╛рди-рд╕реЗ-рдЙрдкрдпреЛрдЧ рдЙрдкрдХрд░рдг рд╣реИред рдЖрдк рдЗрд╕реЗ рддрдм рдФрд░ рдЕрдзрд┐рдХ рд╕рд░рд╛рд╣рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдм рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рдХреЗрд╡рд▓ рдкреНрд░рд╢рд╛рд╕рдХреЛрдВ / DevOps рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдХреЛ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рднреА рд╣реЛрддреА рд╣реИ, рдЬреЛ рдХрдВрд╕реЛрд▓ рдХреЗ рд▓рд┐рдП рдХрдо рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ / рдпрд╛ рдбрдмрдЯреЗрд▓ рдФрд░ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рд╕рднреА рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВред рддреЛ рдпрд╣ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╣реБрдЖ: рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреБрдмрд░рдиреЗрдЯреНрд╕ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрдХ рддреНрд╡рд░рд┐рдд рдкрд╣реБрдВрдЪ рдЪрд╛рд╣рддреЗ рдереЗ, рдФрд░ рдЪреВрдВрдХрд┐ рд╣рдо рдЧрд┐рдЯрд▓реИрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рдзрд╛рди рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдЖрдпрд╛ рдерд╛ред
рдпрд╣ рдХреНрдпреЛрдВ рд╣реИ?
рдкреНрд░рддреНрдпрдХреНрд╖ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдбреАрдмрдЧрд┐рдВрдЧ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП K8s рдбреИрд╢рдмреЛрд░реНрдб рдЬреИрд╕реЗ рдЯреВрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдХрднреА-рдХрднреА рдЖрдк рд▓реЙрдЧ рдФрд░ рд╕рдВрд╕рд╛рдзрди рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдХрднреА-рдХрднреА рдкреЙрдбреНрд╕ рдХреЛ рдорд╛рд░рддреЗ рд╣реИрдВ, рд╕реНрдХреЗрд▓ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ / рд╕реНрдЯреЗрдЯрдлреБрд▓рд╕реЗрдЯреНрд╕ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдВрдЯреЗрдирд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдиреБрд░реЛрдз рднреА рд╣реИрдВ рдЬрд┐рдирдХреЗ рд▓рд┐рдП рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рдХреБрдмреЗрдЯрд▓-рдбреАрдмрдЧ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдордиреЛрд╡реИрдЬреНрдЮрд╛рдирд┐рдХ рдХреНрд╖рдг рд╣реИ рдЬрдм рд╡реЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ "рд╕рдм рдХреБрдЫ рд╣рд░рд╛ рд╣реИ", рдФрд░ рдЗрд╕ рддрд░рд╣ рд╢рд╛рдВрдд рд╣реЛ рдЬрд╛рдУ рдХрд┐ "рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ" (рдЬреЛ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдмрд╣реБрдд рд╕рд╛рдкреЗрдХреНрд╖ рд╣реИ ... рд▓реЗрдХрд┐рди рдпрд╣ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред )ред
рд╣рдо GitLab рдХрд╛
рдЙрдкрдпреЛрдЧ рдПрдХ рдорд╛рдирдХ CI рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд░реВрдк рдореЗрдВ рдХрд░рддреЗ рд╣реИрдВ: рд╕рднреА рдбреЗрд╡рд▓рдкрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдиреНрд╣реЗрдВ рдПрдХреНрд╕реЗрд╕ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЧреАрддрд╛рдмрд▓реИрдм рдореЗрдВ рдЦрд╛рддреЛрдВ рдХреЗ рд╕рд╛рде рдбреИрд╢рдмреЛрд░реНрдб рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдирд╛ рддрд░реНрдХрд╕рдВрдЧрдд рдерд╛ред
рдпрд╣ рднреА рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо NGINX Ingress рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп
рдкреНрд░рд╡реЗрд╢ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ
рд╣реИрдВ , рддреЛ рдЖрдкрдХреЛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдиреЛрдЯреЗрд╢рди рдХреЗ рдПрдирд╛рд▓реЙрдЧреНрд╕ рдХреЛ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред
рд╣рдо рдПрдХреАрдХрд░рдг рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ
рдбреИрд╢рдмреЛрд░реНрдб рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдзреНрдпрд╛рди рджреЗрдВ : рдпрджрд┐ рдЖрдк рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рдЪрд░рдгреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ - рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП - рдкрд╣рд▓реЗ рдЕрдЧрд▓реЗ рдЙрдкрд╢реАрд░реНрд╖рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝реЗрдВредрдЪреВрдВрдХрд┐ рд╣рдо рдХрдИ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдореЗрдВ рдЗрд╕ рдПрдХреАрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЗрд╕рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рди рд╕реНрд░реЛрддреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рд╡реЗ рдПрдХ
рд╡рд┐рд╢реЗрд╖ GitHub рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд╡реЗ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдбреИрд╢рдмреЛрд░реНрдб рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд YAML рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕рд╛рде рд╣реА рддреНрд╡рд░рд┐рдд рддреИрдирд╛рддреА рдХреЗ рд▓рд┐рдП рдПрдХ рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред
рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдПрдХ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдбреИрд╢рдмреЛрд░реНрдб рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ GitLab рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреА рд╣реИ:
$ ./ctl.sh Usage: ctl.sh [OPTION]... --gitlab-url GITLAB_URL --oauth2-id ID --oauth2-secret SECRET --dashboard-url DASHBOARD_URL Install kubernetes-dashboard to Kubernetes cluster. Mandatory arguments: -i, --install install into 'kube-system' namespace -u, --upgrade upgrade existing installation, will reuse password and host names -d, --delete remove everything, including the namespace --gitlab-url set gitlab url with schema (https://gitlab.example.com) --oauth2-id set OAUTH2_PROXY_CLIENT_ID from gitlab --oauth2-secret set OAUTH2_PROXY_CLIENT_SECRET from gitlab --dashboard-url set dashboard url without schema (dashboard.example.com) Optional arguments: -h, --help output this message
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ GitLab: Admin area тЖТ Applications - рдкрд░ рдЬрд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рдкреИрдирд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдЗрд╕реЗ "рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб" рдХрд╣рддреЗ рд╣реИрдВ:

рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, GitLab рд╣реИрд╢ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧрд╛:

рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд╕реНрдерд╛рдкрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
$ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769eтАж --oauth2-secret 6b79168fтАж --dashboard-url dashboard.example.com
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рд╣реБрдЖ:
$ kubectl -n kube-system get pod | egrep '(dash|oauth)' kubernetes-dashboard-76b55bc9f8-xpncp 1/1 Running 0 14s oauth2-proxy-5586ccf95c-czp2v 1/1 Running 0 14s
рдЬрд▓реНрджреА рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╕рдм рдХреБрдЫ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдЕрднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ! рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдЫрд╡рд┐ рдореЗрдВ (рдЕрдиреНрдп рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рд╕рдорд╛рди рд╣реИ), рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдкрдХрдбрд╝рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдкрд░рд┐рд╕реНрдерд┐рддрд┐ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИ рдХрд┐ рдУрдЙрде рдХреБрдХреА рдХреЛ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рдпрдВ (рдСрдЙрде) рд╣рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ ...
рдкреИрдЪ рдХреЗ рд╕рд╛рде рдЖрдкрдХреА oauth рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред
рдкреИрдЪ рдХреЛ рдУрд╣рд╛рдЙрдЯ рдФрд░ рд░реАрдЗрдирд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд Dockerfile рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:
FROM golang:1.9-alpine3.7 WORKDIR /go/src/github.com/bitly/oauth2_proxy RUN apk --update add make git build-base curl bash ca-certificates wget \ && update-ca-certificates \ && go get -u github.com/golang/dep/cmd/dep \ && curl -sSO https://raw.githubusercontent.com/pote/gpm/v1.4.0/bin/gpm \ && chmod +x gpm \ && mv gpm /usr/local/bin RUN git clone https://github.com/bitly/oauth2_proxy.git . \ && git checkout fa2771998a98a5bfdfa3c3503757668ac4f1c8ec ADD rd.patch . RUN patch -p1 < rd.patch && ./dist.sh FROM alpine:3.7 RUN apk --update add curl bash ca-certificates && update-ca-certificates COPY --from=0 /go/src/github.com/bitly/oauth2_proxy/dist/ /bin/ EXPOSE 8080 4180 ENTRYPOINT [ "/bin/oauth2_proxy" ] CMD [ "--upstream=http://0.0.0.0:8080/", "--http-address=0.0.0.0:4180" ]
рдФрд░ рдпрд╣рд╛рдБ rd.patch рдкреИрдЪ рд╣реА рд╣реИ diff --git a/Gopkg.lock b/Gopkg.lock index 5a3758a..1294a90 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -131,7 +131,7 @@ version = "v1.0.0" [[projects]] - name = "gopkg.in/fsnotify.v1" + name = "gopkg.in/fsnotify/fsnotify.v1" packages = ["."] revision = "836bfd95fecc0f1511dd66bdbf2b5b61ab8b00b6" version = "v1.2.11" @@ -149,6 +149,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "b502c41a61115d14d6379be26b0300f65d173bdad852f0170d387ebf2d7ec173" + inputs-digest = "cfdd05348394cd0597edb858bdba5681665358a963356ed248d98f39373c33b5" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index c4005e1..422bd43 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -4,7 +4,7 @@ # [[constraint]] - name = "github.com/18F/hmacauth" + name = "github.com/mbland/hmacauth" version = "~1.0.1" [[constraint]] @@ -36,7 +36,7 @@ name = "google.golang.org/api" [[constraint]] - name = "gopkg.in/fsnotify.v1" + name = "gopkg.in/fsnotify/fsnotify.v1" version = "~1.2.0" [[constraint]] diff --git a/dist.sh b/dist.sh index a00318b..92990d4 100755 --- a/dist.sh +++ b/dist.sh @@ -14,25 +14,13 @@ goversion=$(go version | awk '{print $3}') sha256sum=() echo "... running tests" -./test.sh +#./test.sh -for os in windows linux darwin; do - echo "... building v$version for $os/$arch" - EXT= - if [ $os = windows ]; then - EXT=".exe" - fi - BUILD=$(mktemp -d ${TMPDIR:-/tmp}/oauth2_proxy.XXXXXX) - TARGET="oauth2_proxy-$version.$os-$arch.$goversion" - FILENAME="oauth2_proxy-$version.$os-$arch$EXT" - GOOS=$os GOARCH=$arch CGO_ENABLED=0 \ - go build -ldflags="-s -w" -o $BUILD/$TARGET/$FILENAME || exit 1 - pushd $BUILD/$TARGET - sha256sum+=("$(shasum -a 256 $FILENAME || exit 1)") - cd .. && tar czvf $TARGET.tar.gz $TARGET - mv $TARGET.tar.gz $DIR/dist - popd -done +os='linux' +echo "... building v$version for $os/$arch" +TARGET="oauth2_proxy-$version.$os-$arch.$goversion" +GOOS=$os GOARCH=$arch CGO_ENABLED=0 \ + go build -ldflags="-s -w" -o ./dist/oauth2_proxy || exit 1 checksum_file="sha256sum.txt" cd $DIR/dist diff --git a/oauthproxy.go b/oauthproxy.go index 21e5dfc..df9101a 100644 --- a/oauthproxy.go +++ b/oauthproxy.go @@ -381,7 +381,9 @@ func (p *OAuthProxy) SignInPage(rw http.ResponseWriter, req *http.Request, code if redirect_url == p.SignInPath { redirect_url = "/" } - + if req.FormValue("rd") != "" { + redirect_url = req.FormValue("rd") + } t := struct { ProviderName string SignInMessage string diff --git a/watcher.go b/watcher.go index bedb9f8..4b83946 100644 --- a/watcher.go +++ b/watcher.go @@ -7,8 +7,7 @@ import ( "os" "path/filepath" "time" - - "gopkg.in/fsnotify.v1" + "gopkg.in/fsnotify/fsnotify.v1" ) func WaitForReplacement(filename string, op fsnotify.Op,
рдЕрдм рдЖрдк рдЫрд╡рд┐ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ GitLab рдореЗрдВ рдзрдХреЗрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдЧрд▓рд╛,
manifests/kube-dashboard-oauth2-proxy.yaml
рдЗрдЪреНрдЫрд┐рдд рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ (рдЗрд╕реЗ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рдмрджрд▓реЗрдВ):
image: docker.io/colemickens/oauth2_proxy:latest
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рджреНрд╡рд╛рд░рд╛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдмрдВрдж рд╣реИ - рдЪрд┐рддреНрд░ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░рд╣рд╕реНрдп рдЬреЛрдбрд╝рдирд╛ рди рднреВрд▓реЗрдВ:
imagePullSecrets: - name: gitlab-registry
... рдФрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рд░рд╣рд╕реНрдп рдЬреЛрдбрд╝реЗрдВ:
--- apiVersion: v1 data: .dockercfg: eyJyZWdpc3RyeS5jb21wYW55LmNvbSI6IHsKICJ1c2VybmFtZSI6ICJvYXV0aDIiLAogInBhc3N3b3JkIjogIlBBU1NXT1JEIiwKICJhdXRoIjogIkFVVEhfVE9LRU4iLAogImVtYWlsIjogIm1haWxAY29tcGFueS5jb20iCn0KfQoK = kind: Secret metadata: annotations: name: gitlab-registry namespace: kube-system type: kubernetes.io/dockercfg
рдПрдХ рдЪреМрдХрд╕ рдкрд╛рдардХ рдпрд╣ рджреЗрдЦреЗрдЧрд╛ рдХрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рд▓рдВрдмреА рд░реЗрдЦрд╛ рд╡рд┐рдиреНрдпрд╛рд╕ рд╕реЗ рдмреЗрд╕ 64 рд╣реИ:
{"registry.company.com": { "username": "oauth2", "password": "PASSWORD", "auth": "AUTH_TOKEN", "email": "mail@company.com" } }
рдпрд╣ GitLab рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рд╣реИ, рдЬрд┐рд╕ рдХреЛрдб рд╕реЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рд╕реЗ рдЫрд╡рд┐ рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдВрдЧреЗред
рд╕рдм рдХреБрдЫ рд╣реЛ рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рдХрд░рдВрдЯ (рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛) рдбреИрд╢рдмреЛрд░реНрдб рдЗрдВрд╕реНрдЯрд╛рд▓реЗрд╢рди рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ
$ ./ctl.sh -d
... рдФрд░ рд╕рдм рдХреБрдЫ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
$ ./ctl.sh -i --gitlab-url https://gitlab.example.com --oauth2-id 6a52769eтАж --oauth2-secret 6b79168fтАж --dashboard-url dashboard.example.com
рдпрд╣ рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рдЬрд╛рдиреЗ рдФрд░ рдмрд▓реНрдХрд┐ рдЖрд░реНрдХрдЯрд┐рдХ рд▓реЙрдЧрд┐рди рдмрдЯрди рдЦреЛрдЬрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

рдЗрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, GitLab рд╣рдорд╕реЗ рдорд┐рд▓реЗрдВрдЧреЗ, рдЕрдкрдиреЗ рдкрд░рд┐рдЪрд┐рдд рдкреГрд╖реНрда рдкрд░ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░реЗрдВрдЧреЗ (рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрдЧрд░ рд╣рдо рд╡рд╣рд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рдЕрдзрд┐рдХреГрдд рдирд╣реАрдВ рдереЗ):

рдЕрдкрдиреЗ GitLab рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдЗрди рдХрд░реЗрдВ - рдФрд░ рд╕рдм рдХреБрдЫ рд╣реБрдЖ:

рдбреИрд╢рдмреЛрд░реНрдб рдлреАрдЪрд░реНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рдпрджрд┐ рдЖрдк рдПрдХ рдбреЗрд╡рд▓рдкрд░ рд╣реИрдВ рдЬреЛ рдкрд╣рд▓реЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреЗ рдереЗ, рдпрд╛ рд╕рд┐рд░реНрдл рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдкрд╣рд▓реЗ рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рдирд╣реАрдВ рдЖрдпрд╛ рдерд╛, рддреЛ рдореИрдВ рдЗрд╕рдХреА рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реВрдВрдЧрд╛ред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ "рд╕рдм рдХреБрдЫ рд╣рд░рд╛ рд╣реИ":

рдкреЙрдбреНрд╕ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░, рдЕрдкрд╕реНрдлреАрддрд┐ рдЫрд╡рд┐, рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рддрд░реНрдХ, рдЙрдирдХреА рд╕реНрдерд┐рддрд┐:

рдкрд░рд┐рдирд┐рдпреЛрдЬрди рд╕реНрдерд┐рддрд┐рдпрд╛рдБ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИрдВ:

... рдФрд░ рдЕрдиреНрдп рд╡рд┐рд╡рд░рдг:

... рд╕рд╛рде рд╣реА рддреИрдирд╛рддреА рдХреЛ рдкреИрдорд╛рдирд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛:

рдЗрд╕ рдСрдкрд░реЗрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо:

рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╡рд░реНрдгрд┐рдд рдЕрдиреНрдп рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд▓реЙрдЧ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ:

... рдФрд░ рдЪрдпрдирд┐рдд рдлрд▓реА рдХреЗ рдХрдВрдЯреЗрдирд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп:

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдиреЛрдбреНрд╕ рдкрд░ рд╕реАрдорд╛ / рдЕрдиреБрд░реЛрдз рднреА рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:

рдмреЗрд╢рдХ, рдпрд╣ рдкреИрдирд▓ рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдЪрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реБрдЖ рд╣реИред
рдПрдХреАрдХрд░рдг рдФрд░ рдбреИрд╢рдмреЛрд░реНрдб рдХреЗ рдиреБрдХрд╕рд╛рди
рд╡рд░реНрдгрд┐рдд рдПрдХреАрдХрд░рдг рдореЗрдВ рдХреЛрдИ
рдЕрднрд┐рдЧрдо рдирд┐рдпрдВрддреНрд░рдг рдирд╣реАрдВ рд╣реИ ред рдЗрд╕рдХреЗ рд╕рд╛рде, рдЙрди рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ GitLab рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рдбреИрд╢рдмреЛрд░реНрдб рддрдХ рдкрд╣реБрдВрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдбреИрд╢рдмреЛрд░реНрдб рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реА рдбреИрд╢рдмреЛрд░реНрдб рддрдХ рдЙрдирдХреА рдкрд╣реБрдВрдЪ рд╣реИ, рдЬреЛ
рдЖрд░рдмреАрдПрд╕реА рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╣реИрдВред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рд╣рд░ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рд╕реНрд╡рдпрдВ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рдорд┐рдиреАрд╕реЛрдВ рдореЗрдВ рд╕реЗ, рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ:
- init рдХрдВрдЯреЗрдирд░ рдХреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЬрд╛рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ;
- рдпрд╣ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдФрд░ рд╕реНрдЯреЗрдЯрдлреБрд▓рд╕реЗрдЯреНрд╕ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдХреНрд▓рд╕реНрдЯрд░рд╕реНрдЯрд░ рдореЗрдВ рдареАрдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИ;
- рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдФрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рд╛рде рдбреИрд╢рдмреЛрд░реНрдб рд╕рдВрдЧрддрддрд╛ рд╕рд╡рд╛рд▓ рдЙрдард╛рддреА рд╣реИред
рдмрд╛рдж рдХреА рд╕рдорд╕реНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдбреИрд╢рдмреЛрд░реНрдб рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рд╡рд┐рдХрд▓реНрдк
рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг (
v1.10.1 ) рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд╕рд╛рде рдбреИрд╢рдмреЛрд░реНрдб рд╕рдВрдЧрддрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ:

рдЗрд╕рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд╡рд╣рд╛рдБ (рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрдирд╡рд░реА рдореЗрдВ рдЕрдкрдирд╛рдпрд╛ рдЧрдпрд╛)
PR # 3476 рд╣реИ , рдЬреЛ K8s 1.13 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдмреАрдЪ рдЖрдк K8s 1.14 рдореЗрдВ рдкреИрдирд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ рд░реБрдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП (рдХрдо рд╕реЗ рдХрдо!) рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕реНрдерд┐рддрд┐ рдЙрддрдиреА рдмреБрд░реА рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдиреА рдкрд╣рд▓реА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдВрдЧрддрддрд╛ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗ рд╕рдХрддреА рд╣реИред
рдЕрдВрдд рдореЗрдВ, рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рд╣реИрдВ:
- K8Dash рдПрдХ рдпреБрд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ (рдЗрд╕ рд╡рд░реНрд╖ рдХрд╛ рдкрд╣рд▓рд╛ рджрд┐рдирд╛рдВрдХ рдорд╛рд░реНрдЪ рд╣реИ), рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдЪреНрдЫреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдФрд░ рдЗрд╕рдХреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХрд╛ рдПрдХ рджреГрд╢реНрдп рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ред рдпрд╣ рдПрдХ "рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдЗрдВрдЯрд░рдлрд╝реЗрд╕" рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдирд╛рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреЗрдЬ рд░рд┐рдлреНрд░реЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред
- OpenShift рдХрдВрд╕реЛрд▓ Red Hat OpenShift рдХрд╛ рдПрдХ рд╡реЗрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдЬреЛ, рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдкрдХреЗ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЙрдкрд▓рдмреНрдзрд┐рдпрд╛рдБ рд▓рд╛рдПрдЧрд╛, рдЬреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред
- рдХреБрдмреЗрд░рдиреЗрдЯрд░ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИ рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рд╕рднреА рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдирд┐рдЪрд▓реЗ-рд╕реНрддрд░ (рдбреИрд╢рдмреЛрд░реНрдб) рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдм рдХреБрдЫ рдРрд╕рд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рд╡рд┐рдХрд╛рд╕ рд░реБрдХ рдЧрдпрд╛ рд╣реИред
- рдкреЛрд▓рд╛рд░рд┐рд╕ рд╕рд┐рд░реНрдл рджреВрд╕рд░реЗ рджрд┐рди рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рдкреИрдирд▓ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИ (рдХреНрд▓рд╕реНрдЯрд░ рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ) рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд "рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рд╕рддреНрдпрд╛рдкрди" (рдЗрд╕рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХреЗ рд╕рд╣реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╕реНрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ)ред
рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рдбреИрд╢рдмреЛрд░реНрдб рдХреБрдмреЗрд░рдиреЗрдЯ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрдкрдХрд░рдг рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реЗрд╡рд╛ рджреЗрддреЗ рд╣реИрдВред GitLab рдХреЗ рд╕рд╛рде рдЗрд╕рдХрд╛ рдПрдХреАрдХрд░рдг рд╣рдорд╛рд░реЗ "рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди" рдХрд╛ рднреА рд╣рд┐рд╕реНрд╕рд╛ рдмрди рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдкреИрдирд▓ рдХреЗ рд╕рд╛рде рдорд┐рд▓реЗ рдЕрд╡рд╕рд░реЛрдВ рд╕реЗ рдЦреБрд╢ рд╣реИрдВред
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рд╕рдордп-рд╕рдордп рдкрд░ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕рдореБрджрд╛рдп рд╕реЗ рд╡рд┐рдХрд▓реНрдк рд╣реЛрддреЗ рд╣реИрдВ (рдФрд░ рд╣рдо рдЙрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдХреЗ рдЦреБрд╢ рд╣реИрдВ), рд▓реЗрдХрд┐рди рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдо рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдмрдиреЗ рд╣реБрдП рд╣реИрдВред
рдкреБрдирд╢реНрдЪ
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рднреА рдкрдврд╝реЗрдВ:
рдпреБрдкреАрдбреАред рд╣реЙрдХ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдкреИрдЪ рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдкрд╛рдИ рдЧрдИ (рдЯреИрдм рдХреЛ рд░рд┐рдХреНрдд рд╕реНрдерд╛рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред рд▓реЗрдЦ рдореЗрдВ рдкреИрдЪ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред