Introducción

1

Lo que aprenderás sobre DevOps con GitLab

2

¿Qué es Devops?

3

El ciclo de vida del Devops

4

Introducción a Gitlab

5

Gitlab vs Github

Administración

6

Autenticación

7

Grupos

8

Autorización

9

Auditoría

10

Proyectos

Planificación

11

Tipos de desarrollo

12

Planificación en Gitlab-Issues

13

Planificación en Gitlab-Etiquetas

14

Planificación en Gitlab-Pesos

15

Planificación en Gitlab-Milestones

16

Planificación en Gitlab-Boards

17

Planificación en Gitlab-Service Desk

18

Planificación en Gitlab-Quick actions

Verificación

19

Inicialización del repositorio

20

Merge requests

21

Profundizando en Merge requests

22

Continuous Integration-CI

23

Gitlab CI

24

Automatizacion con GitLab Cl

25

Validacion de la configuracion con GitLab Cl

26

gitlab-ci.yml

27

Gitlab pages

28

Implementando Gitlab pages

29

¿Qué es el Desarrollo Ágil?

30

Gitlab autodevops

31

Implementando GitLab autodevops

32

Habilitando autodevops

Empaquetación

33

Gitlab container registry

34

Introducción a contenedores

Seguridad

35

Introducción a DevSecOps

36

Firmas de seguridad

37

Pruebas estáticas de seguridad

38

Escaneo de contenedores

39

Escaneo de dependencias

40

Pruebas dinámicas de seguridad

41

Gitlab security dashboard

Distribución

42

Continuous Delivery (CD)

43

Ambientes

44

Review apps

45

Estrategias de Distribución

46

Feature Flags

47

Rollback

Monitoreo

48

¿Por qué monitorear?

49

Métricas de desempeño (performance metrics)

50

Métricas de salud (health metrics)

51

Metricas de equipo

52

Rastreo de errores

Conclusiones

53

¿Por qué desarrollar con Gitlab?

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Validacion de la configuracion con GitLab Cl

25/53
Recursos

Aportes 27

Preguntas 16

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Linter Gitlab CI
https://gitlab.com/<group>/<project_name>/-/ci/lint

Con un proyecto hecho en React con create-react-app

Modifique el package.json

{
  "name": "gitlab",
  "version": "0.1.0",
  "private": true,
  "dependencies": {
    "react": "^16.9.0",
    "react-dom": "^16.9.0",
    "react-scripts": "3.1.1"
  },
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "test:ci": "react-scripts test --watchAll=false",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": "react-app"
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}```

Archivo `gitlab-ci.yml`

```yml
image: node:10.16-alpine

stages:
  - install
  - test

job-install:
  stage: install
  script:
    - npm install
  artifacts:
    expire_in: 1hr
    paths:
      - node_modules/
  cache:
    paths:
      - node_modules/

job-test:
  stage: test
  dependencies:
    - job-install
  script:
    - npm run test:ci

Algo base, me imagino que hay de ver cosas mas PRO

image: node:10.17.0
stages:
  - install
  - test
install-dependencies:
  stage : install
  script:
    - npm install
    - npm install --save-dev puppeteer
  artifacts:
    expire_in: 1hr
    paths: 
      - node_modules/
  cache: 
     paths:
      - node_modules/
test-apps:
  stage: test
  variables:
    CHROME_BIN: google-chrome
  dependencies:
   - install-dependencies
  before_script:
   - apt-get update && apt-get install -y apt-transport-https
   - wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | apt-key add -
   - sh -c 'echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
   - apt-get update && apt-get install -y google-chrome-stable
  script:
   - npm run test:ci

Buenas, he tratado de aplicar los paso como lo indica y no me funcionaron, y me imagino que por el tiempo que fue grabado debe llevar como un años.

Para que le funciones la configuración del CI con angular Angular CLI: 10.0.6

el fichero .gitlab-ci.yml debe tener una ligeras modificaciones:

image: node:12.18.3
stages:
  - install
  - test

install-dependencies:
  stage: install
  script:
    - npm install
  artifacts:
    expire_in: 1hr
    paths:
      - node_modules/
  cache:
    paths:
      - node_modules/

test-apps:
  stage: test
  variables:
    CHROME_BIN: google-chrome
  dependencies:
    - install-dependencies
  before_script:
    - apt-get update && apt-get install -y apt-transport-https
    - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
    - sh -c 'echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
    - apt-get update && apt-get install -y google-chrome-stable
  script:
    - npm run test:ci

Y el el fichero package.json cambiar el test:ci por:

"test:ci": "ng test --no-watch --no-progress --browsers=ChromeHeadlessCI",

así debería funcionar sin ningún error.

con esta linea en package.json

    "test:ci": "ng test --watch=false --browsers=ChromeHeadlessNoSandbox",

y esta version del gitlab-ci, funciono sin problema,

image: node:12.18.3
stages:
  - install
  - test

install-dependencies:
  stage: install
  script:
    - npm install
  artifacts:
    expire_in: 1hr
    paths:
      - node_modules/
  cache:
    paths:
      - node_modules/

test-apps:
  stage: test
  variables:
    CHROME_BIN: google-chrome
  dependencies:
    - install-dependencies
  before_script:
    - apt-get update && apt-get install -y apt-transport-https
    - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
    - sh -c 'echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
    - apt-get update && apt-get install -y google-chrome-stable
  script:
    - npm run test:ci

Con estas configuraciones funciona perfectamente el pipeline

Karma.conf.js

 browsers: ["Chrome", "ChromeHeadless", "ChromeHeadlessCI"],
    customLaunchers:{
        ChromeHeadlessCI: {
          base: 'ChromeHeadless',
          flags: ['--no-sandbox']
        }
    },

package.json

"test:ci": "ng test --no-watch --browsers=ChromeHeadlessCI",

.gitlab-ci.yml

image: node:14.15.4
stages:
  - install
  - test

install-dependencies:
  stage: install
  script:
    - npm install
  artifacts:
    expire_in: 1hr
    paths:
      - node_modules
  cache:
    paths:
      - node_modules

test-apps: 
  stage: test
  variables:
      CHROME_BIN: google-chrome
  dependencies:
    - install-dependencies
  before_script:
    - apt-get update && apt-get install -y apt-transport-https
    - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
    - sh -c 'echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
    - apt-get update && apt-get install -y google-chrome-stable
  script:
    - npm run test:ci

Qué sucede cuando hay distintas versiones de .gitlab-ci.yml en cada rama. Se utilizan las opciones de skip-ci en el commit? Alguna sugerencia de cómo gestionarlo por favor

<---------------------------------------------------------------------
ITERACCION BASICA:
---------------------------------------------------------------------

    1. CREAR REPO

    2. EN LOCAL ENTRAR AL DIRECTORIO DEL PROYECTO

    3. EJECUTAR: 
        - git init
        - git config --global user.name "Dany Pascual Gómez Sánchez"
        - git config --global user.email "[email protected]"
        - git remote add origin [email protected]com:personal0713/helloworld.git
        - git pull origin master

    4. CREAR ISSUE EN GitLab => #id = 1

    5. CAMBIOS LOCALES =>

        - Hacer cambios.
        - git branch "1-branch"
        - git checkout 1-branch
        - git add -A
        - git commit -m "1-commitName"
        - git push origin 1-branch

    6. EN GttLab

        - TEST .gitlab-ci.yml => CI / CD => PipeLines => CI Lint => Probamos comandos

        - voy al issue 1
        - abro la rama 1-branch
        - creo merge request
        - voy a merge requests => MERGE + Delete sourge branch => se cierra el merge request y el issue automatico.
        
    7. Local:

        - git checkout master
        - git branch -D 1-branch
        - git pull origin master

    8. INICIAMOS EN PUNTO 1

--------------------------------------------------------------------->

En la compañía para la que trabajo usamos GitLab CI pero con el ejecutor es SSH, así se ve unos de los .yml, adicionalmente usamos playbooks de ansible para ejecutar algunas tareas predefinidas

stages:
  - build
  - test
  - registry
  - deployment
  - performance
  - destroy

variables:
  GIT_STRATEGY: none
  GIT_CLONE_PATH: $CI_BUILDS_DIR/$CI_PROJECT_NAME/$CI_COMMIT_REF_NAME/
  DOMAIN: mi-aplicativo.com/wss

include:
  - build/docker.yml
  - verify/unit-testing.yml
  - security/code-quality.yml
  - artifact/registry.yml
  - verify/performance-testing.yml

develop:
  stage: deployment
  only:
    - develop
  inherit:
    variables: false
  trigger:
    project: playbooks/miapp-playbook
    strategy: depend
  variables:
    IMAGE: midockerhub/$CI_PROJECT_NAME:$CI_COMMIT_REF_SLUG
    ENV: develop

QA:
  stage: deployment
  only:
    - /^release/.*$/
  inherit:
    variables: false
  trigger:
    project: playbooks/miapp-playbook
    strategy: depend
  variables:
    IMAGE: midockerhub/$CI_PROJECT_NAME:$CI_COMMIT_REF_SLUG
    ENV: qa

staging:
  stage: deployment
  only:
    - tags
  inherit:
    variables: false
  trigger:
    project: playbooks/miapp-playbook
    strategy: depend
  variables:
    IMAGE: midockerhub/$CI_PROJECT_NAME:$CI_COMMIT_REF_SLUG
    ENV: staging

production:
  stage: deployment
  when: manual
  only:
    - tags
  inherit:
    variables: false
  trigger:
    project: playbooks/miapp-playbook
    strategy: depend
  variables:
    IMAGE: midockerhub/$CI_PROJECT_NAME:$CI_COMMIT_REF_SLUG
    ENV: production

Muy interesante, pero ¿Cómo configuro un CI en un stack LAMP?

A mí me sale este error: Error: root config contains unknown keys: test-apps

Qué es lo que tengo mal?

image: node:11.1.0
stages:
    - install
    - test

install-dependencies:
    stage: install
    script:
        - npm install
    artifacts:
        expire_in: 1hr
        paths:
            - node_modules/
    cache:
        paths:
            - node_modules/

test-apps:
    stage: test
    variables:
        CHROME_BIN: google-chrome
    dependencies:
        - install-dependencies
    before_script:
        - apt update && apt install -y apt-transport-https
        - wget -q -0 - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key-add -
        - sh -c 'echo "deb https://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
        - apt update && apt install -y google-chrome-stable
        - npm run test:ci

Un ejemplo para JAVA con gradle, crea stages para pruebas de covertura y mutación además de empaquetar la aplicación springBoot y publicar esa imagen docker en el registry de gitlab.

Usa la imagen docker:latest (para poder construir la imagen) y para los stage necesarios se agrega la imagen de gradle:alpine.

image: docker:latest
services:
  - docker:dind

variables:
  DOCKER_DRIVER: overlay

stages:
  - coverage
  - mutation
  - build
  - package

gradle-build:
  image: gradle:alpine
  stage: build
  variables:
    GRADLE_OPTS: "-Dorg.gradle.daemon=false"

  before_script:
    - export GRADLE_USER_HOME=`pwd`/.gradle
  script:
    gradle bootJar
  artifacts:
    paths:
      - build/libs/*.jar
    expire_in: 1 week

gradle-test:
  image: gradle:alpine
  stage: coverage
  script:
    gradle test jacocoTestCoverageVerification

gradle-mutation:
  image: gradle:alpine
  stage: mutation
  script:
    gradle pitest

docker-build:
  stage: package
  script:
    - docker build -t registry.gitlab.com/msgoon6-scholar/schollar-service .
    - docker login -u msgoon6-********* -p **************** registry.gitlab.com
    - docker push registry.gitlab.com/msgoon6-scholar/schollar-service

Un ejemplo para Django

image: python:3.6.8
stages:
  - install
  - test

install-dependencies:
  stage: install
  script:
    - pip install virtualenv
    - virtualenv Env
    - source Env/bin/activate
    - pip install -r requirements.txt
  artifacts:
    expire_in: 1hr
    paths:
      - Env
  cache:
    paths:
      - Env

test-apps:
  stage: test
  services:
    - mysql:latest
  dependencies:
    - install-dependencies
  script:
    - source Env/bin/activate
    - python manage.py test

Buenas ¿Hay alguna forma de especificar que solo ciertas ramas corran el pipeline?

Acceso a GitLab CI Lint: MyPorject => CI / CD => PipeLines => CI Lint

El runner se genera en automatico, o hay que configurarlo previamente

Les recomiendo esta extensión para los archivos .yaml, nos ayudará a reducir los typos al momento de crear nuestro archivo.

Al momento de correr el pipeline paaba la fase de instalacion, pero la parte de la prueba no, me daba el siguiente error:
sh: 1: cannot create /etc/app/sources.list.d/google.list: Directory nonexistent.

Lo solucione con esta configuración:
image: node:11.1.0
stages:

  • install
  • test

install-dependencies:
stage: install
script:
- npm install
artifacts:
expire_in: 1hr
paths:
- node_modules/
cache:
paths:
- node_modules/

test-apps:
stage: test
variables:
CHROME_BIN: google-chrome
dependencies:
- install-dependencies
before_script:
- apt-get update && apt-get install -y apt-transport-https
- echo ‘deb http://dl.google.com/linux/chrome/deb/ stable main’ > /etc/apt/sources.list.d/chrome.list
- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
- set -x && apt-get update && apt-get install -y xvfb google-chrome-stable
script:
- npm run test:ci

En image: node:11.1.10
Usen una version actual o les va a dar error
por ejemplo
image: node:12.16.1

Gitlab te genera algun costo por utilizar una maquina linux para el correr el build y test ?

que manejador de contraseñas utilizan?

ERROR:zygote_host_impl_linux.cc(89)] Running as root without --no-sandbox is not supported.

Espectacular, pero me paso algo, como he trabajado anteriormente con github. para actualizar el repositorio local le di:

git commit -am "Add gitlab ci config"

no me reconocio todos los cambios, solo los primeros, no se si fue circunstancialmente, y al darle push, solo me actualizo los archivos de karma.conf.js y package.json. Por supuesto no se disparo la ejecucion en pipeline.

😉

buenas tardes ,si me puede ayudar con la siguiente:
he tenido este error como lo puedo acomodar:

Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Get:3 http://deb.debian.org/debian stretch Release [118 kB]
Get:4 http://deb.debian.org/debian stretch Release.gpg [2410 B]
Get:5 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:6 http://deb.debian.org/debian stretch-updates/main amd64 Packages [27.9 kB]
Get:7 http://deb.debian.org/debian stretch/main amd64 Packages [7083 kB]
Get:8 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [527 kB]
Fetched 7944 kB in 1s (4553 kB/s)
Reading package lists…
Reading package lists…
Building dependency tree…
Reading state information…
The following NEW packages will be installed:
apt-transport-https
0 upgraded, 1 newly installed, 0 to remove and 44 not upgraded.
Need to get 171 kB of archives.
After this operation, 243 kB of additional disk space will be used.
Get:1 http://security.debian.org/debian-security stretch/updates/main amd64 apt-transport-https amd64 1.4.10 [171 kB]
debconf: delaying package configuration, since apt-utils is not installed
Fetched 171 kB in 0s (2516 kB/s)
Selecting previously unselected package apt-transport-https.
(Reading database … 29962 files and directories currently installed.)
Preparing to unpack …/apt-transport-https_1.4.10_amd64.deb …
Unpacking apt-transport-https (1.4.10) …
Setting up apt-transport-https (1.4.10) …
$ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
Warning: apt-key output should not be parsed (stdout is not a terminal)
OK
$ sh -c 'echo “deb https://dl.google.com/linux/chrome/deb/stable main” >> /etc/app/sources.list.d/google.list’
sh: 1: cannot create /etc/app/sources.list.d/google.list: Directory nonexistent
Running after_script
00:01
Uploading artifacts for failed job
00:02
ERROR: Job failed: exit code 1

Por si alguien tuvo errores con las nuevas versiones de karma:

el gitlab-ci.yml

image: node:12.18.2

stages:
  - install
  - test

install-dependencies:
  stage: install
  script:
    - npm install
  artifacts:
    expire_in: 1hr
    paths:
      - node_modules/
  cache:
    paths:
      - node_modules/

test-apps:
  stage: test
  variables:
    CHROME_BIN: google-chrome
  dependencies:
    - install-dependencies
  before_script:
    - apt-get update && apt-get install -y apt-transport-https gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
    - echo ‘deb http://dl.google.com/linux/chrome/deb/ stable main’ > /etc/apt/sources.list.d/chrome.list
    - wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
    - set -x && apt-get update && apt-get install -y xvfb google-chrome-stable
  script:
    - npm run test:ci

karma.config.js

// Karma configuration file, see link for more information
// https://karma-runner.github.io/1.0/config/configuration-file.html
process.env.CHROME_BIN = require('puppeteer').executablePath();

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular-devkit/build-angular'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-jasmine-html-reporter'),
      require('karma-coverage-istanbul-reporter'),
      require('@angular-devkit/build-angular/plugins/karma')
    ],
    client: {
      clearContext: false // leave Jasmine Spec Runner output visible in browser
    },
    coverageIstanbulReporter: {
      dir: require('path').join(__dirname, './coverage/angular-gitlab-devops-example'),
      reports: ['html', 'lcovonly', 'text-summary'],
      fixWebpackSourcePaths: true
    },
    reporters: ['progress', 'kjhtml'],
    port: 9876,
    colors: true,
    logLevel: config.LOG_INFO,
    autoWatch: true,
    browsers: ['ChromeHeadless'],
    customLaunchers: {
      ChromeHeadlessNoSandbox: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox']
      }
    },
    singleRun: false,
    restartOnFileChange: true
  });
};

Para probar el lint de gitlab para archivos ‘,gitlab-ci.yml’’, en una sintaxis Js tu debes ingresar a:
https://gitlab.com/${group}/${proyect}/-/ci/lint

Para validar el archivo .gitlab-ci.yml puedes hacerlo de dos formas

  1. usando GitLab
  • Navega a CI/CD > Pipelines o CI/CD > Jobs en tu proyecto
  • Despues has click en CI lint
  • Pega tu codigo en el editor
  • preciona el boton Validate
  1. usando la extension de GitLab en vscode
  • Instala la extension gitlab.gitlab-workflow
  • Abre el command palette (ctrl + shift + p o cmd + shift + p)
  • Ejecuta el comando GitLab: Validate GitLab CI config