Вы уже изучили блок «Системы управления версиями», и начиная с этого занятия все ваши работы будут приниматься ссылками на .md-файлы, размещённые в вашем публичном репозитории.
Скопируйте в свой .md-файл содержимое этого файла; исходники можно посмотреть здесь. Заполните недостающие части документа решением задач (заменяйте ???
, ОСТАЛЬНОЕ В ШАБЛОНЕ НЕ ТРОГАЙТЕ чтобы не сломать форматирование текста, подсветку синтаксиса и прочее, иначе можно отправиться на доработку) и отправляйте на проверку. Вместо логов можно вставить скриншоты по желани.
Есть скрипт:
#!/usr/bin/env python3
a = 1
b = '2'
c = a + b
Вопрос | Ответ |
---|---|
Какое значение будет присвоено переменной c ? |
Будет кинуто исключение TypeError: unsupported operand type(s) for +: 'int' and 'str'>, чтобы его исправить, нужно явно преобразовать один тип к другому |
Как получить для переменной c значение 12? |
str(a) + b |
Как получить для переменной c значение 3? |
a + int(b) |
Мы устроились на работу в компанию, где раньше уже был DevOps Engineer. Он написал скрипт, позволяющий узнать, какие файлы модифицированы в репозитории, относительно локальных изменений. Этим скриптом недовольно начальство, потому что в его выводе есть не все изменённые файлы, а также непонятен полный путь к директории, где они находятся. Как можно доработать скрипт ниже, чтобы он исполнял требования вашего руководителя?
#!/usr/bin/env python3
import os
bash_command = ["cd ~/netology/sysadm-homeworks", "git status"]
result_os = os.popen(' && '.join(bash_command)).read()
is_change = False
for result in result_os.split('\n'):
if result.find('modified') != -1:
prepare_result = result.replace('\tmodified: ', '')
print(prepare_result)
break
#!/usr/bin/env python3
import os
bash_command = ["cd ~/netology.ru", "git status"]
result_os = os.popen(' && '.join(bash_command)).read()
bash_command = ["cd ~/netology.ru", "pwd"]
path = os.popen(' && '.join(bash_command)).read().replace('\n', '')
for result in result_os.split('\n'):
if result.find('modified:') != -1:
prepare_result = result.replace('\tmodified: ', '')
print(f"{path}/{prepare_result}")
/home/vagrant/netology.ru/01-intro-01/README.md
/home/vagrant/netology.ru/README.md
- Доработать скрипт выше так, чтобы он мог проверять не только локальный репозиторий в текущей директории, а также умел воспринимать путь к репозиторию, который мы передаём как входной параметр. Мы точно знаем, что начальство коварное и будет проверять работу этого скрипта в директориях, которые не являются локальными репозиториями.
#!/usr/bin/env python3
import os
import sys
def getListModified(path):
if not os.path.isdir(path + '/.git'):
print('.git directory does not exist')
exit()
bash_command = ["cd " + path, "git status"]
result_os = os.popen(' && '.join(bash_command)).read()
for result in result_os.split('\n'):
if result.find('modified:') != -1:
prepare_result = result.replace('\tmodified: ', '')
print(f"{path}/{prepare_result}")
return None
if len(sys.argv) >= 2:
path = sys.argv[1]
else:
bash_command = ["cd ~/netology.ru", "pwd"]
path = os.popen(' && '.join(bash_command)).read().replace('\n', '')
getListModified(path)
./3.py
/home/vagrant/netology.ru/01-intro-01/README.md
/home/vagrant/netology.ru/README.md
./3.py /home/vagrant/netology.r
.git directory does not exist
./3.py /home/vagrant/netology.ru
/home/vagrant/netology.ru/01-intro-01/README.md
/home/vagrant/netology.ru/README.md
- Наша команда разрабатывает несколько веб-сервисов, доступных по http. Мы точно знаем, что на их стенде нет никакой балансировки, кластеризации, за DNS прячется конкретный IP сервера, где установлен сервис. Проблема в том, что отдел, занимающийся нашей инфраструктурой очень часто меняет нам сервера, поэтому IP меняются примерно раз в неделю, при этом сервисы сохраняют за собой DNS имена. Это бы совсем никого не беспокоило, если бы несколько раз сервера не уезжали в такой сегмент сети нашей компании, который недоступен для разработчиков. Мы хотим написать скрипт, который опрашивает веб-сервисы, получает их IP, выводит информацию в стандартный вывод в виде: <URL сервиса> - <его IP>. Также, должна быть реализована возможность проверки текущего IP сервиса c его IP из предыдущей проверки. Если проверка будет провалена - оповестить об этом в стандартный вывод сообщением: [ERROR] <URL сервиса> IP mismatch: <старый IP> <Новый IP>. Будем считать, что наша разработка реализовала сервисы:
drive.google.com
,mail.google.com
,google.com
.
#!/usr/bin/env python3
import socket
import time
domains = {'drive.google.com': [], 'mail.google.com': [], 'google.com': []}
while True:
for domain, ips in domains.items():
ip = socket.gethostbyname(domain)
if len(ips) == 0:
print(f"{domain} - {ip}")
ips.append(ip)
continue
if ips[-1] != ip:
print(f"[ERROR] {domain} IP mismatch: {ips[-1]} {ip}")
ips.append(ip)
continue
print(f"{domain} - {ip}")
time.sleep(5)
drive.google.com - 142.251.1.194
mail.google.com - 74.125.131.83
google.com - 74.125.205.101
drive.google.com - 142.251.1.194
[ERROR] mail.google.com IP mismatch: 74.125.131.83 74.125.131.18
[ERROR] google.com IP mismatch: 74.125.205.101 74.125.205.100
drive.google.com - 142.251.1.194
mail.google.com - 74.125.131.18
google.com - 74.125.205.100
drive.google.com - 142.251.1.194
mail.google.com - 74.125.131.18
google.com - 74.125.205.100
drive.google.com - 142.251.1.194
mail.google.com - 74.125.131.18
google.com - 74.125.205.100
Так получилось, что мы очень часто вносим правки в конфигурацию своей системы прямо на сервере. Но так как вся наша команда разработки держит файлы конфигурации в github и пользуется gitflow, то нам приходится каждый раз переносить архив с нашими изменениями с сервера на наш локальный компьютер, формировать новую ветку, коммитить в неё изменения, создавать pull request (PR) и только после выполнения Merge мы наконец можем официально подтвердить, что новая конфигурация применена. Мы хотим максимально автоматизировать всю цепочку действий. Для этого нам нужно написать скрипт, который будет в директории с локальным репозиторием обращаться по API к github, создавать PR для вливания текущей выбранной ветки в master с сообщением, которое мы вписываем в первый параметр при обращении к py-файлу (сообщение не может быть пустым). При желании, можно добавить к указанному функционалу создание новой ветки, commit и push в неё изменений конфигурации. С директорией локального репозитория можно делать всё, что угодно. Также, принимаем во внимание, что Merge Conflict у нас отсутствуют и их точно не будет при push, как в свою ветку, так и при слиянии в master. Важно получить конечный результат с созданным PR, в котором применяются наши изменения.
???
???