You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

368 lines
13 KiB
HTML

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc 3.10" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<title>Documentation - create_repo.sh</title>
<style>
/* Default styles provided by pandoc.
** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
*/
html {
color: #1a1a1a;
background-color: #fdfdfd;
}
body {
margin: 0 auto;
max-width: 36em;
padding-left: 50px;
padding-right: 50px;
padding-top: 50px;
padding-bottom: 50px;
hyphens: auto;
overflow-wrap: break-word;
text-rendering: optimizeLegibility;
font-kerning: normal;
}
@media (max-width: 600px) {
body {
font-size: 0.9em;
padding: 12px;
}
h1 {
font-size: 1.8em;
}
}
@media print {
html {
background-color: white;
}
body {
background-color: transparent;
color: black;
font-size: 12pt;
}
p, h2, h3 {
orphans: 3;
widows: 3;
}
h2, h3, h4 {
page-break-after: avoid;
}
}
p {
margin: 1em 0;
}
a {
color: #1a1a1a;
}
a:visited {
color: #1a1a1a;
}
img {
max-width: 100%;
}
svg {
height: auto;
max-width: 100%;
}
h1, h2, h3, h4, h5, h6 {
margin-top: 1.4em;
}
h5, h6 {
font-size: 1em;
font-style: italic;
}
h6 {
font-weight: normal;
}
ol, ul {
padding-left: 1.7em;
margin-top: 1em;
}
li > ol, li > ul {
margin-top: 0;
}
blockquote {
margin: 1em 0 1em 1.7em;
padding-left: 1em;
border-left: 2px solid #e6e6e6;
color: #606060;
}
code {
white-space: pre-wrap;
font-family: Menlo, Monaco, Consolas, 'Lucida Console', monospace;
font-size: 85%;
margin: 0;
hyphens: manual;
}
pre {
margin: 1em 0;
overflow: auto;
}
pre code {
padding: 0;
overflow: visible;
overflow-wrap: normal;
}
.sourceCode {
background-color: transparent;
overflow: visible;
}
hr {
border: none;
border-top: 1px solid #1a1a1a;
height: 1px;
margin: 1em 0;
}
table {
margin: 1em 0;
border-collapse: collapse;
width: 100%;
overflow-x: auto;
display: block;
font-variant-numeric: lining-nums tabular-nums;
}
table caption {
margin-bottom: 0.75em;
}
tbody {
margin-top: 0.5em;
border-top: 1px solid #1a1a1a;
border-bottom: 1px solid #1a1a1a;
}
th {
border-top: 1px solid #1a1a1a;
padding: 0.25em 0.5em 0.25em 0.5em;
}
td {
padding: 0.125em 0.5em 0.25em 0.5em;
}
header {
margin-bottom: 4em;
text-align: center;
}
#TOC li {
list-style: none;
}
#TOC ul {
padding-left: 1.3em;
}
#TOC > ul {
padding-left: 0;
}
#TOC a:not(:hover) {
text-decoration: none;
}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: 1.5em;}
div.column{flex: auto;}
@media screen {
div.columns{gap: min(4vw, 1.5em);}
div.column{overflow-x: auto;}
}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for syntax highlighting */
html { -webkit-text-size-adjust: 100%; }
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { display: inline-block; line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
</head>
<body>
<header id="title-block-header">
<h1 class="title">Documentation - create_repo.sh</h1>
</header>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#create_repo.sh" id="toc-create_repo.sh">create_repo.sh</a>
<ul>
<li><a href="#à-quoi-ça-sert" id="toc-à-quoi-ça-sert">À quoi ça
sert</a></li>
<li><a href="#prérequis" id="toc-prérequis">Prérequis</a></li>
<li><a href="#utilisation" id="toc-utilisation">Utilisation</a>
<ul>
<li><a href="#exemple" id="toc-exemple">Exemple</a></li>
</ul></li>
<li><a href="#détail-du-fonctionnement"
id="toc-détail-du-fonctionnement">Détail du fonctionnement</a>
<ul>
<li><a href="#la-requête-envoyée" id="toc-la-requête-envoyée">La requête
envoyée</a></li>
</ul></li>
<li><a href="#codes-de-réponse-possibles"
id="toc-codes-de-réponse-possibles">Codes de réponse possibles</a></li>
<li><a href="#bonne-pratique-de-sécurité"
id="toc-bonne-pratique-de-sécurité">Bonne pratique de sécurité</a></li>
</ul></li>
</ul>
</nav>
<h1 id="create_repo.sh">create_repo.sh</h1>
<p>Script Bash qui <strong>crée un dépôt sur la forge</strong>
(<code>forge.gwenaelremond.fr</code>) en appelant son API REST.</p>
<h2 id="à-quoi-ça-sert">À quoi ça sert</h2>
<p>Plutôt que de retaper une longue commande <code>curl</code> à chaque
fois, le script prend le <strong>nom</strong> et la
<strong>description</strong> du dépôt en arguments, et lit le
<strong>token dauthentification</strong> dans une variable
denvironnement (pour ne jamais lécrire en dur dans le code).</p>
<h2 id="prérequis">Prérequis</h2>
<ul>
<li><code>curl</code> (installé par défaut sur macOS et Linux)</li>
<li>Un <strong>token daccès</strong> à la forge (Settings →
Applications → Generate New Token)</li>
</ul>
<h2 id="utilisation">Utilisation</h2>
<div class="sourceCode" id="cb1"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb1-1"><a href="#cb1-1" aria-hidden="true" tabindex="-1"></a><span class="co"># 1. Définir le token (une seule fois par session de terminal)</span></span>
<span id="cb1-2"><a href="#cb1-2" aria-hidden="true" tabindex="-1"></a><span class="bu">export</span> <span class="va">FORGE_TOKEN</span><span class="op">=</span><span class="st">&quot;ton_token&quot;</span></span>
<span id="cb1-3"><a href="#cb1-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb1-4"><a href="#cb1-4" aria-hidden="true" tabindex="-1"></a><span class="co"># 2. Lancer le script</span></span>
<span id="cb1-5"><a href="#cb1-5" aria-hidden="true" tabindex="-1"></a><span class="ex">./create_repo.sh</span> <span class="op">&lt;</span>nom_du_repo<span class="op">&gt;</span> <span class="pp">[</span><span class="st">&quot;description&quot;</span><span class="pp">]</span></span></code></pre></div>
<h3 id="exemple">Exemple</h3>
<div class="sourceCode" id="cb2"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="bu">export</span> <span class="va">FORGE_TOKEN</span><span class="op">=</span><span class="st">&quot;b103fb7f...&quot;</span></span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="ex">./create_repo.sh</span> exercice <span class="st">&quot;Adam&quot;</span></span></code></pre></div>
<p>Cela crée le dépôt <strong>exercice</strong> avec la description
<strong>Adam</strong>.</p>
<h2 id="détail-du-fonctionnement">Détail du fonctionnement</h2>
<table>
<colgroup>
<col style="width: 75%" />
<col style="width: 25%" />
</colgroup>
<thead>
<tr>
<th>Partie du script</th>
<th>Rôle</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>set -euo pipefail</code></td>
<td>Arrête le script à la moindre erreur (sécurité)</td>
</tr>
<tr>
<td>Vérification de <code>FORGE_TOKEN</code></td>
<td>Refuse de tourner si le token nest pas défini</td>
</tr>
<tr>
<td><code>REPO_NAME</code> / <code>REPO_DESC</code></td>
<td>Récupère les arguments passés en ligne de commande</td>
</tr>
<tr>
<td><code>curl -X POST .../api/v1/user/repos</code></td>
<td>Envoie la requête de création à lAPI</td>
</tr>
</tbody>
</table>
<h3 id="la-requête-envoyée">La requête envoyée</h3>
<p>Le script construit cette requête HTTP :</p>
<div class="sourceCode" id="cb3"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="ex">curl</span> <span class="at">-X</span> POST <span class="st">&quot;https://forge.gwenaelremond.fr/api/v1/user/repos&quot;</span> <span class="dt">\</span></span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Authorization: token </span><span class="va">$FORGE_TOKEN</span><span class="st">&quot;</span> <span class="dt">\</span></span>
<span id="cb3-3"><a href="#cb3-3" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;Content-Type: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb3-4"><a href="#cb3-4" aria-hidden="true" tabindex="-1"></a> <span class="at">-H</span> <span class="st">&quot;accept: application/json&quot;</span> <span class="dt">\</span></span>
<span id="cb3-5"><a href="#cb3-5" aria-hidden="true" tabindex="-1"></a> <span class="at">-d</span> <span class="st">&#39;{ &quot;name&quot;: &quot;exercice&quot;, &quot;description&quot;: &quot;Adam&quot; }&#39;</span></span></code></pre></div>
<h2 id="codes-de-réponse-possibles">Codes de réponse possibles</h2>
<table>
<thead>
<tr>
<th>Code HTTP</th>
<th>Signification</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>201</code></td>
<td>Dépôt créé avec succès</td>
</tr>
<tr>
<td><code>409</code></td>
<td>Un dépôt portant ce nom existe déjà</td>
</tr>
<tr>
<td><code>401</code></td>
<td>Token invalide ou manquant</td>
</tr>
</tbody>
</table>
<h2 id="bonne-pratique-de-sécurité">Bonne pratique de sécurité</h2>
<p>⚠️ <strong>Ne jamais écrire le token en clair</strong> dans le script
ni le commiter dans Git. Si un token a été exposé, le
<strong>révoquer</strong> et en générer un nouveau dans les paramètres
de la forge.</p>
</body>
</html>