Статьи
Обучающие материалы
Интерактивные руководства
Развертывание ImageLabeller с помощью GitHub
![Фото Уоррена Марусяка](https://wac-cdn.atlassian.com/dam/jcr:7509aefb-43e8-401d-90fe-0850cbe6bb13/wmarusiak_headshot%20(1).png?cdnVersion=1880)
Уоррен Марусяк
Старший технический эксперт
Чтобы продемонстрировать, как разрабатывать и развертывать приложения, а также управлять ими с помощью Jira Software и различных подключенных инструментов, наша команда создала ImageLabeller — простое демонстрационное приложение на платформе AWS, которое с помощью машинного обучения наносит метки на изображения.
На этой странице мы расскажем, как развернуть ImageLabeller с помощью GitHub. Прежде чем начать, рекомендуем ознакомиться с архитектурой ImageLabeller и страницами настройки AWS SageMaker в качестве контекста.
Обязательные условия
Если у вас еще нет организации на GitHub, следуйте инструкциям в этом руководстве по GitHub, чтобы создать ее с нуля.
Общедоступные репозитории GitHub с кодом ImageLabeller
Демонстрационное видео интеграции Jira с GitHub
Интеграция Jira и GitHub
В Jira нажмите Board (Доска), а затем — Apps (Приложения), после чего выберите GitHub.
![Выпадающее меню приложения JSW](https://wac-cdn.atlassian.com/dam/jcr:09f738a9-e117-4b8b-85a4-c28abbb5cf0e/jsw_appsdropdownmenu.png?cdnVersion=1880)
Нажмите Get it now (Загрузить).
![Приложение JSW на GitHub](https://wac-cdn.atlassian.com/dam/jcr:2b1035d7-cbdc-4492-bf3e-783ef592b808/jsw_githubapp.png?cdnVersion=1880)
Нажмите Apps (Приложения), а затем — Manage Apps (Управление приложениями) и раскройте раздел GitHub.
![изображение: управление приложениями в JSW](https://wac-cdn.atlassian.com/dam/jcr:f5a11ba2-d206-40b2-9bcc-62b6a5513ee6/jsw_manageapps.png?cdnVersion=1880)
Нажмите Get started (Начать).
![](https://wac-cdn.atlassian.com/dam/jcr:f04093ad-09b7-4ba7-9a12-eed3406620b7/jsw_managegithubapp.png?cdnVersion=1880)
Нажмите Get started (Начать).
![изображение: конфигурация GitHub](https://wac-cdn.atlassian.com/dam/jcr:0586a9cc-b33d-4a7b-877f-ac983bfb38bf/jsw_connectgithuborganization.png?cdnVersion=1880)
Установка плагина Jira в GitHub
Нажмите Install Jira (Установить Jira), чтобы установить плагин Jira в GitHub. Этот шаг необходим, если плагин Jira еще не установлен в GitHub.
![изображение: подключение организации GitHub к Jira](https://wac-cdn.atlassian.com/dam/jcr:0fc1632b-c5dd-4ca2-af2c-164784881095/jsw_connectgithuborganization2.png?cdnVersion=1880)
Jira начнет синхронизировать данные с GitHub.
![](https://wac-cdn.atlassian.com/dam/jcr:99c5f2c3-8583-4886-acde-4dc22422fd2a/jsw_githubconfigurationinprogress.png?cdnVersion=1880)
Когда синхронизация завершится, в столбце Sync Status (Состояние синхронизации) будет указано COMPLETE (ЗАВЕРШЕНО).
![снимок экрана: изменение статуса синхронизации](https://wac-cdn.atlassian.com/dam/jcr:ebe12ed1-7efd-4d8b-ab0f-0a463ad049a7/jsw_githubconfigurationcomplete.png?cdnVersion=1880)
Настройка доступа по SSH
Настройте ключи SSH для своего аккаунта в GitHub по инструкциям здесь. Дополнительные справочные материалы можно найти здесь.
Настройка личного токена доступа
Настройте личный токен доступа по инструкциям в этом руководстве. Этот токен используется для клонирования репозитория SystemTest на этапах интеграционного тестирования. Предоставьте токену доступ к репозиторию и рабочему процессу.
Создание репозитория для инфраструктуры AWS S3
Стандартный цикл разработки обычно подразумевает, что разработчик берет задачу из Jira, переносит ее в раздел незавершенной работы и начинает работать над ней. Идентификатор задачи Jira — это ключ, который связывает разработку с задачей Jira. Это основной компонент интеграции между двумя системами.
Перейдите в Jira и создайте задачу по добавлению репозитория инфраструктуры AWS S3 в GitHub. Обратите внимание на идентификатор задачи (в данном примере — IM-9).
![Инфраструктура AWS S3](https://wac-cdn.atlassian.com/dam/jcr:bd27ee89-6183-4811-8d25-830c55ab2923/jsw_createissues3infra.png?cdnVersion=1880)
Перейдите на GitHub и нажмите New (Создать). Выберите подходящую организацию в поле Owner (Владелец). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
![](https://wac-cdn.atlassian.com/dam/jcr:2bab69a5-b43a-41c4-a9fa-e63efc12aad3/github_createrepos3infra.png?cdnVersion=1880)
Добавление переменных ключей AWS для доступа к репозиторию
Нажмите Settings (Настройки), а затем — Secrets (Секреты). Нажмите New repository secret (Новый секрет репозитория) и добавьте идентификатор ключа доступа AWS и секретный ключ доступа AWS. Предоставьте пользователю IAM, связанному с ключом доступа AWS, уровень доступа AdministratorAccess (Доступ администратора). Контроль доступа можно настроить более тонко, выбрав отдельные политики доступа AWS, но подробности останутся на усмотрение читателя.
![](https://wac-cdn.atlassian.com/dam/jcr:8d8fbcbb-c483-4769-8a9f-f1e324d0b424/github_addrepositorysecrets.png?cdnVersion=1880)
В терминале перейдите в репозиторий s3_infra и выполните следующие команды для отправки на GitHub.
git add --all
git commit -m "IM-9 add s3_infra repository to github"
git remote add origin git@github.com:PmmQuickStartGuides01/s3_infra.git
git branch -m mainline
git push -u origin mainline
Действия GitHub для развертывания в AWS
Перейдите в репозиторий s3_infra в терминале, создайте ветку с именем, соответствующим идентификатору задачи Jira, и создайте папку .github/workflows.
git checkout -b IM-9
mkdir -p .github/workflows && cd .github/workflows
Создайте файл deploy-test-staging.yml со следующим кодом YAML в новой папке .github/workflows. В нем задается рабочий процесс развертывания для тестовых и промежуточных сред, который выполняется при отправке в ветки, отличные от основной.
name: deploy-s3-infra-test-staging
on:
push:
branches:
- '*'
- '!mainline'
jobs:
deploy-us-west-1:
runs-on: ubuntu-latest
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-1"
- name: Deploy to AWS CloudFormation
uses: aws-actions/aws-cloudformation-github-deploy@v1
with:
name: OpenDevOpsS3Infra
template: template.yml
no-fail-on-empty-changeset: "1"
deploy-us-east-2:
runs-on: ubuntu-latest
needs: deploy-us-west-1
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-2"
- name: Deploy to AWS CloudFormation
uses: aws-actions/aws-cloudformation-github-deploy@v1
with:
name: OpenDevOpsS3Infra
template: template.yml
no-fail-on-empty-changeset: "1"
Затем создайте файл deploy-prod.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для рабочих сред, который выполняется, когда запрос pull объединяет изменения с основной веткой.
name: deploy-s3-infra-prod
on:
pull_request:
branches:
- mainline
jobs:
deploy-us-west-2:
runs-on: ubuntu-latest
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-2"
- name: Deploy to AWS CloudFormation
uses: aws-actions/aws-cloudformation-github-deploy@v1
with:
name: OpenDevOpsS3Infra
template: template.yml
no-fail-on-empty-changeset: "1"
deploy-ca-central-1:
runs-on: ubuntu-latest
needs: deploy-us-west-2
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "ca-central-1"
- name: Deploy to AWS CloudFormation
uses: aws-actions/aws-cloudformation-github-deploy@v1
with:
name: OpenDevOpsS3Infra
template: template.yml
no-fail-on-empty-changeset: "1"
deploy-us-east-1:
runs-on: ubuntu-latest
needs: deploy-ca-central-1
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-1"
- name: Deploy to AWS CloudFormation
uses: aws-actions/aws-cloudformation-github-deploy@v1
with:
name: OpenDevOpsS3Infra
template: template.yml
no-fail-on-empty-changeset: "1"
Сведения о действиях GitHub
Триггеры
Объявляйте события, запускающие рабочий процесс, в верхней части этих файлов. В deploy-test-staging.yml событие передается во все ветки, кроме основной.
name: deploy-s3-infra-test-staging
on:
push:
branches:
- '*'
- '!mainline'
Многие события могут запускать рабочие процессы. Дополнительную информацию можно найти в документации здесь.
Вакансии
Рабочий процесс содержит раздел jobs с множеством заданий, запускаемых при наступлении события-триггера. Для каждого задания после ключевого слова steps перечислены шаги, которые запускаются при исполнении задания. В этом примере описаны шаги по переключению на код репозитория, настройке учетных данных AWS и развертыванию в AWS с помощью AWS CloudFormation.
jobs:
deploy-us-west-1:
runs-on: ubuntu-latest
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-1"
- name: Deploy to AWS CloudFormation
uses: aws-actions/aws-cloudformation-github-deploy@v1
with:
name: OpenDevOpsS3Infra
template: template.yml
no-fail-on-empty-changeset: "1"
Обеспечение порядка с помощью needs
Порядок заданий можно указать с помощью ключевого слова needs. По умолчанию GitHub выполняет все шаги параллельно. Слово needs указывает, что один шаг зависит от другого.
deploy-us-east-1:
runs-on: ubuntu-latest
needs: deploy-ca-central-1
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-1"
- name: Deploy to AWS CloudFormation
uses: aws-actions/aws-cloudformation-github-deploy@v1
with:
name: OpenDevOpsS3Infra
template: template.yml
no-fail-on-empty-changeset: "1"
Отправка в функциональную ветку
В командной строке выполните следующие запросы, чтобы отправить код в ветку IM-9 вашего репозитория s3_infra.
git add --all
git commit -m "IM-9 add GitHub actions to s3_infra"
git push -u origin IM-9
Нажмите Actions (Действия), чтобы увидеть запущенные рабочие процессы.
![изображение: запущенные рабочие процессы](https://wac-cdn.atlassian.com/dam/jcr:81fcb19f-2527-40e7-9707-46656cd37930/github_runningworkflows.png?cdnVersion=1880)
Создание запроса pull
Нажмите Pull requests (Запросы pull), а затем — Create pull request (Создать запрос pull).
![изображение: сравнение изменений](https://wac-cdn.atlassian.com/dam/jcr:c9c24e5d-f782-4636-91a9-089cb7e5f9c7/github_comparingchanges.png?cdnVersion=1880)
Выберите свою функциональную ветку в качестве исходной и нажмите Create pull request (Создать запрос pull).
![изображение: создание запроса pull](https://wac-cdn.atlassian.com/dam/jcr:edfacbc4-9a96-48f7-b971-af4c624fdd9d/github_createpullrequest.png?cdnVersion=1880)
Просмотрите изменения кода, затем нажмите Merge pull request (Объединить с запросом pull), чтобы принять их.
![](https://wac-cdn.atlassian.com/dam/jcr:e34b6e05-89c1-44e1-b478-118558daac0a/github_reviewcodechanges.png?cdnVersion=1880)
Нажмите Actions (Действия), чтобы убедиться, что развертывание в рабочую среду началось. GitHub выполняет задания из файла deploy-prod.yml, поскольку используется основная ветка.
![](https://wac-cdn.atlassian.com/dam/jcr:7c86a8ed-6361-414f-b0e5-bae7a4decbdc/github_reviewproductiondeployment.png?cdnVersion=1880)
Создание репозитория для SubmitImage AWS Lambda
Перейдите в Jira и создайте задачу для добавления репозитория SubmitImage AWS Lambda в GitHub. Обратите внимание на идентификатор задачи Jira (в данном примере — IM-8).
![изображение: доска IM](https://wac-cdn.atlassian.com/dam/jcr:23a70316-7b1b-476f-acde-8ab013087ed1/jsw_createissueaddsubmitimage.png?cdnVersion=1880)
Перейдите на GitHub и нажмите New (Создать). Выберите подходящую организацию в поле Owner (Владелец). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
![](https://wac-cdn.atlassian.com/dam/jcr:e4f13530-9f7f-4a39-b9be-49013a01d6fc/github_createreposubmitimage.png?cdnVersion=1880)
Нажмите Settings (Настройки), а затем — Secrets (Секреты). Добавьте личный токен доступа как ACCESS_KEY, идентификатор ключа доступа AWS как AWS_ACCESS_KEY_ID, секретный ключ доступа AWS как AWS_SECRET_ACCESS_KEY и идентификатор аккаунта AWS как AWS_ACCOUNT_ID.
![](https://wac-cdn.atlassian.com/dam/jcr:efe489eb-6bb2-4581-b419-6ec56d7a56cc/github_addrepositorysecrets2.png?cdnVersion=1880)
В терминале перейдите в репозиторий SubmitImage и выполните следующие команды для отправки на GitHub.
git add --all
git commit -m "IM-8 add SubmitImage to github"
git remote add origin git@github.com:PmmQuickStartGuides01/submitImage.git
git branch -m mainline
git push -u origin mainline
Действия GitHub для развертывания в AWS
Перейдите в репозиторий SubmitImage в терминале, создайте ветку с именем, соответствующим идентификатору задачи Jira, и создайте папку .github/workflows.
git checkout -b IM-8
mkdir -p .github/workflows && cd .github/workflows
Создайте файл deploy-test-staging.yml со следующим кодом YAML в новой папке .github/workflows. В нем задается рабочий процесс развертывания для тестовых и промежуточных сред, который выполняется при отправке в ветки, отличные от основной. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
name: deploy-submit-image-test-staging
on:
push:
branches:
- '*'
- '!mainline'
env:
aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}
jobs:
run-unit-tests:
runs-on: ubuntu-latest
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- name: Checkout code
uses: actions/checkout@v2
- name: Test
run: |
cd ${{ github.workspace }}/submitImage
ls
go test ./opendevopslambda...
deploy-us-west-1:
runs-on: ubuntu-latest
needs: run-unit-tests
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-1"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsSubmitImage" \
--s3-bucket "open-devops-code-us-west-1-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-west-1:
# runs-on: ubuntu-latest
# needs: deploy-us-west-1
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-west-1"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-west-1
deploy-us-east-2:
runs-on: ubuntu-latest
needs: deploy-us-west-1
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-2"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsSubmitImage" \
--s3-bucket "open-devops-code-us-east-2-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-east-2:
# runs-on: ubuntu-latest
# needs: deploy-us-east-2
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-east-2"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-east-2
Затем создайте файл deploy-prod.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для рабочих сред, который выполняется, когда запрос pull объединяет изменения с основной веткой.
name: deploy-submit-image-prod
on:
pull_request:
branches:
- mainline
env:
aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}
jobs:
deploy-us-west-2:
runs-on: ubuntu-latest
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-2"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsSubmitImage" \
--s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-west-2:
# runs-on: ubuntu-latest
# needs: deploy-us-west-2
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-west-2"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-west-2
deploy-us-east-1:
runs-on: ubuntu-latest
needs: deploy-us-west-2
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-1"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsSubmitImage" \
--s3-bucket "open-devops-code-us-east-1-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-east-1:
# runs-on: ubuntu-latest
# needs: deploy-us-east-1
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-east-1"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-east-1
deploy-ca-central-1:
runs-on: ubuntu-latest
needs: deploy-us-east-1
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "ca-central-1"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsSubmitImage" \
--s3-bucket "open-devops-code-ca-central-1-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-ca-central-1:
# runs-on: ubuntu-latest
# needs: deploy-ca-central-1
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "ca-central-1"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=ca-central-1
Выполнение интеграционных тестов пока вынесено в комментарии. Системные тесты будут успешно выполняться только после развертывания всего приложения. Раскомментируйте этапы интеграционного тестирования в своем репозитории и запустите конвейер развертывания, когда все компоненты ImageLabeller будут развернуты. Обновите раздел needs, чтобы выполнить шаги по порядку. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
needs: deploy-us-east-1
Сведения о действиях GitHub
В этом задании SubmitImage AWS Lambda развертывается на us-west-2 с помощью AWS SAM.
deploy-us-west-2:
runs-on: ubuntu-latest
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-2"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsSubmitImage" \
--s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
В этом задании клонируется репозиторий SystemTests и выполняются интеграционные тесты в us-west-2.
integration-test-us-west-2:
runs-on: ubuntu-latest
needs: deploy-us-west-2
steps:
- name: Pull systemTests repo
uses: actions/checkout@master
with:
repository: PmmQuickStartGuides01/systemTests
token: ${{ secrets.ACCESS_KEY }}
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-2"
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- name: Run integration tests
run: go test -v ./... -aws_region=us-west-2
На этом шаге с помощью личного токена доступа клонируется репозиторий SystemTests.
- name: Pull systemTests repo
uses: actions/checkout@master
with:
repository: PmmQuickStartGuides01/systemTests
token: ${{ secrets.ACCESS_KEY }}
Отправка в функциональную ветку
Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-8 репозитория SubmitImage. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitHub отслеживать, что происходит в проекте.
git add --all
git commit -m "IM-8 add github actions to SubmitImage"
git push -u origin IM-8
Нажмите Actions (Действия), чтобы увидеть запущенные рабочие процессы.
![](https://wac-cdn.atlassian.com/dam/jcr:16641ec6-4901-4330-9fbf-7d46a1041c88/github_monitorproductiondeployment.png?cdnVersion=1880)
Обратите внимание, что задание модульного тестирования пройдено и началось развертывание в тестовой среде us-west-1.
![](https://wac-cdn.atlassian.com/dam/jcr:c8df31c7-cd4c-4ef4-b8d4-07eba035a449/github_runningworkflowsstarted.png?cdnVersion=1880)
Определенные выше системные тесты выполняются в заданиях integration-test-us-west-1 и integration-test-us-east-2.
![](https://wac-cdn.atlassian.com/dam/jcr:382f77a1-d7be-4e98-9246-7327594a782a/github_runningworkflowsinprogress.png?cdnVersion=1880)
Создание запроса pull
Чтобы создать запрос pull, нажмите Pull requests (Запросы pull), а затем — New pull request (Новый запрос pull).
![](https://wac-cdn.atlassian.com/dam/jcr:4abb1077-c108-4ade-af2a-2de97d268606/github_newpullrequest.png?cdnVersion=1880)
Выберите слияние из функциональной ветки.
![](https://wac-cdn.atlassian.com/dam/jcr:8a05f1fa-b0a0-4c5d-b35f-d9629eaa7c66/github_mergetofeaturebranch.png?cdnVersion=1880)
Нажмите Create pull request (Создать запрос pull).
![](https://wac-cdn.atlassian.com/dam/jcr:79beffad-bf37-4f64-b7ce-cf8d357dd8d4/github_createpullrequest1.png?cdnVersion=1880)
Выполните слияние с запросом pull и удалите функциональную ветку. Нажмите Actions (Действия), чтобы проследить за развертыванием в рабочую среду.
![](https://wac-cdn.atlassian.com/dam/jcr:7bd2ba09-d510-4b1f-92ff-6ab23df03d36/github_runningworkflowssubmitimage.png?cdnVersion=1880)
Создание репозитория для InvokeLabeller AWS Lambda
Перейдите в Jira и создайте задачу для добавления репозитория InvokeLabeller AWS Lambda в GitHub. Обратите внимание на идентификатор задачи Jira (в данном примере — IM-11).
![](https://wac-cdn.atlassian.com/dam/jcr:b881293d-d504-46d6-a98c-039338cd1b53/jsw_createissueaddinvokelabeller.png?cdnVersion=1880)
Перейдите на GitHub и нажмите New (Создать). Выберите подходящую организацию в поле Owner (Владелец). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
![](https://wac-cdn.atlassian.com/dam/jcr:746d750d-eb73-40d7-b890-c203508669c1/github_createrepoinvokelabeller.png?cdnVersion=1880)
Нажмите Settings (Настройки), а затем — Secrets (Секреты). Добавьте личный токен доступа как ACCESS_KEY, идентификатор ключа доступа AWS как AWS_ACCESS_KEY_ID, секретный ключ доступа AWS как AWS_SECRET_ACCESS_KEY и идентификатор аккаунта AWS как AWS_ACCOUNT_ID.
![](https://wac-cdn.atlassian.com/dam/jcr:efe489eb-6bb2-4581-b419-6ec56d7a56cc/github_addrepositorysecrets2.png?cdnVersion=1880)
В терминале перейдите в репозиторий InvokeLabeller и выполните следующие команды для отправки на GitHub.
git add --all
git commit -m "IM-11 add InvokeLabeller to github"
git remote add origin git@github.com:PmmQuickStartGuides01/InvokeLabeller.git
git branch -m mainline
git push -u origin mainline
Действия GitHub для развертывания в AWS
Перейдите в репозиторий InvokeLabeller в терминале, создайте ветку с именем, соответствующим идентификатору задачи Jira, и создайте папку .github/workflows.
git checkout -b IM-11
mkdir -p .github/workflows && cd .github/workflows
Создайте файл deploy-test-staging.yml со следующим кодом YAML в новой папке .github/workflows. В нем задается рабочий процесс развертывания для тестовых и промежуточных сред, который выполняется при отправке в ветки, отличные от основной. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
name: deploy-invoke-labeller-test-staging
on:
push:
branches:
- '*'
- '!mainline'
env:
aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}
jobs:
run-unit-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Test
run: |
pip3 install pytest
pip3 install moto
pip3 install -r tst/requirements.txt --user
python3 -m pytest -v tst/unit --junitxml=test-reports/report.xml
deploy-us-west-1:
runs-on: ubuntu-latest
needs: run-unit-tests
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-1"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsImageLabeller" \
--s3-bucket "open-devops-code-us-west-1-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-west-1:
# runs-on: ubuntu-latest
# needs: deploy-us-west-1
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-west-1"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-west-1
deploy-us-east-2:
runs-on: ubuntu-latest
needs: deploy-us-west-1
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-2"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsImageLabeller" \
--s3-bucket "open-devops-code-us-east-2-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-east-2:
# runs-on: ubuntu-latest
# needs: deploy-us-east-2
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-east-2"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-east-2
Затем создайте файл deploy-prod.yml со следующим кодом YAML. В нем задается рабочий процесс развертывания для рабочих сред, который выполняется, когда запрос pull объединяет изменения с основной веткой.
name: deploy-invoke-labeller-prod
on:
pull_request:
branches:
- mainline
env:
aws_account_id: ${{secrets.AWS_ACCOUNT_ID}}
jobs:
deploy-us-west-2:
runs-on: ubuntu-latest
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-west-2"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsImageLabeller" \
--s3-bucket "open-devops-code-us-west-2-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-west-2:
# runs-on: ubuntu-latest
# needs: deploy-us-west-2
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-west-2"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-west-2
deploy-us-east-1:
runs-on: ubuntu-latest
needs: deploy-us-west-2
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "us-east-1"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsImageLabeller" \
--s3-bucket "open-devops-code-us-east-1-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-us-east-1:
# runs-on: ubuntu-latest
# needs: deploy-us-east-1
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "us-east-1"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=us-east-1
deploy-ca-central-1:
runs-on: ubuntu-latest
needs: deploy-us-east-1
outputs:
env-name: ${{ steps.env-name.outputs.environment }}
steps:
- name: Install Go
uses: actions/setup-go@v2
with:
go-version: 1.16.x
- uses: actions/checkout@v2
- name: Configure AWS credentials
id: creds
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: "ca-central-1"
- name: SAM Validate
run: |
sam --version
sam validate
- name: SAM Build
run: |
sam build
- name: SAM Deploy
continue-on-error: true
run: |
sam deploy --template-file .aws-sam/build/template.yaml \
--stack-name "OpenDevOpsImageLabeller" \
--s3-bucket "open-devops-code-ca-central-1-${aws_account_id}" \
--capabilities CAPABILITY_IAM CAPABILITY_NAMED_IAM
# integration-test-ca-central-1:
# runs-on: ubuntu-latest
# needs: deploy-ca-central-1
# steps:
# - name: Pull systemTests repo
# uses: actions/checkout@master
# with:
# repository: PmmQuickStartGuides01/systemTests
# token: ${{ secrets.ACCESS_KEY }}
# - name: Configure AWS credentials
# id: creds
# uses: aws-actions/configure-aws-credentials@v1
# with:
# aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
# aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
# aws-region: "ca-central-1"
# - name: Install Go
# uses: actions/setup-go@v2
# with:
# go-version: 1.16.x
# - name: Run integration tests
# run: go test -v ./... -aws_region=ca-central-1
Выполнение интеграционных тестов пока вынесено в комментарии. Системные тесты будут успешно выполняться только после развертывания всего приложения. Раскомментируйте этапы интеграционного тестирования в своем репозитории и запустите конвейер развертывания, когда все компоненты ImageLabeller будут развернуты. Обновите раздел needs, чтобы выполнить шаги по порядку. Строку git clone для SystemTests необходимо изменить, чтобы в ней был указан ваш репозиторий для системных тестов.
needs: deploy-us-east-1
Изменение конечной точки AWS SageMaker в файле src/app.py
Откройте файл src/app.py для InvokeLabeller и найдите определение query_endpoint. Измените значения endpoint_name и region_name, чтобы они соответствовали указанным в блокноте AWS SageMaker.
def query_endpoint(img):
endpoint_name = 'jumpstart-dft-image-labeller-endpoint'
client = boto3.client(service_name='runtime.sagemaker', region_name='us-west-1')
response = client.invoke_endpoint(EndpointName=endpoint_name, ContentType='application/x-image', Body=img)
model_predictions = json.loads(response['Body'].read())['predictions'][0]
return model_predictions
Отправка в функциональную ветку
Выполните следующие запросы в командной строке, чтобы отправить изменения в ветку IM-11 репозитория InvokeLabeller. Включите идентификатор задачи Jira в сообщения о коммитах и имена веток, чтобы позволить интеграции Jira с GitHub отслеживать, что происходит в проекте.
git add --all
git commit -m "IM-11 add github actions to InvokeLabeller"
git push -u origin IM-11
Нажмите Actions (Действия), чтобы увидеть запущенные рабочие процессы. Определенные выше системные тесты выполняются в заданиях integration-test-us-west-1 и integration-test-us-east-2.
![](https://wac-cdn.atlassian.com/dam/jcr:b805e2fe-c5bc-4980-b092-9e02a1ff3544/github_runningworkflowsinvokelabeller.png?cdnVersion=1880)
Создание запроса pull
Чтобы создать запрос pull, нажмите Pull requests (Запросы pull), а затем — New pull request (Новый запрос pull). Выберите слияние из функциональной ветки.
![](https://wac-cdn.atlassian.com/dam/jcr:7b29ea86-c4bd-44b7-9de0-208bfe110f87/github_createpullrequestinvokelabeller.png?cdnVersion=1880)
Нажмите Actions (Действия), чтобы проследить за развертыванием в рабочую среду.
![](https://wac-cdn.atlassian.com/dam/jcr:7b29ea86-c4bd-44b7-9de0-208bfe110f87/github_createpullrequestinvokelabeller.png?cdnVersion=1880)
Создание репозитория для SystemTests
Перейдите в Jira и создайте задачу для добавления репозитория SystemTests в GitHub. Обратите внимание на идентификатор задачи Jira (в данном примере — IM-7).
![](https://wac-cdn.atlassian.com/dam/jcr:9e3fc46c-d1ad-425c-bac5-d89274c9bc1f/jsw_createissueaddsystemstests.png?cdnVersion=1880)
Перейдите на GitHub и нажмите New (Создать). Выберите подходящую организацию в поле Owner (Владелец). Нажмите Create repository (Создать репозиторий), чтобы продолжить.
![](https://wac-cdn.atlassian.com/dam/jcr:f7643ead-a56b-47a6-b8af-a3aa0d75f965/github_createreposystemtests.png?cdnVersion=1880)
В терминале перейдите в репозиторий SystemTests и запустите следующие команды, чтобы отправить код на GitHub.
git add --all
git commit -m "IM-7 add SystemTests repository to GitHub"
git remote add origin git@github.com:PmmQuickStartGuides01/systemTests.git
git branch -M mainline
git push -u origin mainline
Репозиторий SystemTests не требует действий GitHub. У него нет своего конвейера, поскольку он содержит тесты для запуска в других конвейерах. В файлах рабочего процесса CI/CD можно раскомментировать шаги интеграционного тестирования, затем сделать их коммит и отправить после развертывания всех компонентов приложения ImageLabeller. Тесты будут успешно выполняться только в том случае, если все компоненты приложения работают правильно.
Обратите внимание на удаленный URL-адрес вашего SystemTests. Конвейеры CI/CD SubmitImage, GetImageLabel и InvokeLabeller будут клонировать репозиторий SystemTests на этапах тестирования. Файл gitlab-ci.yml в последующих репозиториях нужно будет обновить, указав правильный URL-адрес.
Если вы дошли до этого шага, вас можно поздравить! Вы только что развернули ImageLabeller. Следующий шаг — настройка мониторинга ImageLabeller с помощью Opsgenie.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.
![Рисунок: DevOps](https://wac-cdn.atlassian.com/dam/jcr:bd9d8b2c-ca36-444f-8595-719cb1990e64/Devops-community.png?cdnVersion=1880)
Сообщество DevOps
![Рисунок: DevOps](https://wac-cdn.atlassian.com/dam/jcr:297108ea-d232-4368-af51-b53af230c4fe/Simulation-workshop.png?cdnVersion=1880)
Образовательные программы DevOps
![Рисунок: карта](https://wac-cdn.atlassian.com/dam/jcr:25f6330a-4191-408f-a4e5-2e24bfba67b4/Maturity-model.png?cdnVersion=1880)