static-httpd

Sitio web estático (HTML + CSS) que sostiene el blog del autor
Log | Files | Refs

index.html (5708B)


      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
      5 <meta name="viewport" content="width=device-width, initial-scale=1" />
      6 <title>Externalización gráfica de servidor Git propio con stagit</title>
      7 <link rel="icon" type="image/png" href="/favicon.png" />
      8 <link rel="stylesheet" type="text/css" href="../article.css" />
      9 </head>
     10 <body>
     11 <header>
     12 <p class="title">Externalización gráfica de servidor Git propio con stagit</p>
     13 <p class="date">23 de noviembre de 2020 • fjbalon</p>
     14 </header>
     15 <p>A veces es agradable navegar por el registro del historial de git en un navegador web o en algún otro programa sin tener que mirar el repositorio local. Es además una forma de mantener un registro de los repositorios que sean públicos, a modo de currículum o expositor de código. Si además se cumple el requisito personal de cumplir con una regla o una filosofía minimalista, de web estática en este caso y libre, aún mejor.</p>
     16 <p>Para ello uso el impecable <a href="https://codemadness.org/git/stagit">stagit</a>, que es un generador de pagínas estáticas para git desarrollado por <a href="https://codemadness.org">codemadness.org</a>. Su uso es simple. Manualmente consta de dos partes, que son la creación de directorios html (que deben ser accesibles mediante servidor web) y su enlace con el directorio del servidor git:</p>
     17 <pre><code>mkdir -p /srv/git/htmlrepo1 && cd /srv/git/htmlrepo1
     18 stagit /git/gitrepo1</code></pre>
     19 <p>Y la formación del índice y el htmlroot:</p>
     20 <pre><code>cd /srv/git
     21 stagit-index /git/gitrepo1 /git/gitrepo2 /git/gitrepo3 > index.html</code></pre>
     22 <p>Ejemplos de resultados son <a href="https://templier.es/git/">templier.es/git</a>, <a href="https://codemadness.org/git/">codemadness.org/git</a> o <a href="https://git.suckless.org/">git.suckless.org</a>.</p>
     23 <h2>Automatización de actualización de repositorios</h2>
     24 <p>Para automatizar la actualización del directorio en función de los cambios de push añadimos a htmlroot (<emb>/srv/git</emb>) el script:</p>
     25 <pre><code># /srv/git/create.sh 
     26 reposdir="/git"
     27 curdir="$(pwd)"
     28 
     29 stagit-index "${reposdir}/"*/ > "${curdir}/index.html"
     30 
     31 for dir in "${reposdir}/"*/; do
     32         # strip .git suffix.
     33         r=$(basename "${dir}")
     34         d=$(basename "${dir}" ".git")
     35         printf "%s... " "${d}"
     36 
     37         mkdir -p "${curdir}/${d}"
     38         cd "${curdir}/${d}" || continue
     39         stagit -c ".cache" -u "/git/$d/" "${reposdir}/${r}"
     40 
     41         # symlinks
     42         ln -sf log.html index.html
     43         ln -sf ../style.css style.css
     44         ln -sf ../logo.png logo.png
     45         ln -sf ../favicon.png favicon.png
     46 
     47         echo "done"
     48 done</code></pre>
     49 <p>Por supuesto, el script anterior debe contar con permisos de ejecución; y el directorio htmlroot debe tener permisos adecuados para su manipulación, que siendo en este caso el usuario git el que genere de nuevo los HTML, debería éste tener permisos totales.</p>
     50 <p>Además, por cada repositorio del servidor debemos añadir el hook post-receive tal que:</p>
     51 <pre><code>#!/bin/sh
     52 # /git/code.git/hooks/post-receive 
     53 
     54 export LC_CTYPE="en_US.UTF-8"
     55 
     56 name="$1"
     57 if test "${name}" = ""; then
     58         name=$(basename "$(pwd)")
     59 fi
     60 
     61 reposdir="/git"
     62 dir="${reposdir}/${name}"
     63 htmldir="/srv/git"
     64 stagitdir="/"
     65 destdir="${htmldir}${stagitdir}"
     66 cachefile=".htmlcache"
     67 
     68 if ! test -d "${dir}"; then
     69         echo "${dir} does not exist" >&2
     70         exit 1
     71 fi
     72 cd "${dir}" || exit 1
     73 
     74 force=0
     75 while read -r old new ref; do
     76         test "${old}" = "0000000000000000000000000000000000000000" && continue
     77         test "${new}" = "0000000000000000000000000000000000000000" && continue
     78 
     79         hasrevs=$(git rev-list "${old}" "^${new}" | sed 1q)
     80         if test -n "${hasrevs}"; then
     81                 force=1
     82                 break
     83         fi
     84 done
     85 
     86 r=$(basename "${name}")
     87 d=$(basename "${name}" ".git")
     88 printf "[%s] stagit HTML pages... " "${d}"
     89 
     90 mkdir -p "${destdir}/${d}"
     91 cd "${destdir}/${d}" || exit 1
     92 
     93 if test "${force}" = "1"; then
     94         rm -f "${cachefile}"
     95         rm -rf "commit"
     96 fi
     97 
     98 stagit-index "${reposdir}/"*/ > "${destdir}/index.html"
     99 stagit -c "${cachefile}" -u "/git/$d/" "${reposdir}/${r}"
    100 
    101 ln -sf log.html index.html
    102 ln -sf ../style.css style.css
    103 ln -sf ../logo.png logo.png
    104 
    105 echo "done"</code></pre>
    106 <p>También debe contar con privilegios de ejecución. Lo que hará que en cada push recibido, el contenido HTML de stagit se actualice.</p>
    107 <p>Para una correcta impresión de los datos, es necesario que cada directorio de repositorio tenga en su raíz los ficheros owner, description y url:</p>
    108 <pre><code>cd /git/code
    109 echo "fjbalon" > owner
    110 echo "Descripción del repositorio" > description
    111 echo "git://templier.es/code.git" > url</code></pre>
    112 <p>Las imágenes por defecto empleadas son favicon.png y logo.png, que irán en la raíz de htmlroot (/srv/git). También style.css.</p>
    113 <pre><code>cp stagit/style.css /srv/git/
    114 cp stagit/favicon.png /srv/git/
    115 cp stagit/logo.png /srv/git/</code></pre>
    116 <h2>Autodespliegue con hooks</h2>
    117 <p>En este ejemplo damos al hook post-receive del repositorio del sitio web la capacidad de autodesplegarse al recibir push, con el ejemplo de esta propia web estática para que, con mi propio push autenticado por SSH, automáticamente se lance como actualización al servidor Apache.</p>
    118 <pre><code>#!/bin/sh
    119 # /git/arrakis.git/hooks/post-receive 
    120 
    121 echo "Ejecutando hook postreicive: desplegando a producción el static-site"
    122 git --work-tree=/srv/http --git-dir=/tex/arrakis.git checkout -f master</code></pre>
    123 <p>Por supuesto, los permisos del directorio htmlroot deben tener los permisos para git.</p>
    124 <pre><code>drwxr-xr-x  3 git  git  4096 Dec 14 15:53 http</code></pre>
    125 </body>
    126 </html>