Al escribir publicaciones en mi blog relacionadas con Apache APISIX, deseo que mis compañeros las revisen primero. Sin embargo, dado que es mi blog y mezclo publicaciones personales y de negocios, quiero mantenerlas fuera del repositorio. Necesito una vista previa accesible solo para un selecto grupo de personas, algo similar a la vista previa de Vercel. Estoy utilizando GitLab Pages, y no existe tal función incorporada.
I tried two methods: GitHub gists and PDFs. Both have issues.
Los Gists no se muestran tan bien como la página final. Intenté mejorar la situación utilizando DocGist. Es una mejora, aunque no sea la panacea.
Además, los gists no muestran imágenes ya que escribo mis publicaciones en Asciidoc. Debo colocar imágenes en comentarios, lo que interrumpe el flujo. He intentado adjuntar las imágenes al gist, pero no aparecen en el flujo de la publicación en ningún caso. El beneficio sobre los comentarios es que están ordenados; el inconveniente es que necesito cambiar el Asciidoc.
I used gists because I’m used to GitHub reviews. But since it’s my blog, I neither need nor want the same kind of reviews as in a regular Merge Request. I need people to point me to when something needs to be clarified or I missed a logical jump, not that I made a typo (I use Grammarly for this). For this reason, a PDF export of a post is enough to review.
Sin embargo, los PDFs tienen problemas propios: una “página” web puede ser potencialmente infinita, mientras que una página de PDF estándar corta la anterior en páginas estándar. Las divisiones pueden ocurrir a través de diagramas. Además, los PDFs dificultan mucho la distribución.
En esta publicación, describiré cómo configuré GitLab Pages para obtener la vista previa que deseo.
Resumen de GitLab Pages
GitLab Pages son similares a GitHub Pages:
Con GitLab Pages, puedes publicar sitios web estáticos directamente desde un repositorio en GitLab.
Para publicar un sitio con Pages, puedes utilizar cualquier generador de sitios estáticos, como Gatsby, Jekyll, Hugo, Middleman, Harp, Hexo o Brunch. También puedes publicar cualquier sitio escrito directamente en HTML plano, CSS y JavaScript.
Así es como ves esta entrada de blog. No encontré una función de vista previa para GitLab Pages. Pedí a expertos sin éxito; GitLab no ofrece vistas previas.
Organización del Trabajo
I didn’t believe it initially, but you only need to create a dedicated artifact. Since the artifact consists of web files, the browser will render them.
La idea es crear un artefacto así, accesible bajo una URL, que no pueda predecirse fácilmente. Luego puedo compartir la URL con mis colegas y pedirles su revisión. Para comenzar, podemos copiar la compilación existente en master
:
stages:
- preview
preview:
stage: preview
image:
name: registry.gitlab.com/nfrankel/nfrankel.gitlab.io:latest
before_script: cd /builds/nfrankel/nfrankel.gitlab.io
script: bundle exec jekyll b --future -t --config _config.yml -d public
artifacts:
paths:
- public
only:
refs:
- preview
variables:
JEKYLL_ENV: production
En este punto, el sitio está disponible en https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html
. Sin embargo, hay muchos problemas que necesitan solución.
Haciéndolo Funcionar
Corrijamos los problemas por orden de importancia.
Solución de Permisos de Acceso
El proyecto es privado; por lo tanto, solo yo puedo acceder al artefacto: esto socava el propósito inicial de ofrecer la vista previa a otros.
I want to give my teammates only limited access to my GitLab repository. I gave them Guest access, according to the Principle of least privilege. However, it still didn’t work.
Según la documentación, también debes hacer que tu pipeline sea público. Ve a Ajustes > CI/CD > Tuberías generales y marca la casilla de Tuberías públicas.
Solución de Enlaces Relativos
I use Jekyll to build HTML from Asciidoc. To generate links, Jekyll uses two configuration parameters:
- El dominio, por ejemplo, , se establece con
url
- El camino, por ejemplo,
/
, establecido conbaseurl
Ambos son diferentes en la vista previa. Debes establecer esos parámetros en un archivo de configuración YAML; no hay alternativa de variable de entorno.
Cambiemos la compilación en consecuencia:
preview:
stage: preview
image:
name: registry.gitlab.com/nfrankel/nfrankel.gitlab.io:latest
before_script:
- cd /builds/nfrankel/nfrankel.gitlab.io
- "printf 'url: https://%s.gitlab.io\n' $CI_PROJECT_NAMESPACE >> _config_preview.yml" #1
- "printf 'baseurl: /-/%s/-/jobs/%s/artifacts/public/\n' $CI_PROJECT_NAME $CI_JOB_ID >> _config_preview.yml" #2
- cat _config_preview.yml #3
script: bundle exec jekyll b --future -t --config _config.yml,_config_preview.yml -d public #4
- Establece
url
utilizando la variable de entornoCI_PROJECT_NAMESPACE
. Podría haber utilizado un valor codificado de forma rígida ya que es estático, pero hace que el script sea más reutilizable - Establece
baseurl
utilizando las variables de entornoCI_PROJECT_NAME
yCI_JOB_ID
. La última es la parte aleatoria del requisito - Muestra el contenido de la configuración para fines de depuración
- Úsalo!
Mejorando la Usabilidad
Es una tarea tediosa intentar distribuir la URL correcta cada vez. Mejor escribirlo en la consola después de compilar:
after_script: echo https://$CI_PROJECT_NAMESPACE.gitlab.io/-/$CI_PROJECT_NAME/-/jobs/$CI_JOB_ID/artifacts/public/index.html
Todavía falta un detalle. GitLab Pages ofrece una página de índice. Por ejemplo, si solicitas https://blog.frankel.ch, ellos servirán el archivo raíz index.html
. Con artefactos simples, no es así. Dado que solo quiero ofrecer una sola publicación para vista previa, no es un problema, así que no investigué más la configuración.
Uso
En este punto, solo necesito enviar a mi rama preview
:
git push --force origin HEAD:preview
La guinda del pastel, no necesitamos tener la rama localmente; simplemente envía a la rama remota.
Conclusión
En esta publicación, mostré cómo previsualizar GitLab Pages y compartir la URL de la vista previa con compañeros de equipo en un par de pasos. La parte más difícil fue darse cuenta de que los artefactos web se renderizan regularmente con el navegador.
Para ir más allá: