diff --git a/.env b/.env deleted file mode 100644 index 2d0b136..0000000 --- a/.env +++ /dev/null @@ -1,5 +0,0 @@ -TARGET_DIR=./target -BUILD_TARGET=/srv/output -SITE_DIR=./site -NGINX_VERSION=1.27-alpine -NGINX_DOCUMENT_ROOT=/usr/share/nginx/html diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..935726c --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +@trash07 \ No newline at end of file diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..fece748 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,19 @@ +## Purpose + +Describe the purpose of the pull request and the changes made. + +## Related Issues + +List any related issues or tickets that this pull request addresses. + +## Changes Made + +Provide a detailed description of the changes made in this pull request, including any new features, bug + +## Change type + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected) +- [ ] Documentation update (changes to documentation only) +- [ ] Security fix (security vulnerability fix) diff --git a/.github/workflows/promote-to-rc.yml b/.github/workflows/promote-to-rc.yml new file mode 100644 index 0000000..153ded8 --- /dev/null +++ b/.github/workflows/promote-to-rc.yml @@ -0,0 +1,83 @@ +name: 2 | Promote to RC +on: + workflow_dispatch: +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ vars.NODE_JS_VERSION }} + cache: 'npm' + - name: Build static site + run: | + set -x + npm install + npm run build + - name: Save artifact + env: + REMOTE_FOLDER: '/home/github/dev/artifact/${{ github.repository }}/main' + run: | + set -x + ansible-playbook -i ci/ansible/inventory.ini \ + ci/ansible/playbooks/save-artifact.yml \ + --extra-vars="ansible_user=${{ secrets.ANSIBLE_USER }} ansible_password=${{ secrets.ANSIBLE_PASS }} current_directory=$(pwd) \ + remote_folder=${REMOTE_FOLDER}" + + deploy-to-dev: + needs: build + runs-on: ubuntu-latest + environment: + name: dev + url: https://${{ vars.HOST }} + steps: + - name: Login to hub.docker.com + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-buildx-action@v3 + - name: Download artifact + env: + REMOTE_FOLDER: '/home/github/dev/artifact/${{ github.repository }}/main' + run: | + sshpass -p "${{ secrets.ANSIBLE_PASS }}" scp -r -o "StrictHostKeyChecking=no" "${{secrets.ANSIBLE_USER}}"@tutoriel.dev:"${REMOTE_FOLDER}/artifact.tar.bz2" . + - name: Extract + run: tar -xjf artifact.tar.bz2 + - name: List + run: ls -la + - uses: cschleiden/replace-tokens@v1 + with: + files: '["ci/k8s/*.yml"]' + env: + ENV: ${{ vars.ENV }} + HOST: ${{ vars.HOST }} + - name: Check replacements + run: cat ci/k8s/*.yml + - name: Build and compress output + run: | + set -x + mkdir -p output/{k8s,public,nginx} + cp -fr ci/k8s/*.yml output/k8s + cp -fr ci/nginx/*.conf output/nginx + cp -fr public/* output/public + cp -f ci/Dockerfile output/Dockerfile + tar -cjf output.tar.bz2 -C output . + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: ./output + push: true + tags: lkpeto/tutoriel.dev:${{ vars.ENV }} + - name: Apply changes + env: + REMOTE_FOLDER: '/home/github/build/${{ github.repository }}/${{ github.run_id }}' + run: | + set -x + ansible-playbook -i ci/ansible/inventory.ini \ + ci/ansible/playbooks/deploy-output.yml \ + --extra-vars="ansible_user=${{ secrets.ANSIBLE_USER }} ansible_password=${{ secrets.ANSIBLE_PASS }} current_directory=$(pwd) \ + remote_folder=${REMOTE_FOLDER}" diff --git a/.github/workflows/publish-changes.yml b/.github/workflows/publish-changes.yml new file mode 100644 index 0000000..60cc0b1 --- /dev/null +++ b/.github/workflows/publish-changes.yml @@ -0,0 +1,58 @@ +name: 3 | Release changes +on: + workflow_dispatch: +jobs: + deploy-to-dev: + runs-on: ubuntu-latest + environment: + name: prod + url: https://${{ vars.HOST }} + steps: + - name: Login to hub.docker.com + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-buildx-action@v3 + - name: Download artifact + env: + REMOTE_FOLDER: '/home/github/dev/artifact/${{ github.repository }}/main' + run: | + sshpass -p "${{ secrets.ANSIBLE_PASS }}" scp -r -o "StrictHostKeyChecking=no" "${{secrets.ANSIBLE_USER}}"@tutoriel.dev:"${REMOTE_FOLDER}/artifact.tar.bz2" . + - name: Extract + run: tar -xjf artifact.tar.bz2 + - name: List + run: ls -la + - uses: cschleiden/replace-tokens@v1 + with: + files: '["ci/k8s/*.yml"]' + env: + ENV: ${{ vars.ENV }} + HOST: ${{ vars.HOST }} + - name: Check replacements + run: cat ci/k8s/*.yml + - name: Build and compress output + run: | + set -x + mkdir -p output/{k8s,public,nginx} + cp -fr ci/k8s/*.yml output/k8s + cp -fr ci/nginx/*.conf output/nginx + cp -fr public/* output/public + cp -f ci/Dockerfile output/Dockerfile + tar -cjf output.tar.bz2 -C output . + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: ./output + push: true + tags: lkpeto/tutoriel.dev:${{ vars.ENV }} + - name: Apply changes + env: + REMOTE_FOLDER: '/home/github/build/${{ github.repository }}/${{ github.run_id }}' + run: | + set -x + ansible-playbook -i ci/ansible/inventory.ini \ + ci/ansible/playbooks/deploy-output.yml \ + --extra-vars="ansible_user=${{ secrets.ANSIBLE_USER }} ansible_password=${{ secrets.ANSIBLE_PASS }} current_directory=$(pwd) \ + remote_folder=${REMOTE_FOLDER}" diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 0000000..42bf20d --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,90 @@ +name: 1 | Pull request +on: + pull_request: + types: + - opened + - reopened + - synchronize + branches: + - master + - feat/* +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ vars.NODE_JS_VERSION }} + cache: 'npm' + - name: Build static site + run: | + set -x + npm install + npm run build + - name: Save artifact + env: + REMOTE_FOLDER: '/home/github/dev/artifact/${{ github.repository }}/pull-request' + run: | + set -x + ansible-playbook -i ci/ansible/inventory.ini \ + ci/ansible/playbooks/save-artifact.yml \ + --extra-vars="ansible_user=${{ secrets.ANSIBLE_USER }} ansible_password=${{ secrets.ANSIBLE_PASS }} current_directory=$(pwd) \ + remote_folder=${REMOTE_FOLDER}" + + deploy-to-preview: + needs: build + runs-on: ubuntu-latest + environment: + name: preview + url: https://${{ vars.HOST }} + steps: + - name: Login to hub.docker.com + uses: docker/login-action@v3 + with: + username: ${{ secrets.DOCKER_USER }} + password: ${{ secrets.DOCKER_PASS }} + - uses: docker/setup-qemu-action@v3 + - uses: docker/setup-buildx-action@v3 + - name: Download artifact + env: + REMOTE_FOLDER: '/home/github/dev/artifact/${{ github.repository }}/pull-request' + run: | + sshpass -p "${{ secrets.ANSIBLE_PASS }}" scp -r -o "StrictHostKeyChecking=no" "${{secrets.ANSIBLE_USER}}"@tutoriel.dev:"${REMOTE_FOLDER}/artifact.tar.bz2" . + - name: Extract + run: tar -xjf artifact.tar.bz2 + - name: List + run: ls -la + - uses: cschleiden/replace-tokens@v1 + with: + files: '["ci/k8s/*.yml"]' + env: + ENV: ${{ vars.ENV }} + HOST: ${{ vars.HOST }} + - name: Check replacements + run: cat ci/k8s/*.yml + - name: Build and compress output + run: | + set -x + mkdir -p output/{k8s,public,nginx} + cp -fr ci/k8s/*.yml output/k8s + cp -fr ci/nginx/*.conf output/nginx + cp -fr public/* output/public + cp -f ci/Dockerfile output/Dockerfile + tar -cjf output.tar.bz2 -C output . + - name: Build and push + uses: docker/build-push-action@v6 + with: + context: ./output + push: true + tags: lkpeto/tutoriel.dev:${{ vars.ENV }} + - name: Apply changes + env: + REMOTE_FOLDER: '/home/github/build/${{ github.repository }}/${{ github.run_id }}' + run: | + set -x + ansible-playbook -i ci/ansible/inventory.ini \ + ci/ansible/playbooks/deploy-output.yml \ + --extra-vars="ansible_user=${{ secrets.ANSIBLE_USER }} ansible_password=${{ secrets.ANSIBLE_PASS }} current_directory=$(pwd) \ + remote_folder=${REMOTE_FOLDER}" diff --git a/.gitignore b/.gitignore index 5b6f425..f326502 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,4 @@ -/.idea/ -/site/_site/ -.jekyll-metadata -/ci/parameters.yml -/site/.jekyll-cache/ -/target/ +node_modules/ +.cache/ +public +/.idea/ \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 0000000..b7807b0 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1 @@ +npm run format \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..7f4cee5 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +node_modules/ +.cache/ +public +/.idea/ +package-lock.json +package.json \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..937375d --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "semi": true, + "singleQuote": true +} diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 6f05f38..0000000 --- a/Dockerfile +++ /dev/null @@ -1,3 +0,0 @@ -FROM nginx:1.27-alpine -COPY ./ /usr/share/nginx/html -EXPOSE 80 443 diff --git a/README.md b/README.md index 727f5db..b7d47ee 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,48 @@ -# tutoriel.dev -Small hobby blogging website located at [tutoriel.dev](https://tutoriel.dev) - -## Installing -To install this repository and contribute, follow these steps: - -### Install required software -* [Docker](https://www.docker.com/) -* [Docker Compose](https://docs.docker.com/compose/) -* [Bash](https://www.gnu.org/software/bash/) - -### Run start script -```bash -bash scripts.sh start -``` - -### Wait en enjoy -You need to wait small for all the containers to lunch and start running - -### Links -* Use `http://localhost:4000` to develop with live reload -* Use `http://localhost:8080` to see what it will be in prod. - -## Other task -To stop the server run the following task -```bash -bash scripts.sh stop -``` - -## Todos: -- [ ] Simplify the platform UI/UX -- [ ] Write more articles -- [ ] Automate all management tasks - -## Credits -* https://github.com/brianmaierjr/long-haul +
+
+
+
+
Aujourd'hui, le conteneurs nous ont envahi. Dans toutes les applications -vous avez de fortes chances de le voir. Si vous êtes impliqué dans le processus de développement d'une application, vous + +Aujourd'hui, le conteneurs nous ont envahi. Dans toutes les applications +vous avez de fortes chances de le voir. Si vous êtes impliqué dans le processus de développement d'une application, vous avez des chances de travailler à ce qu'il trouve chemin vers de cloud. Comment sommes-nous arrivés là? -
## La situation initiale + Initialement, le mode de développement des applications était simple: -* Vous avez un serveur de production, -* Vous developpez votre application en local, -* Vous testez votre travail, -* Vous assistez aux revues de votre code, -* Vous generez un executable unique **(monolitique)**, -* Vous **arrêtez tout le monde** et vous déployez votre application sur le serveur. - -Ça marchait bien et tout le monde était content. Sauf que certaines applications + +- Vous avez un serveur de production, +- Vous developpez votre application en local, +- Vous testez votre travail, +- Vous assistez aux revues de votre code, +- Vous generez un executable unique **(monolitique)**, +- Vous **arrêtez tout le monde** et vous déployez votre application sur le serveur. + +Ça marchait bien et tout le monde était content. Sauf que certaines applications ont été victimes de leur propres succès. Je m'en vais vous donner un exemple: **Gmail**. Imaginez que vous êtes de developpeur de l'application Gmail. Elle a connu du succès. Aujourd'hui vous avez disons **100.000 utilisateurs**. Un succès n'est-ce pas ? Tout le monde vous félicite de gauche à droite mais il y a un petit soucis: **vous avez une -liste de nouvelles fonctionalités à ajouter**. Vous avez developpé en local les nouvelles mises +liste de nouvelles fonctionalités à ajouter**. Vous avez developpé en local les nouvelles mises à jours, la procédure est respectée mais vous êtes frustrés de déployer. -Pourquoi ? +Pourquoi ? Vous pensez à ce qui peut arriver après le déployement. Les raisons: -* Que se passera-t-il quand **vous allez arrêter l'application** pour faire déployement ? -* Que se passera-t-il quand **une partie de l'application sera touché par un bug** ? -* Que se passera-t-il quand **quand l'application aura besoin d'encore plus de ressources** ? +- Que se passera-t-il quand **vous allez arrêter l'application** pour faire déployement ? +- Que se passera-t-il quand **une partie de l'application sera touché par un bug** ? +- Que se passera-t-il quand **quand l'application aura besoin d'encore plus de ressources** ? De toutes les façons, ces quelques scénarios ne sont pas avantageuses pour votre business. -Si vous arrêtez l'application alors qu'un utilisateur est entrain de sévèrement l'utiliser, +Si vous arrêtez l'application alors qu'un utilisateur est entrain de sévèrement l'utiliser, vous risquez de perdre des clients. Lorsque vous changerez une ligne de code dans l'application, vous devez redéployer. Quand le serveur aura besoin de plus de resources, vous êtes encore dans -de nouveaux problèmes. +de nouveaux problèmes. ## Les inconvenient du monolitique + Comme vous l'avez vu, le monolitique pose les problèmes suivants: -* Les différents composants de l'application sont étroitement liées, -* Le moins de réutilisation, -* Le code devient plus complexe, -* L'application sera moins évolutive, -* L'application ne respecte pas le principe de la responsabilité unique, -* Des déployements fréquents et les redémarrages fréquents + +- Les différents composants de l'application sont étroitement liées, +- Le moins de réutilisation, +- Le code devient plus complexe, +- L'application sera moins évolutive, +- L'application ne respecte pas le principe de la responsabilité unique, +- Des déployements fréquents et les redémarrages fréquents ### Des composants étroitement liées -Les applications monolitiques ont souvant des composants étroitement liés **(Tight coupling)**. + +Les applications monolitiques ont souvant des composants étroitement liés **(Tight coupling)**. Cela voudrait dire que modifier une partie de l'application peut impacter plusieurs autres. -Dans ce cas, vous allez vous retrouver à répercuter et régler les problèmes causés par vos +Dans ce cas, vous allez vous retrouver à répercuter et régler les problèmes causés par vos modifications. ### Des composants moins réutilisable -Dans une plateforme monolitique, avec le temps, vous allez vous retrouver à dupliquer certains -composants en vue de répondre à certains besoins. - - - +Dans une plateforme monolitique, avec le temps, vous allez vous retrouver à dupliquer certains +composants en vue de répondre à certains besoins. diff --git a/site/_posts/2022-09-30-exposer-une-application-locale-sur-internet.markdown b/mdx/2022-09-30-exposer-une-application-locale-sur-internet.mdx similarity index 54% rename from site/_posts/2022-09-30-exposer-une-application-locale-sur-internet.markdown rename to mdx/2022-09-30-exposer-une-application-locale-sur-internet.mdx index 7ec8fbe..1918519 100644 --- a/site/_posts/2022-09-30-exposer-une-application-locale-sur-internet.markdown +++ b/mdx/2022-09-30-exposer-une-application-locale-sur-internet.mdx @@ -1,167 +1,173 @@ --- -layout: post -title: "Comment exposer une application locale sur internet ?" -date: 2022-09-30 +title: 'Comment exposer une application locale sur internet ?' +slug: comment-exposer-une-application-locale-sur-internet +date: 2022-09-30 +author: lkpeto --- -Des fois, en développant les applications, -vous vous retrouvez dans une situation où vous auriez voulu donner une adresse IP publique à votre + +Des fois, en développant les applications, +vous vous retrouvez dans une situation où vous auriez voulu donner une adresse IP publique à votre application locale. -
## Mise en situation + Vous avez une application qui s'exécute sur votre machine locale et vous voulez qu'un collègue qui est très loins de vous puisse avoir accès à votre machine locale depuis internet. Ou bien vous êtes entrain de développer une application en locale mais on vous demande une adresse -IP publique alors que vous ne l'avez pas encore. +IP publique alors que vous ne l'avez pas encore. Dans ces situations, comment procédez-vous ? C'est ce que nous allons voir dans cet article. ## Plan de travail + Dans cet article, nous allons procéder ainsi: -* Initialiser un petit projet express.js, -* Exécuter le projet express.js, -* Exposer le projet sur internet, -* Faire les tests. + +- Initialiser un petit projet express.js, +- Exécuter le projet express.js, +- Exposer le projet sur internet, +- Faire les tests. ### Initialiser un projet express.js -Avant d'initialiser le projet [express.js](https://expressjs.com/), vous avez besoin d'avoir -[Node.JS](https://nodejs.org/en/) installé. Pour vérifier que votre installation de Node.JS + +Avant d'initialiser le projet [express.js](https://expressjs.com/), vous avez besoin d'avoir +[Node.JS](https://nodejs.org/en/) installé. Pour vérifier que votre installation de Node.JS a réussi, tapez les commandes qui suivent dans votre terminal. Je vous laisse -{%- highlight bash -%} +```bash $ node -v && npm -v -{%- endhighlight -%} +``` -{%- highlight bash %} -v16.17.0 +```bash +v16.17.0 8.15.0 -{%- endhighlight -%} +``` La sortie montre que ma version de Node.Js est le **v16.17.0** et la version du **npm** est le **8.15.0**. Pour initialiser un projet d'exemple, nous allons créer un dossier nommé **exposition** et utiliser la commande **npm init**. -{%- highlight bash %} +```bash $ mkdir exposition $ cd exposition $ npm init -y -{%- endhighlight -%} +``` Dans la commande précédente, l'option **-y** permet d'accepter toutes les options par défaut. Enlevez-la si vous souhaitez répondre à toutes les questions vous même. Si tout se passe bien, vous aurez dans le dossier _exposition_ un fichier _package.json_ -{%- highlight json %} - { - "name": "exposition", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC" - } -{%- endhighlight -%} - -Ensuite, on installe express, on crée le dossier **src** et on crée un fichier **index.js** - -{%- highlight bash %} -$ npm install express + +```json +{ + "name": "exposition", + "version": "1.0.0", + "description": "", + "main": "index.jsx", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC" +} +``` + +Ensuite, on installe express, on crée le dossier **src** et on crée un fichier **index.jsx** + +```bash +$ npm install express $ mkdir src $ cd src/ -$ touch index.js -{%- endhighlight -%} +$ touch index.jsx +``` -Dans le fichier **src/index.js** du dossier **exposition**, on va mettre le contenu suivant: +Dans le fichier **src/index.jsx** du dossier **exposition**, on va mettre le contenu suivant: -{%- highlight javascript %} +```javascript // intialiser express -const express = require('express') -const app = express() -const port = 3000 +const express = require('express'); +const app = express(); +const port = 3000; // au lancement de l'application retourner 'Hello, World' app.get('/', (req, res) => { - res.send('Hello World!') -}) + res.send('Hello World!'); +}); // lancer l'application sur le port 3000 app.listen(port, () => { - console.log(`Example app listening on port ${port}`) -}) -{%- endhighlight -%} + console.log(`Example app listening on port ${port}`); +}); +``` -Une dernière configuration avant de lancer l'application serait d'aller dans le fichier -**package.json** et de remplacer la ligne où il y a **"main": "index.js"** par -**"main": "src/index.js"** et d'ajouter dans le bloc **scripts** la ligne -**"start": "node src/index.js"**. Le fichier **package.json** final ressemblera à ce qui suit. +Une dernière configuration avant de lancer l'application serait d'aller dans le fichier +**package.json** et de remplacer la ligne où il y a **"main": "index.jsx"** par +**"main": "src/index.jsx"** et d'ajouter dans le bloc **scripts** la ligne +**"start": "node src/index.jsx"**. Le fichier **package.json** final ressemblera à ce qui suit. -{%- highlight json -%} +```json { - "name": "exposition", - "version": "1.0.0", - "description": "", - "main": "src/index.js", - "scripts": { - "start": "node src/index.js", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "express": "^4.18.1" - } + "name": "exposition", + "version": "1.0.0", + "description": "", + "main": "src/index.jsx", + "scripts": { + "start": "node src/index.jsx", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "express": "^4.18.1" + } } -{%- endhighlight -%} +``` Maintenant, vous pouvez lancer l'application en tapant la commande **npm start** -{%- highlight bash -%} +```bash $ npm start > exposition@1.0.0 start -> node src/index.js +> node src/index.jsx Example app listening on port 3000 -{%- endhighlight -%} +``` Cette sortie montre que l'application s'exécute bien sur le port **3000** de notre machine locale. ### Exposer le projet sur internet -Nous voici maintenant au point important. Pour exposer le projet sur internet, vous avez + +Nous voici maintenant au point important. Pour exposer le projet sur internet, vous avez besoin d'un outils qui s'appelle [localtunnel](https://localtunnel.github.io/www/). Pour l'installer comme une application, tapez la commande qui suit: -{%- highlight bash -%} +```bash $ npm install -g localtunnel -{%- endhighlight -%} +``` -Une fois que l'installation a marché, vous êtes maintenant prêt à l'exposer au monde par +Une fois que l'installation a marché, vous êtes maintenant prêt à l'exposer au monde par internet. -Pour ce faire nous allons utiliser la commande **lt --port** et comme l'application est +Pour ce faire nous allons utiliser la commande **lt --port** et comme l'application est lancée sur le port **3000** on aura le résutat ci-dessous. -{%- highlight bash -%} +```bash lt --port 3000 your url is: https://two-dryers-shine-160-242-200-188.loca.lt -{%- endhighlight -%} +``` Le résultat montre que l'application est accessible sur internet sur le **https://two-dryers-shine-160-242-200-188.loca.lt** ## En résumé -Pour exposer une application locale en ligne, vous devez avoir ces prérequis: -* Avoir une application qui se lance en local sur un port donné _(Pour nous express.js sur le port 3000)_ -* Avoir Node.Js installé -* Installer **localtunel** -* Tapez la commande `lt --portDans ce tutoriel, nous allons voir comment installer + +Dans ce tutoriel, nous allons voir comment installer un serveur d'intégration continue Jenkins à partir de docker-compose -
## Prérequis + Pour bien suivre ce tutoriel, vous avez besoin d'avoir docker et docker-compose installés. Si vous ne les avez pas suivez les liens qui suivent pour: -* installer [docker](https://docs.docker.com/engine/install/) -* installer [docker-compose](https://docs.docker.com/compose/install/) + +- installer [docker](https://docs.docker.com/engine/install/) +- installer [docker-compose](https://docs.docker.com/compose/install/) Ce tutoriel suppose également que vous ayez une idée de ce que sont les concepts suivants: -* docker, -* docker-compose, -* jenkins, -* le fichier docker-compose.yml + +- docker, +- docker-compose, +- jenkins, +- le fichier docker-compose.yml ## Plan de travail + Voici comment nous allons procéder: -* Vérification des installations de docker et docker-compose -* Constitution du fichier docker-compose.yml -* Installation de l'application -## docker et docker-compose +- Vérification des installations de docker et docker-compose +- Constitution du fichier docker-compose.yml +- Installation de l'application + +## docker et docker-compose + Dans ce tutoriel nous allons utiliser des versions de docker et de docker-compose qui ne sont pas les plus récentes. -{%- highlight bash -%} +```bash $ sudo docker --version && sudo docker-compose --version Docker version 20.10.12, build 20.10.12-0ubuntu4 docker-compose version 1.29.2, build unknown -{%- endhighlight -%} +``` Si vous utilisez une version récente de docker qui embarque compose vous n'avez qu'à remplacer -{%- highlight bash -%} +```bash $ sudo docker-composeNous sommes un groupe d'informaticiens qui vous apporte des tutoriels sur vos écrans.
-Notre but est de vous apporter des tutoriels en programmation, bases de données, administration systèmes
-{%- if post.description -%}{{ post.description | strip_html | strip_newlines | truncate: 120 }}{%- else -%}{{ post.content | strip_html | strip_newlines | truncate: 120 }}{%- endif -%}
-| t |
Contact: hello@tutoriel.dev
-Twitter: @lkpeto
-Tutoriels en programmation, bases de données, administration systèmes
-Lorem ipsum thor smash liege-bastogne-liege landbouwkrediet ombregt krabbe, rouleur derby is for lovers bonk giro gilbert bidon. Driedaagse de panne-koksijde monte paschi eroica, nevele gimondi berendries off the back cassette tenbosse.
- -Bahamontes lanterne rouge normandie belgium. Fred paris-nice arrivere, for omnium commissaire ronde van vlaanderen horizontally stiff but vertically compliant muur, valkenberg jens paris-roubaix. Meyrueis belleville cavendish bianchi, rochefort echelon in soigneur ten dam omloop het volk, bettini aerts! Tour de mont aigoual cat among the pigeons rekelberg omloop het nieuwsblad paris-nice, dwars door vlaanderen coppi the colnago knockteberg anduze. - -Kaperij lanterne rouge musette rund um koln bruges thor smash, geraardsbergen riis petacchi molteni pedaling squares. Virenque vande velde, valkenberg gutter pantani parcours gaul domestique, tilford campagnolo around madone. Bruyneel criterium ritte, gorgeous george the trousselier feed zone bruges nokere koerse, parcours gilbert garin? Anquetil valkenberg bettini cat among the pigeons. - -Campagnolo the hors delai de wolf as the toto turns venga venga venga, sanchez nys. Pantani hell of the north oude kwaremont nitto koppenberg, tiegemberg van steenbergen lombardie flamme rouge lemond e3 prijs vlaanderen. - -Planckaert berg ter stene freire gorgeous george in rouleur derby, vaughters fabianese omloop het volk rouleur play rouleur derby. Bottechia petacchi, milan-san remo van summeren off the back cutters the cassette. - -Nyvelocity pyrenees vande velde merckx. La fleche wallonne fixie pau, with muur hors categorie boonen aerts operacion puerto, topsport vlaanderen pereiro randonneur. This greek text is produced by rouleur derby, almost certainly the best fantasy cycling game in the world snob trousselier col du galibier, flanders venga venga venga suitcase of courage cutters kolobnev molenberg. \ No newline at end of file diff --git a/site/example-posts/2014-12-11-image-in-post.markdown b/site/example-posts/2014-12-11-image-in-post.markdown deleted file mode 100755 index 61aed18..0000000 --- a/site/example-posts/2014-12-11-image-in-post.markdown +++ /dev/null @@ -1,19 +0,0 @@ ---- -layout: post -title: "Image in Post" -date: 2014-12-11 ---- - -Lorem ipsum thor smash liege-bastogne-liege landbouwkrediet ombregt krabbe, rouleur derby is for lovers bonk giro gilbert bidon. Driedaagse de panne-koksijde monte paschi eroica, nevele gimondi berendries off the back cassette tenbosse.
- -Bahamontes lanterne rouge normandie belgium. Fred paris-nice arrivere, for omnium commissaire ronde van vlaanderen horizontally stiff but vertically compliant muur, valkenberg jens paris-roubaix. Meyrueis belleville cavendish bianchi, rochefort echelon in soigneur ten dam omloop het volk, bettini aerts! Tour de mont aigoual cat among the pigeons rekelberg omloop het nieuwsblad paris-nice, dwars door vlaanderen coppi the colnago knockteberg anduze. - -
-
-Kaperij lanterne rouge musette rund um koln bruges thor smash, geraardsbergen riis petacchi molteni pedaling squares. Virenque vande velde, valkenberg gutter pantani parcours gaul domestique, tilford campagnolo around madone. Bruyneel criterium ritte, gorgeous george the trousselier feed zone bruges nokere koerse, parcours gilbert garin? Anquetil valkenberg bettini cat among the pigeons.
-
-Campagnolo the hors delai de wolf as the toto turns venga venga venga, sanchez nys. Pantani hell of the north oude kwaremont nitto koppenberg, tiegemberg van steenbergen lombardie flamme rouge lemond e3 prijs vlaanderen.
-
-Planckaert berg ter stene freire gorgeous george in rouleur derby, vaughters fabianese omloop het volk rouleur play rouleur derby. Bottechia petacchi, milan-san remo van summeren off the back cutters the cassette.
-
-Nyvelocity pyrenees vande velde merckx. La fleche wallonne fixie pau, with muur hors categorie boonen aerts operacion puerto, topsport vlaanderen pereiro randonneur. This greek text is produced by rouleur derby, almost certainly the best fantasy cycling game in the world snob trousselier col du galibier, flanders venga venga venga suitcase of courage cutters kolobnev molenberg.
diff --git a/site/example-posts/2014-12-12-figure-with-caption.markdown b/site/example-posts/2014-12-12-figure-with-caption.markdown
deleted file mode 100755
index a1cee94..0000000
--- a/site/example-posts/2014-12-12-figure-with-caption.markdown
+++ /dev/null
@@ -1,30 +0,0 @@
----
-layout: post
-title: "Figure With A Caption"
-date: 2014-12-12
----
-
-
-Lorem ipsum thor smash liege-bastogne-liege landbouwkrediet ombregt krabbe, rouleur derby is for lovers bonk giro gilbert bidon. Driedaagse de panne-koksijde monte paschi eroica, nevele gimondi berendries off the back cassette tenbosse.
- -Bahamontes lanterne rouge normandie belgium. Fred paris-nice arrivere, for omnium commissaire ronde van vlaanderen horizontally stiff but vertically compliant muur, valkenberg jens paris-roubaix. Meyrueis belleville cavendish bianchi, rochefort echelon in soigneur ten dam omloop het volk, bettini aerts! Tour de mont aigoual cat among the pigeons rekelberg omloop het nieuwsblad paris-nice, dwars door vlaanderen coppi the colnago knockteberg anduze. - -
-
- You'll find this post in your `_posts` directory - edit this post and re-build (or run with the `-w` switch) to see your changes! To add new posts, simply add a file in the `_posts` directory that follows the convention: YYYY-MM-DD-name-of-post.ext.
- -Jekyll also offers powerful support for code snippets: - -{%- highlight ruby -%} -def print_hi(name) - puts "Hi, #{name}" -end -print_hi('Tom') -#=> prints 'Hi, Tom' to STDOUT. -{%- endhighlight -%} - -{%- highlight java -%} - import java.util.*; - class Personne { - private Integer id; - - public Integer getId() { - return this.id; - } - } -{%- endhighlight -%} - -Check out the [Jekyll docs][jekyll] for more info on how to get the most out of Jekyll. File all bugs/feature requests at [Jekyll's GitHub repo][jekyll-gh]. - -[jekyll-gh]: https://github.com/mojombo/jekyll -[jekyll]: http://jekyllrb.com diff --git a/site/example-posts/2014-12-14-featured-image.markdown b/site/example-posts/2014-12-14-featured-image.markdown deleted file mode 100755 index 0cea4b4..0000000 --- a/site/example-posts/2014-12-14-featured-image.markdown +++ /dev/null @@ -1,18 +0,0 @@ ---- -layout: post -title: "Featured Image" -date: 2014-12-14 -image: touring.jpg ---- - -Lorem ipsum thor smash liege-bastogne-liege landbouwkrediet ombregt krabbe, rouleur derby is for lovers bonk giro gilbert bidon. Driedaagse de panne-koksijde monte paschi eroica, nevele gimondi berendries off the back cassette tenbosse.
- -Bahamontes lanterne rouge normandie belgium. Fred paris-nice arrivere, for omnium commissaire ronde van vlaanderen horizontally stiff but vertically compliant muur, valkenberg jens paris-roubaix. Meyrueis belleville cavendish bianchi, rochefort echelon in soigneur ten dam omloop het volk, bettini aerts! Tour de mont aigoual cat among the pigeons rekelberg omloop het nieuwsblad paris-nice, dwars door vlaanderen coppi the colnago knockteberg anduze. - -Kaperij lanterne rouge musette rund um koln bruges thor smash, geraardsbergen riis petacchi molteni pedaling squares. Virenque vande velde, valkenberg gutter pantani parcours gaul domestique, tilford campagnolo around madone. Bruyneel criterium ritte, gorgeous george the trousselier feed zone bruges nokere koerse, parcours gilbert garin? Anquetil valkenberg bettini cat among the pigeons. - -Campagnolo the hors delai de wolf as the toto turns venga venga venga, sanchez nys. Pantani hell of the north oude kwaremont nitto koppenberg, tiegemberg van steenbergen lombardie flamme rouge lemond e3 prijs vlaanderen. - -Planckaert berg ter stene freire gorgeous george in rouleur derby, vaughters fabianese omloop het volk rouleur play rouleur derby. Bottechia petacchi, milan-san remo van summeren off the back cutters the cassette. - -Nyvelocity pyrenees vande velde merckx. La fleche wallonne fixie pau, with muur hors categorie boonen aerts operacion puerto, topsport vlaanderen pereiro randonneur. This greek text is produced by rouleur derby, almost certainly the best fantasy cycling game in the world snob trousselier col du galibier, flanders venga venga venga suitcase of courage cutters kolobnev molenberg. diff --git a/site/example-posts/2014-12-15-example-post-formatting.markdown b/site/example-posts/2014-12-15-example-post-formatting.markdown deleted file mode 100755 index 1e356f5..0000000 --- a/site/example-posts/2014-12-15-example-post-formatting.markdown +++ /dev/null @@ -1,65 +0,0 @@ ---- -layout: post -title: "Example Post Formatting" -date: 2014-12-15 -description: This is a post description for meta purposes. This is also the excerpt of the article that shows up on the index/home page. Change this in the post YAML. ---- - -Curabitur blandit tempus porttitor. Nullam quis risus eget urna mollis ornare vel eu leo. Vestibulum id ligula porta felis euismod semper. Donec sed odio dui. Aenean lacinia bibendum nulla sed consectetur.
- -# Heading 1 - -## Heading 2 - -### Heading 3 - -#### Heading 4 - -##### Heading 5 - -###### Heading 6 - -Aenean lacinia bibendum nulla sed consectetur. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Cras mattis consectetur purus sit amet fermentum. Nulla vitae elit libero, a pharetra augue. Curabitur blandit tempus porttitor. Donec sed odio dui. Cras mattis consectetur purus sit amet fermentum.- -Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. - -## Unordered List -* List Item -* Longer List Item - * Nested List Item - * Nested Item -* List Item - -## Ordered List -1. List Item -2. Longer List Item - 1. Nested OL Item - 2. Another Nested Item -3. List Item - -## Definition List -
{%- if post.description -%}{{ post.description }}{%- else -%}{{ post.excerpt | strip_html }}{%- endif -%}
-