Cómo distribuir extensiones pagas – tercera parte (automatizando todo)

Hasta ahora ya vimos cómo instalar Gitlab, cómo instalar Satis y cómo configurar todo incluso para poder instalar nuestra extensión en Magento.

Un de las cosas que me había planteado en un principio, era que mis repos privados quedaran resguardados en Github, y que nadie tuviese acceso a ellos. Así que ahora vamos a ver como importar mis repos privados de Github en mi Gitlab cero kilómetro.

Lo que vamos a hacer es ir en el Gitlab a crear un proyecto, y vamos a elegir «import project».

Y luego elegir nuestro proveedor, en este caso Github.

Nos va a pedir un «personal access token».

Que lo podemos crear fácilmente en tus settings de Github. Vas a developer settings, y ahí en personal access tokens creas uno nuevo y lo usas en el Gitlab.

Una vez que metas tu token en la pantalla anterior del Gitlab, te va a listar toooooodos los repos a los cuales tenés acceso.

Lo único que tenés que hacer, es elegir los que querés importar en tu Gitlab, (te conviene no ponerlos en root, sino crear y elegir el grupo en el combo que te presenta, que lo importó directo de tu Github) y clickear en el botón de import correspondiente.

Una vez que hice esto, tengo que agregar al usuario gonzalezuy como developer para ese repo. Voy al proyecto, en el menú de la izquierda selecciono settings/members.

Una vez que hiciste esto, ya lo podes agregar a tu Satis.

bin/satis -vvv add http://gitlab.gonzalezuy.com/tugrupo/turepo.git

Y generar tu nuevo build.

bin/satis build satis.json web -n

Y después de eso, vas a ver el nuevo paquete, con todas sus versiones.

Ahora vamos a automatizar el proceso.

Lo primero que tenemos que hacer, es agregar en Github la public ssh key de nuestro servidor en nuestro usuario de Github.

Vamos a Github, elegimos settings/ssh and pgp keys, new ssh key y simplemente la agregamos como hacemos normalmente.

Si todo esta bien, deberíamos poder clonar el repo en nuestro servidor.

git clone --bare git@github.com:mygroup/myrepo.git temp

Ahora vamos a mirar un poco, si vas al directorio /var/opt/gitlab/git-data/repositories/, ahí están los los repos de Gitlab. Vas a ver un directorio por cada grupo/usuario a los que pertenecen tus repos, típicamente deberías tener uno solo con el nombre por ejemplo de tu empresa.

Si entras a ese directorio, vas a encontrar un directorio por cada repo que tenes en tu Gitlab.

Este script mágico vuelve a traer tu repo de Github (que esta bien protegido sin que nadie acceda a él) y lo vuelve a «importar» en tu Gitlab.

cd /var/opt/gitlab/git-data/repositories/tuemperesa/
rm -rf $1/*
git clone --bare git@github.com:tuempresa/$1 temp
chown -R git.git temp/
cp -R temp/* $1
rm -rf temp
if [ "$2" = "refresh" ]
then
gitlab-rake cache:clear
cd /var/www/html/satis
bin/satis -vvv build satis.json html
fi
cd

Obviamente tenes que cambiar donde dice tuempresa, por la que corresponda, y lo llamás con myrepo.git (esos nombres de directorios que ves ahí).

Podés hacer un cron que una vez al día, cada 4 horas, o cuando te parezca, refresque todos tus repos.

Autorizando clientes

Otro de los requerimientos era que tenía que poder autorizar a un cliente determinado cuando le vendía la extensión, que solo pudiese bajar esa extensión y nada más, y que su permiso tuviese un vencimiento..

Todo eso lo puedo hacer siendo un poquito organizado, por ejemplo, para empezar, tener un usuario por repo, de esa forma si le agrego una impersonation token, como tiene acceso solo a ese repo, no va a poder bajarse otra cosa que ese package. Por otro lado, en Gitlab las impersonation tokens tienen una fecha de vencimiento, así que voy a aprovechar esa facilidad.

Como ya dije antes, solo root puede hacer esto, así que vas a necesitar una personal access token para root, para esto vas a settings/access token y creas una. De ahí, lo único que tenes que hacer es que vía curl tu tienda cree una nueva token con el vencimiento y el usuario adecuado.

curl --request POST --header "PRIVATE-TOKEN: UfyiszM97MM11x3KQuJ9" --data "name=ordernumber" --data "expires_at=2019-04-04" --data "scopes[]=api" http://gitlab.gonzalezuy.com/api/v4/users/2/impersonation_tokens

Acá la private token es la que le creaste a root, en name te conviene poner el numero de orden de tu Magento, para que puedas después buscar en Gitlab qué token se corresponde con que orden, la fecha de vencimiento (obvio) y tenes que saber si o si el numero del user (en mi caso 2).

Esto te va a devolver algo así:

{"id":3,"name":"ordernumber","revoked":false,"created_at":"2018-10-08T20:17:21.679Z","scopes":["api"],"active":true,"expires_at":"2019-04-04","token":"KsEkbwrwvzM7-fa9S15u","impersonation":true}

Donde lo que te interesa es el token que se generó, ese es el que le vas a pasar al comprador.

Y si vas al usuario en Gitlab, vas a ver todas las tokens que se le generaron, con su orden asociada y cuando se vencen.

Ahora lo que le tenes que decir a tu comprador, es que tiene que ejecutar lo siguiente:

composer config repositories.tuempresa composer https://satis.gonzalezuy.com
composer config http-basic.gitlab.gonzalezuy.com elusuarioparaeserepo eltokengenerado
composer require tuempresa/tuextension

(este es el nombre que le pusiste en el composer.json y que aparece en satis.gonzalezuy.com).

Cuando llegue la fecha correspondiente, el usuario ya no va a poder acceder más a tu repo, así que dependiendo de tu licencia, le darás o no acceso mas allá de esa fecha.

Notas importantes

Primero: tené en cuenta, todo esto lo tenes que poner por https.

Y segundo: Si tenés mas de una extensión que vendés, tenés que tener en cuenta que la autorización que se genera cuando hacés:

composer config http-basic.gitlab.gonzalezuy.com elusuarioparaeserepo eltokengenerado

Se hace por url. Es decir que generás una nueva pareja usuario/token para otra extensión y hacés:

composer config http-basic.gitlab.gonzalezuy.com elusuarioparaeserepo2 eltokengenerado2

Le va a caminar por arriba a la primera que hiciste.

Para evitarlo, tendrías en ese caso que poner un dominio para cada extensión, por ejemplo: ext1.gitlab.gonzalezuy.com y ext2.gitlab.gonzalezuy.com.

Publicado por Gonzalo Dominguez

Magento fanatic developer. Do not try and bend the spoon. That's impossible. Instead... only try to realize the truth. There is no spoon. @gonzalezuy