You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
149 lines
5.6 KiB
149 lines
5.6 KiB
SHELL := /bin/bash |
|
.DEFAULT_GOAL := help |
|
|
|
# Copiar el archivo de configuración y avisar cuando hay que |
|
# actualizarlo. |
|
.env: .env.example |
|
@test -f $@ || cp -v $< $@ |
|
@test -f $@ && echo "Revisa $@ para actualizarlo con respecto a $<" |
|
@test -f $@ && diff -auN --color $@ $< |
|
|
|
include .env |
|
|
|
export |
|
|
|
# XXX: El espacio antes del comentario cuenta como espacio |
|
args ?=## Argumentos para Hain |
|
commit ?= origin/rails## Commit desde el que actualizar |
|
env ?= staging## Entorno del nodo delegado |
|
sutty ?= $(SUTTY)## Dirección local |
|
delegate ?= $(DELEGATE)## Cambia el nodo delegado |
|
hain ?= $(HAINISH)## Ubicación de Hainish |
|
|
|
# El nodo delegado tiene dos entornos, production y staging. |
|
# Dependiendo del entorno que elijamos, se van a generar los assets y el |
|
# contenedor y subirse a un servidor u otro. No utilizamos CI/CD (aún). |
|
# |
|
# Production es el entorno de panel.sutty.nl |
|
ifeq ($(env),production) |
|
container ?= sutty |
|
## TODO: Cambiar a otra cosa |
|
branch ?= rails |
|
public ?= public |
|
endif |
|
|
|
# Staging es el entorno de panel.staging.sutty.nl |
|
ifeq ($(env),staging) |
|
container := staging |
|
branch := staging |
|
public := staging |
|
endif |
|
|
|
help: always ## Ayuda |
|
@echo -e "Sutty\n" | sed -re "s/^.*/\x1B[38;5;197m&\x1B[0m/" |
|
@echo -e "Servidor: https://panel.$(SUTTY_WITH_PORT)/\n" |
|
@echo -e "Uso: make TAREA args=\"ARGUMENTOS\"\n" |
|
@echo -e "Tareas:\n" |
|
@grep -E "^[a-z\-]+:.*##" Makefile | sed -re "s/(.*):.*##(.*)/\1;\2/" | column -s ";" -t | sed -re "s/^([^ ]+) /\x1B[38;5;197m\1\x1B[0m/" |
|
@echo -e "\nArgumentos:\n" |
|
@grep -E "^[a-z\-]+ \?=.*##" Makefile | sed -re "s/(.*) \?=.*##(.*)/\1;\2/" | column -s ";" -t | sed -re "s/^([^ ]+) /\x1B[38;5;197m\1\x1B[0m/" |
|
|
|
assets: node_modules public/packs/manifest.json.br ## Compilar los assets |
|
|
|
test: always ## Ejecutar los tests |
|
$(MAKE) rake args="test RAILS_ENV=test $(args)" |
|
|
|
postgresql: /etc/hosts ## Iniciar la base de datos |
|
pgrep postgres >/dev/null || $(hain) postgresql |
|
|
|
serve-js: /etc/hosts node_modules ## Iniciar el servidor de desarrollo de Javascript |
|
$(hain) 'bundle exec ./bin/webpack-dev-server' |
|
|
|
serve: /etc/hosts postgresql Gemfile.lock ## Iniciar el servidor de desarrollo de Rails |
|
$(MAKE) rails args=server |
|
|
|
rails: ## Corre rails dentro del entorno de desarrollo (pasar argumentos con args=). |
|
$(MAKE) bundle args="exec rails $(args)" |
|
|
|
rake: ## Corre rake dentro del entorno de desarrollo (pasar argumentos con args=). |
|
$(MAKE) bundle args="exec rake $(args)" |
|
|
|
bundle: ## Corre bundle dentro del entorno de desarrollo (pasar argumentos con args=). |
|
$(hain) 'bundle $(args)' |
|
|
|
rubocop: ## Yutea el código que está por ser commiteado |
|
git status --porcelain \ |
|
| grep -E "^(A|M)" \ |
|
| sed "s/^...//" \ |
|
| grep ".rb$$" \ |
|
| ../haini.sh/haini.sh "xargs -r ./bin/rubocop --auto-correct" |
|
|
|
audit: ## Encuentra dependencias con vulnerabilidades |
|
$(hain) 'gem install bundler-audit' |
|
$(hain) 'bundle audit --update' |
|
|
|
brakeman: ## Busca posibles vulnerabilidades en Sutty |
|
$(MAKE) bundle args='exec brakeman' |
|
|
|
yarn: ## Tareas de yarn |
|
$(hain) 'yarn $(args)' |
|
|
|
clean: ## Limpieza |
|
rm -rf _sites/test-* _deploy/test-* log/*.log tmp/cache tmp/letter_opener tmp/miniprofiler tmp/storage |
|
|
|
build: Gemfile.lock ## Generar la imagen Docker |
|
time docker build --build-arg="BRANCH=$(branch)" --build-arg="RAILS_MASTER_KEY=`cat config/master.key`" -t sutty/$(container) . |
|
docker tag sutty/$(container):latest sutty:keep |
|
@echo -e "\a" |
|
|
|
save: ## Subir la imagen Docker al nodo delegado |
|
time docker save sutty/$(container):latest | ssh root@$(delegate) docker load |
|
date +%F | xargs -I {} git tag -f $(container)-{} |
|
@echo -e "\a" |
|
|
|
ota-js: assets ## Actualizar Javascript en el nodo delegado |
|
sudo chgrp -R 82 public/ |
|
rsync -avi --delete-after public/ root@$(delegate):/srv/sutty/srv/http/data/_$(public)/ |
|
ssh root@$(delegate) docker exec $(container) sh -c "cat /srv/http/tmp/puma.pid | xargs -r kill -USR2" |
|
|
|
ota: ## Actualizar Rails en el nodo delegado |
|
umask 022; git format-patch $(commit) |
|
scp ./0*.patch $(delegate):/tmp/ |
|
ssh $(delegate) mkdir -p /tmp/patches-$(commit)/ |
|
scp ./0*.patch $(delegate):/tmp/patches-$(commit)/ |
|
scp ./ota.sh $(delegate):/tmp/ |
|
ssh $(delegate) docker cp /tmp/patches-$(shell echo $(commit) | cut -d / -f 1) $(container):/tmp/ |
|
ssh $(delegate) docker cp /tmp/ota.sh $(container):/usr/local/bin/ota |
|
ssh $(delegate) docker exec $(container) apk add --no-cache patch |
|
ssh $(delegate) docker exec $(container) ota $(commit) |
|
rm ./0*.patch |
|
|
|
# Todos los archivos de assets. Si alguno cambia, se van a recompilar |
|
# los assets que luego se suben al nodo delegado. |
|
assets := package.json yarn.lock $(shell find app/assets/ app/javascript/ -type f) |
|
public/packs/manifest.json.br: $(assets) |
|
$(hain) 'PANEL_URL=https://panel.sutty.nl RAILS_ENV=production NODE_ENV=production bundle exec rake assets:precompile assets:clean' |
|
|
|
# Correr un test en particular por ejemplo |
|
# `make test/models/usuarie_test.rb` |
|
tests := $(shell find test/ -name "*_test.rb") |
|
$(tests): always |
|
$(MAKE) test args="TEST=$@" |
|
|
|
# Agrega las direcciones locales al sistema |
|
/etc/hosts: always |
|
@echo "Chequeando si es necesario agregar el dominio local $(SUTTY)" |
|
@grep -q " $(SUTTY)$$" $@ || echo -e "127.0.0.1 $(SUTTY)\n::1 $(SUTTY)" | sudo tee -a $@ |
|
@grep -q " api.$(SUTTY)$$" $@ || echo -e "127.0.0.1 api.$(SUTTY)\n::1 api.$(SUTTY)" | sudo tee -a $@ |
|
@grep -q " panel.$(SUTTY)$$" $@ || echo -e "127.0.0.1 panel.$(SUTTY)\n::1 panel.$(SUTTY)" | sudo tee -a $@ |
|
@grep -q " postgresql.$(SUTTY)$$" $@ || echo -e "127.0.0.1 postgresql.$(SUTTY)\n::1 postgresql.$(SUTTY)" | sudo tee -a $@ |
|
|
|
# Instala las dependencias de Javascript |
|
node_modules: package.json |
|
$(MAKE) yarn |
|
|
|
# Instala las dependencias de Rails |
|
Gemfile.lock: Gemfile |
|
$(MAKE) bundle args=install |
|
|
|
.PHONY: always
|
|
|