Меня зовут — Анатолий Ларин

Блог о разработке и разработчике

Ищем python-разработчика [удаленно]



Требования:

#coding: utf-8
from earth import You

if (You.language == 'python'
        and You.vocation in ('developer', 'programmer', 'super coder')
        and You.skill in ('python', 'django', 'OOP', 'SQL', 'git')
        and You.level >= 80):
    print('We need you! Welcome!')
    print('Please, send me email: anatoliy@larin.in')


Что мы предлагаем:

  • удаленную работу в прекрасной команде
  • SCRUM (2-х недельные спринты)
  • гибкий график (работайте когда хотите, важен результат)
  • почасовая оплата (стоимость часа по результатам собеседования)
  • выплаты каждые 2 недели

Mac OS X Mavericks & Vagrant

Интро

Вчера, ближе к ночи, обновил систему на рабочем ноутбуке до Mavericks:

А с утра запустив Vagrant обнаружил, что рабочий день под угрозой:
Read the rest of this entry »

Jenkins – Continuous Integration для Django проектов

Интро

Писать или не писать тесты? Для меня и моих коллег даже вопрос так не стоит. Конечно писАть!

Однако, с появлением тестов и увеличением команды разработки, появляется одна проблема – “забыл запустить тесты“.

Проекты в основном на python & Django и для автоматизации можно написать bash-скрипт и запускать его по cron. Можно воспользоваться сервисами, например: https://travis-ci.com/. Но “трэвис” платный – довольно дорог, а “тревис” бесплатный – мне не подошел – у меня закрытый репозиторий на github.

В итоге, выход один – установить Jenkins. Конечно для этого вам понадобится свой сервер. =)

Установка

Признаюсь – мне нравится Ubuntu. Да, мне приходится работать и на FreeBSD, но нравится Ubuntu. Далее все инструкции будут именно для Linux.

Устанавливаем Jenkins

wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo aptitude update
sudo aptitude install jenkins

Теперь устанавливаем пакеты необходимые для запуска нашего проекта. У меня “стандартный” проект на Django с использованием virtualenv.

sudo aptitude install git make python-virtualenv python-mysqldb mysql-server libmysqlclient-dev
sudo aptitude install python-dev libjpeg8-dev zlib1g-dev libpng12-dev

Если jenkins не запустился сам, запускаем:

sudo service jenkins start

По-умолчанию, он стартует на интерфейсе 0.0.0.0 и порту 8080. Т.е. будет доступен как по 127.0.0.1, так и по внешнему IP.
Открываем http://127.0.0.1:8080/

Jenkins dashboard

Значит все хорошо, продолжаем настройку.

Спрячем за Nginx

Установим Nginx, настроим проксирование на jenkins и настроим basic-auth.

sudo aptitude install nginx apache2-utils

в конфиг nginx прописываем

server {
    listen 80;
    server_name jenkins.your-domain.com;
    charset utf-8;

    location / {
        auth_basic "Welcome!!!";
        auth_basic_user_file /etc/nginx/basic-auth-file;
        proxy_pass http://localhost:8080;
    }
}

Затем

htpasswd -cb /etc/nginx/basic-auth-file jenkins YOUR_PASSWORD

и редактируем конфиг jenkins: /etc/default/jenkins

JAVA_ARGS="-Dfile.encoding=UTF8 -Duser.timezone=UTC+04:00"
HTTP_PORT=8080
HTTP_HOST=localhost
JENKINS_ARGS="--webroot=/var/cache/jenkins/war --httpPort=$HTTP_PORT --httpListenAddress=$HTTP_HOST --ajp13Port=$AJP_PORT"

Готово.

sudo service nginx restart
sudo service jenkins restart

Теперь по http://jenkins.your-domain.com будет доступен Jenkins с защитой в виде basic auth.

Плагины

[Manage Jenkins] => [Manage Plugins]
Репозиторий проекта находится на github.com соответственно нужны плагины:

  • GitHub API Plugin
  • GitHub plugin
  • Jenkins GIT client plugin
  • Jenkins GIT plugin

и до кучи:

  • GreenBalls Plugin
  • Python Plugin

Далее настраиваем авторизацию на github.com

sudo su - jenkins
ssh-keygen -t rsa

копируем содержимое файла ~/.ssh/id_rsa.pub в буффер и идем в настройки профиля на github.com:
[Account settings] => [SSH keys] => [Add SSH Key]
И вставляем в форму содержимое буфера обмена.

Возвращаемся на сервер, проверяем:

git clone git@github.com:your_login/your_repo.git /tmp/my_repo

Если все хорошо переходим в настройки Jenkins: [Manage Jenkins] => [Configure System]

В секции Jenkins Location задаем URL по каторому доступен сервис: jenkins.your-domain.com и e-mail администратора.

В секции E-mail Notification настраиваем SMTP, с которого будут отправляться уведомления.

И наконец, в Git plugin прописываем: jenkins & email из секции E-mail Notification.

Настройка закончена.

Запуск тестов

Для деплоя и запуска тестов я использую Makefile:

PROJECT_DIR=$(shell pwd)
VENV_DIR?=$(PROJECT_DIR)/.env
PIP?=$(VENV_DIR)/bin/pip
PYTHON?=$(VENV_DIR)/bin/python

all: virtualenv distribute pip

virtualenv:
	virtualenv $(VENV_DIR)

distribute:
	$(PIP) install distribute==0.7.3

pip: requirements requirements-dev

requirements:
	$(PIP) install -r $(PROJECT_DIR)/requires.txt

requirements-dev:
	$(PIP) install -r $(PROJECT_DIR)/requires-dev.txt

clean: clean_venv

clean_venv:
	rm -rf $(VENV_DIR)

test:
	$(PYTHON) $(PROJECT_DIR)/manage.py test --traceback

Открываем Jenkins и создаем новую задачу -
[New Job] => [вводим название (без пробелов)] => [Build a free-style software project]

Секция Source Code Management – выбираем git, указываем Repository URL и ветку (Branches to build), коммиты в которую необходимо мониторить.

Секция Build Triggers – отмечаем Poll SCM и в появившееся поле вводим: H/10 * * * * – проверять наличие коммитов каждый 10 минут.

Секция Build
[Add build step] => [Execute shell]
в появившееся поле вставляем:

make
make test

Секция Post-build Actions
[Add post-build action] => [Email Notification]
Добавляем (через пробел) адреса разработчиков.

Готово.

Теперь можно перейти на страницу созданного задания и нажать Build Now, либо дождаться коммита в соответствующую ветку. И если все настроено верно, то вам на почту придет результат выполнения тестов.

django-jenkins

Есть замечательное приложение django-jenkins, позволяющее запускать не только тесты, но и различные валидаторы, например: pep8, Pyflakes, Pylint и др.
Результат выполнения тестов будет представлен в виде junit xml.

Установка приложения требностей не вызовет, зато его использование принесет вам множество приятных моментов.

Андрей Аксенов: “Как готовить Sphinx” / мастер-класс

Интро

В субботу, 18-го июня в Киеве пройдет мастер-класс создателя  движка полнотекстового поиска Sphinx Андрея Аксенова ”Как готовить Sphinx”.

Мастер-класс будет интересен разработчикам, руководителям и владельцам проектов, которые сталкиваются с проблемой поиска при высоких загрузках.

Sphinx используют такие монстры, как CraigsList, DailyMotion, Meetup, HupPages, HabraHabr и еще десятки высоконагруженных сайтов. Андрей Аксенов  выступал на многочисленных конференциях в России: “DevPoint 1-2″, “РИТ”, “DevConf 2011″, “HighLoad ++”. Организатор конференции пользователей Sphinx в Москве. Автор нашумевшего доклада “Как прекратить писать”.

Дополнительная информация и подробный план мастер-класса можна посмотреть на сайте http://www.smartme.com.ua/sphinx-workshop/

Django 1.x & form_for_model

Интро

Давным-давно, когда деревья были большими, “джанга”  маленькой, а формы “новыми”, существовала такая функция: form_for_model. И на основе этой функции был даже создан сниппет, позволяющий динамический создавать форму по модели и менять “на лету” свойства созданной формы.

Однако, начиная с версии Django 1.0 данная функциональность была помечена как “deprecated” и уже в 1.0 beta 1 удалена.
Read the rest of this entry »