Match Game (Expeditionary Force, #14)
![]() |
|
![]() |
|
This post has only one objective. The next person who wants to run the tests on his Python project hosted on GitHub should be able to read it and get his tests running in 15 minutes or less using GitHub Actions.
So, concepts:
This assumes your project is "modern" in that it uses Poetry for dependency management and packaging. Of course maybe it doesn't, but don't worry, that only is important for maybe 3 lines of YAML.
So, Github Actions runs what's called "workflows". You define these in YAML files
in .github/workflows/whatever.yml
in your repo.
Here's the original version of the workflow we'll be studying today: test.yml
Don't worry about the project it's in, it really doesn't matter.
Now, let's examine that file bit by bit with explanations, so you can see if something needs changing for you.
name: CI
on:
[push, pull_request]
This workflow is called "CI" and it runs on every push to any branch.
jobs:
build:
strategy:
matrix:
python-version: ["3.10"]
runs-on: ubuntu-latest
Put all the versions of Python you want to test in python-versions
. This will run the tests in Ubuntu.
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Switch to Current Branch
run: git checkout ${{ env.BRANCH }}
Checkout this repo we are testing, go to the right branch.
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
Install whatever Python version we are testing.
- name: Install dependencies
run: |
pip install poetry
poetry install
Install whatever you need. Since this project uses poetry, I install poetry and then use poetry to setup things. If you are using something else, then change it accordingly.
- name: Run unit tests
run: |
poetry run pytest
Run the tests in whatever way they need to run. Again, since I am using poetry, this works. If you are not, then change this as needed.
So, put this file in .github/workflows/test.yml
, modify as needed. Commit. Push.
Now your tests run on every push.
And that's it. If your project uses poetry, then this workflow may work unchanged (except maybe for Python versions?)
Good luck!
Vi algo en twitter, eso me hizo googlear, llegué a https://obsproject.com/forum/threads/180-degree-live-fisheye-distortion-correction.100214/ y ... terminé haciendo este video, que explica como hacer dos cosas, una útil, la otra ... no tanto (aunque es medio parecido a algo que apple mostró en WWDC!)
Sospecho que la única manera de que haga videos es que sean cosas así, espontáneas, sin mucho laburo atrás porque estoy haciendo muchas cosas y no tengo tiempo.
![]() |
Review:Why did I read this after I didn't quite like #2? I don't know. |
Esta es la historia de como tener tu propio server de apps web, de la manera más barata, sencilla y funcional.
Supongamos que por el motivo que fuera uno tiene algunas apps que quiere usar. En mi caso, digamos que son dos:
Gitea: algo como tu propio GitHub. ¿Por qué? Porque está bien ser dueño de tus propios datos, me parece. Entonces quiero tener la POSIBILIDAD de tener mi propio server. También permite clonar el repo a GitHub así que no perdés nada.
Mi sitio: Porque, de nuevo, lo que yo escribo es mío, y por qué no lo voy a tener yo en vez de ponerlo en Medium o algún otro sitio maligno. Aparte, lo tengo hace más de 20 años, no voy a parar ahora.
Pero podría ser cualquier cosa! Una app que estás haciendo, algo que querés probar, OwnCloud o lo que se te cante, si sos el tipo de nerd que quiere tener su propia app/sitio ... se puede.
Así que vamos a construir, desde cero, todo lo necesario para poder acceder a esos sitios/apps.
Si querés tener tus propias apps, entonces vas a necesitar hardware en el cual ejecutarlas. Cuál es la computadora de uso general más barata a la cual se puede acceder que tiene algún tipo de red?
Una Raspberry Pi Zero W ... sale 10 dólares, si se pudiese conseguir, claro. Pero bueno, yo tengo una. O seis. la que voy a usar se llama pinky.
Si no tenés, o no querés una de esas, podés usar cualquier cosa que tenga Linux. O Windows. O MacOS, pero yo lo hice con Linux, así que mejor si usás Linux por ahora. Puede ser literalmente cualquier compu no hay compu muy lenta para esto.
O sí, dependiendo de lo que quieras poner ahí, pero probablemente cualquier compu sirva.
No voy a entrar en detalles, pero instalá lo que sea que querés hacer andar, y hacelo andar. En mi caso la definición de "anda" es:
Así que buscá las instrucciones para lo que querés y hacélo andar, che.
Si podés acceder y usarlo desde la misma red en la que está tu server? Listo. Level UP.
¿Pero que pasa si querés acceder a ese sitio y no estás en la misma red?
Bueno, no anda. Obvio que http://pinky.local:3000 solo anda en la red local así que vamos a solucionarlo.
Hay varias maneras, pero voy a mostrar la que quiero mostrar: tailscale, en particular, la versión gratis, para una persona.
¿Qué es tailscale? Es una VPN.
En particular, es una VPN "personal". Si te registrás y lo instalás en un par de máquinas crea una red que conecta ambas máquinas entre sí, aunque esas máquinas no estén en la misma red física.
Así que si uno instala tailscale en el server (en mi caso sería pinky) y en la máquina que uso todo el tiempo (en mi caso salma) ... entonces esas máquinas siempre pueden verse usando nombres especiales que te da tailscale.
Si hago click en una de las máquinas me da información sobre ella.
Y ahí podemos ver que pinky también tiene otro nombre, que le da
tailscale: pinky.ralsina.github.beta.tailscale.net
No intenten accederla porque no funciona a menos que ustedes estén en mi VPN y no lo están ni lo van a estar :-)
¡Pero yo sí!
Tal vez esto sea suficiente. En este momento podés acceder a tus servers desde cualquier lado mientras tengas conexión a la VPN de tailscale. Nice!
Pero ... y si quiero que acceda más gente? Entonces LEVEL UP.
Nuevamente hay varias maneras de darle a terceros acceso a tu server. Pero yo te voy a mostrar una que me gusta a mí: fly.io
Fly.io es una empresa que te da la posibilidad de ejecutar "cosas" en máquinas virtuales "gratis" dentro de ciertos límites. En particular, no más de 160GB al mes, después te cobran.
Así que ... imaginemos que una de esas VMs estuviera conectada a nuestra VPN de tailscale.
Y que está ejecutando un proxy inverso de manera que cualquiera puede conectarse a esa máquina virtual que haría de intermediario y expondría nuestro server para que se pueda acceder desde afuera? Eh?
Bueno. Acá está la documentación necesaria para conectar una VM de fly.io a nuestra VPN.
Y acá está mi versión, que instala un Nginx
Modificá el nginx.conf para que mande las cosas adonde vos querés que vayan.
Por ahora no sería posible usar dos hostnames distintos (después vemos)
y el server_name
debería ser el hostname público que te da fly.io, por ejemplo en mi caso eso era
white-wave-7409.fly.dev
Una vez hecho eso deberías poder acceder a uno de tus servicios usando ese hostname:
Nótese que está conectado via HTTPS, porque fly.io en realidad tiene un proxy "mas afuera" que hace la terminación HTTPS, así que no necesitamos crear certificados ni nada.
Y con eso tenemos un sitio web, accesible desde cualquier dispositivo conectado a Internet, y es gratis por los primeros 160GB! Misión cumplida!
Pero que pasa si queremos una URL más bonita? Por ejemplo, yo quiero que Gitea esté en git.ralsina.me y mi sitio en home.ralsina.me ...
Bueno, si querés eso, LEVEL UP.
Como siempre, hay muchas maneras de resolverlo. Pero esta es la que yo uso. Cloudflare da DNS gratis. Si tenés un dominio, lo configurás para que use cloudflare de DNS y listo.
Si no tenés un dominio, comprá o conseguí uno, que se yo.
Una vez que lo tenés, y lo configuraste en Cloudflare o en el server de DNS que más te guste ... configurá todos los CNAME que quieras.
Yo en particular hice dos:
Tanto git.ralsina.me como home.ralsina.me apuntan al nombre que me dió fly.io (white-wave-7409.fly.dev), así que ahora "resuelven" así:
> host git.ralsina.me
git.ralsina.me is an alias for white-wave-7409.fly.dev.
white-wave-7409.fly.dev has address 37.16.0.181
white-wave-7409.fly.dev has IPv6 address 2a09:8280:1::6:3716
Si usás cloudflare, tienen que estar como "DNS Only"
El siguiente paso es informar a fly.io que vamos a manejar esos nombres a través nuestra app con estos comandos (cambiar como corresponda) en la máquina donde manejamos nuestra app de fly.io
> flyctl certs create git.ralsina.me
> flyctl certs create home.ralsina.me
Cambiamos nuevamente la configuración de nginx para que envíe cada servicio donde corresponda en base al server name y ya está. Con esto tenemos todo funcionando.
¿Qué logramos?
Creo que nadie tiene publicada una guía para lograr todo esto, ojalá le sirva a alguien.