Как мы автоматизировали рекрутинг: HR начал быстрее находить крутых специалистов
Крутые специалисты — главный ресурс компании. Но какой ценой они достаются (особенно если в штате не
Новый проект — это всегда интересно, новые задачи, новый опыт, новые знания. Начиная новый проект, хочется сразу броситься «в бой». Но перед этим приходится тратить время на первоначальную настройку окружения, подключения и установку зависимостей, создания структуры, инициализацию проекта. Порой это может занимать целый день.
Рутинная и во многом однообразная задача написания fab
скриптов для запуска виртуального окружения — охлаждает пыл и отвлекает. Для того чтобы пропускать этот шаг и сразу приступать к разработке, был написан простенький fab
скрипт для фальстарта нового проекта. Так что теперь достаточно написать falstart <название проекта>
, выпить чашечку чая и приступать к работе над новым проектом.
Мы в WB—Tech в основном используем следующий стек: Python 3.x + Django + PostgreSQL + Celery + Redis.
А саму разработку ведем в виртуальном окружении Vagrant + VirtualBox под управлением OS Debian.
Falstart позволяет быстро развернуть виртуальное окружение и приступить к работе, ответив на десяток простых вопросов.
$ falstart awesome
> Django version ['1.9.5'] 1.10.2
> Debian version (for vagrant box) ['jessie64']
> Python version ['3.5.1'] 3.5.2
> Vagrant box IP-addr ['10.1.1.123'] 10.1.1.111
> Do you nead a POSTGRES? [Y/n]
> Do you nead a CELERY? [y/N] y
> Do you nead a REDIS? [y/N] y
> Do you nead a SENTRY? [y/N]
> Database name ['awesome_db']
> Database user ['awesome_user']
> Database pass ['vFeH1uJVN']
После чего выполняются скрипты, и через 10-15 минут будет готова структура проекта.
Для работы фальстарта необходим Vagrant и VirtualBox.
Фальстарт доступен для установки через pip
.
$ pip install falstart
Пример результата: falstart-example.
Пример итоговой структуры проекта
$ tree
.
├── awesome
│ ├── celery.py
│ ├── __init__.py
│ ├── __pycache__
│ │ ├── celery.cpython-35.pyc
│ │ ├── __init__.cpython-35.pyc
│ │ ├── settings.cpython-35.pyc
│ │ ├── settings_local.cpython-35.pyc
│ │ ├── urls.cpython-35.pyc
│ │ └── wsgi.cpython-35.pyc
│ ├── settings_local.py
│ ├── settings_local.py.example
│ ├── settings.py
│ ├── static
│ │ └── admin
│ │ ├── css
│ │ │ ├── base.css
│ │ │ ├── changelists.css
│ │ │ ├── dashboard.css
│ │ │ ├── fonts.css
│ │ │ ├── forms.css
│ │ │ ├── login.css
│ │ │ ├── rtl.css
│ │ │ └── widgets.css
│ │ ├── fonts
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.txt
│ │ │ ├── Roboto-Bold-webfont.woff
│ │ │ ├── Roboto-Light-webfont.woff
│ │ │ └── Roboto-Regular-webfont.woff
│ │ ├── img
│ │ │ ├── calendar-icons.svg
│ │ │ ├── gis
│ │ │ │ ├── move_vertex_off.svg
│ │ │ │ └── move_vertex_on.svg
│ │ │ ├── icon-addlink.svg
│ │ │ ├── icon-alert.svg
│ │ │ ├── icon-calendar.svg
│ │ │ ├── icon-changelink.svg
│ │ │ ├── icon-clock.svg
│ │ │ ├── icon-deletelink.svg
│ │ │ ├── icon-no.svg
│ │ │ ├── icon-unknown-alt.svg
│ │ │ ├── icon-unknown.svg
│ │ │ ├── icon-yes.svg
│ │ │ ├── inline-delete.svg
│ │ │ ├── LICENSE
│ │ │ ├── README.txt
│ │ │ ├── search.svg
│ │ │ ├── selector-icons.svg
│ │ │ ├── sorting-icons.svg
│ │ │ ├── tooltag-add.svg
│ │ │ └── tooltag-arrowright.svg
│ │ └── js
│ │ ├── actions.js
│ │ ├── actions.min.js
│ │ ├── admin
│ │ │ ├── DateTimeShortcuts.js
│ │ │ └── RelatedObjectLookups.js
│ │ ├── calendar.js
│ │ ├── cancel.js
│ │ ├── change_form.js
│ │ ├── collapse.js
│ │ ├── collapse.min.js
│ │ ├── core.js
│ │ ├── inlines.js
│ │ ├── inlines.min.js
│ │ ├── jquery.init.js
│ │ ├── popup_response.js
│ │ ├── prepopulate_init.js
│ │ ├── prepopulate.js
│ │ ├── prepopulate.min.js
│ │ ├── SelectBox.js
│ │ ├── SelectFilter2.js
│ │ ├── timeparse.js
│ │ ├── urlify.js
│ │ └── vendor
│ │ ├── jquery
│ │ │ ├── jquery.js
│ │ │ ├── jquery.min.js
│ │ │ └── LICENSE-JQUERY.txt
│ │ └── xregexp
│ │ ├── LICENSE-XREGEXP.txt
│ │ ├── xregexp.js
│ │ └── xregexp.min.js
│ ├── urls.py
│ └── wsgi.py
├── Makefile
├── manage.py
├── provision
│ ├── fabric_provisioner.py
│ ├── fabric_provisioner.pyc
│ └── templates
│ ├── environment.j2
│ ├── locale.gen.j2
│ └── nginx-host.j2
├── requirements-remote.txt
├── requirements.txt
├── Vagrantfile
├── var
│ ├── celery_awesome_worker.log
│ ├── celery_awesome_worker.pid
│ ├── celerybeat-schedule
│ └── gunicorn.pid
└── wheels
├── amqp-1.4.9-py2.py3-none-any.whl
├── anyjson-0.3.3-py3-none-any.whl
├── billiard-3.3.0.23-py3-none-any.whl
├── celery-3.1.23-py2.py3-none-any.whl
├── coverage-4.2-cp35-cp35m-linux_x86_64.whl
├── coverage_badge-0.1.2-py3-none-any.whl
├── Django-1.10.2-py2.py3-none-any.whl
├── django_rainbowtests-0.5.1-py3-none-any.whl
├── gunicorn-19.4.5-py2.py3-none-any.whl
├── kombu-3.0.37-py2.py3-none-any.whl
├── mccabe-0.4.0-py2.py3-none-any.whl
├── pep257-0.7.0-py2.py3-none-any.whl
├── pep8-1.7.0-py2.py3-none-any.whl
├── psycopg2-2.6.1-cp35-cp35m-linux_x86_64.whl
├── pyflakes-1.0.0-py2.py3-none-any.whl
├── pylama-7.0.7-py2.py3-none-any.whl
├── pytz-2016.7-py2.py3-none-any.whl
└── redis-2.10.5-py2.py3-none-any.whl
Теперь можно перейти по адресу, указанному в приветственном сообщении Vagrant
а, и увидеть начальную страницу Django.
==> awesome_vagrant: Machine 'awesome_vagrant' has a post `vagrant up` message. This is a message
==> awesome_vagrant: from the creator of the Vagrantfile, and not from Vagrant itself:
==> awesome_vagrant:
==> awesome_vagrant: awesome dev server successfuly started.
==> awesome_vagrant: Connect to host with:
==> awesome_vagrant: http://10.1.1.111/
==> awesome_vagrant: or over ssh with `vagrant ssh`
==> awesome_vagrant:
==> awesome_vagrant: Admin user credentials:
==> awesome_vagrant: login: root
==> awesome_vagrant: password: 123123
==> awesome_vagrant:
Другие статьи серии о о программных решениях, которые мы используем в своей работе:
Если хотите убедиться, что все делаете правильно или проконсультироваться по поводу разработки вашего проекта, напишите нам.
Никакого спама, только анонсы новых статей!