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>