diff --git a/images/c4s-jenkins.png b/images/c4s-jenkins.png new file mode 100644 index 0000000..3c12a92 Binary files /dev/null and b/images/c4s-jenkins.png differ diff --git a/images/c4s-jenkinsjob.png b/images/c4s-jenkinsjob.png new file mode 100644 index 0000000..34d429d Binary files /dev/null and b/images/c4s-jenkinsjob.png differ diff --git a/images/jenkins-base.png b/images/jenkins-base.png new file mode 100644 index 0000000..88f8395 Binary files /dev/null and b/images/jenkins-base.png differ diff --git a/images/logo.png b/images/logo.png deleted file mode 100644 index b5985fd..0000000 Binary files a/images/logo.png and /dev/null differ diff --git a/slides.ipynb b/slides.ipynb index 2125076..7de9ea2 100644 --- a/slides.ipynb +++ b/slides.ipynb @@ -1,176 +1,310 @@ { "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "cd ../so-workshop" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# So, you want to go open Science ?\n", "## WORKSHOP TIME !\n", "\n", - "<br/><br/>\n", - "![](./images/logo.png)\n", - "<br/><br/>\n", - "\n", "<center>SCITAS training with expertise from the EPFL Library</center>\n", + "\n", "<center>Nicolas Richart and Jean-Baptiste Aubort - SCITAS</center>" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ - "## Continuous Integration" + "# Continuous Integration (CI)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { - "slide_type": "subslide" + "slide_type": "fragment" } }, "source": [ - "### What is CI ?\n", + "## What is CI ?\n", + "\n", + "- Automation of build and tests\n", "- Run tests at each commit\n", + "- You need to write tests !" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "fragment" + } + }, + "source": [ + "## Why use CI ?\n", + "\n", "- Detect bugs when they are introduced\n", - "- Detect when fixed bugs appear again (regression)" + "- Detect when fixed bugs appear again (regression)\n", + "- Publish code that works" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { - "slide_type": "subslide" + "slide_type": "fragment" } }, "source": [ - "### What else ?\n", "Ensure code has a certain quality level\n", - "- Linter\n", + "- Linters\n", "- Test Coverage" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ + "# Jenkins on c4science" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## https://c4science.ch/jobs\n", + "![](images/c4s-jenkinsjob.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "## https://jenkins.c4science.ch/\n", + "![](images/c4s-jenkins.png)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "slide" + } + }, + "source": [ + "# Example\n", "## Jenkins base" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ + "Already up to date.\n", "Already on 'feature/jenkins-base'\n", - "Your branch is up to date with 'origin/feature/jenkins-base'.\n" + "Your branch is up to date with 'origin/feature/jenkins-base'.\n", + "\u001b[01;34m.\u001b[00m\n", + "├── \u001b[01;34mcode\u001b[00m\n", + "│ ├── mylib.py\n", + "│ └── \u001b[01;32mtest.py\u001b[00m\n", + "├── Jenkinsfile\n", + "└── README\n", + "\n", + "1 directory, 4 files\n" ] } ], "source": [ - "git checkout feature/jenkins-base" + "git pull\n", + "git checkout feature/jenkins-base\n", + "tree" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#!/usr/bin/env python3\n", + "\n", + "class MyLib():\n", + "\n", + " def __init__(self):\n", + " pass\n", + "\n", + " def MyFunc(self):\n", + " return 'test'\n", + "\n", + "if __name__ == '__main__':\n", + " pass\n" + ] + } + ], + "source": [ + "cat code/mylib.py" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "#!/usr/bin/env python3\n", + "import unittest, pytest\n", + "import mylib\n", + "\n", + "class Test(unittest.TestCase):\n", + "\n", + " def test_return(self):\n", + " m = mylib.MyLib()\n", + " self.assertTrue(m.MyFunc() == 'test')\n", + "\n", + "if __name__ == '__main__':\n", + " pytest.main(['./test.py'])\n" + ] + } + ], + "source": [ + "cat code/test.py" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "slideshow": { "slide_type": "subslide" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "pipeline {\n", "\n", " agent {\n", " docker {\n", " image 'python:3.7'\n", " }\n", " }\n", "\n", " environment {\n", " HOME = \"$WORKSPACE\"\n", " }\n", "\n", " stages {\n", " stage('install dependencies') {\n", " steps {\n", " sh 'pip3 install --user pytest'\n", " }\n", " }\n", " stage('run tests') {\n", " steps {\n", " sh '$HOME/.local/bin/pytest code/test.py'\n", " }\n", " }\n", " }\n", "\n", "}\n" ] } ], "source": [ - "cat ../Jenkinsfile" + "cat Jenkinsfile" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "slideshow": { + "slide_type": "subslide" + } + }, + "source": [ + "![](images/jenkins-base.png)" ] } ], "metadata": { "celltoolbar": "Slideshow", "kernelspec": { "display_name": "Bash", "language": "bash", "name": "bash" }, "language_info": { "codemirror_mode": "shell", "file_extension": ".sh", "mimetype": "text/x-sh", "name": "bash" }, "livereveal": { "height": 768, "theme": "serif", "transition": "none", "width": 1024 } }, "nbformat": 4, "nbformat_minor": 2 }