Mostrando entradas con la etiqueta devops. Mostrar todas las entradas
Mostrando entradas con la etiqueta devops. Mostrar todas las entradas

viernes, septiembre 17, 2021

Comandos Basicos Git

 Esto es solo una lista de referencia rápida de comandos básicos de git:

Primero esta el setup inicial:

$ git config --global user.name "Lalo Landa"
$ git config --global user.email lalolanda@example.com

Esta información será guardada en el archivo ~/.gitconfig

$git clone

Este es el comando que te permite clonar en tu maquina un repositorio

$git status

Ver el estatus del directorio actual, este comando te dirá si tienes cambios realizados pero no empujados aun al repositorio. 

$git log

Mostrara un listado de los commits mas recientes, su fecha y comentarios

$git show

Te dará detalles del ultimo commit indicando los cambios específicos que se hicieron, se puede ver los detalles de un commit si al comando se le agrega el hash a detallar.

$git commit <file>

Es el comando que permite agregar los cambios al repositorio

$git add <file>

Permite agregar archivos para que también formen parte del repositorio 

$git pull

Este comando sincroniza el repositorio local en base al contenido el repositorio origen

$git push

Con este comando podemos empujar nuestros cambios comprometidos al repositorio remoto

$git stash

Este comando te permite guardar tus cambios locales que después puedes volver a trabajar con git stash pop

$git branch <nombre>

Creas un branch del mismo repositorio

$git checkout <branch>

Con este comando te cambias al branch donde quieres trabajar


Mas información: https://git-scm.com


lunes, abril 12, 2021

Ejemplo sencillo de python con selenium con docker

 He usado Selenium (https://www.selenium.dev) para interactuar con sitios web, en particular Selenium WebDriver y lo he usado con Python, en el ejemplo de abajo tengo un script solo para sacar el titulo del ultimo post de este blog, para este caso estoy usando chrome junto con el chromedriver los cuales necesitan tener la misma versión.

web.py

from selenium import webdriver

# define webdriver options
options = webdriver.ChromeOptions()
options.add_argument('--ignore-certificate-errors')
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--disable-dev-shm-usage')

driver = webdriver.Chrome(executable_path="/usr/local/bin/chromedriver",options=options)
driver.get('https://moyoy.blogspot.com')

# get title of last post based on xpath 
last_post_xpath = '//*[@id="Blog1"]/div[1]/div[1]/div/div/div/h3/a'
last_post_title = driver.find_element_by_xpath(last_post_xpath).text
print(last_post_title)
driver.quit()


Como esto se puede ejecutar desde una maquina sin interfaz grafica buscaba crear un contenedor para poder estar haciendo pruebas y después poder desplegar una pequeña aplicación que usaría las librerías de Selenium pero me tope con varios problemas hasta que logre crear un contenedor que me pudiera ejecutar el script de arriba

Dockerfile

FROM python:3.8

# install google chrome
RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -
RUN sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
RUN apt-get -y update
RUN apt-get install -y google-chrome-stable

# install chromedriver
RUN apt-get install -yqq unzip
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/local/bin/

# set display port to avoid crash
ENV DISPLAY=:99

# upgrade pip
RUN pip install --upgrade pip

# install selenium
RUN pip install selenium

# add basic script
ADD web.py .
CMD ["python3", "web.py"]


Con los siguientes comandos construyen el contenedor y después lo ejecutan 

$docker build -t selenium-python .

$docker run -it selenium-python


tony@x220:~/docker/selenium-python$ docker run -it selenium-python
Invocando un pipeline de gitlab a través de la API


Dure varias horas buscando la configuración de un contenedor que me funcionara por lo que dejo este ejemplo muy básico aquí en caso de que otra persona tenga el mismo problema.

Existen algunos cambios recientes en Selenium y en como se define el driver en el código de python, posiblemente haga una actualización sobre ello


Gracias a la información en este repo pude resolver algunos de los problemas con los que me encontré:

https://hub.docker.com/r/joyzoursky/python-chromedriver/


miércoles, abril 07, 2021

Invocando un pipeline de gitlab a través de la API

Este es un ejemplo muy sencillo de como ejecutar un pipeline a través del uso de su API sobrescribiendo un valor en de una variable previamente definida

En esta sección: CI / CD -> Settings -> Variables he definido una variable simple llamada GREETING con el valor Hola

mi archivo .gitlab-ci.yaml es el siguiente:

image: "tonymoyoy/ubuntu_ansible:v1"


stages:
    - build
    - test

build:
    stage: build
    script:
        - echo $GREETING
        - echo "Construyendo"
        - mkdir build
        - touch build/info2.txt
    artifacts:
        paths:
            - build/

test:
    stage: test
    script:
        - echo "Probando"
        - test -f "build/info2.txt"

En la sección: CI / CD -> Settings -> Pipeline triggers agregue un trigger llamado pew, el cual genera un Token

Con esto podemos usar curl para iniciar el pipeline, en este caso sobre el branch master y proporcionando el valor Hello a la variable GREETING


curl -X POST \
    -F token=<YOUR-TRIGGER-TOKEN> \
    -F "ref=master" \
    -F "variables[GREETING]=Hello" \
http://<YOURGITLAB>/api/v4/projects/4/trigger/pipeline


En el log del pipeline podremos ver que tomo el valor de la variable:



sábado, marzo 27, 2021

Probando Ansible Playbook en un Docker Container con Gitlab

 Estoy probando ansible y quería tener un setup sencillo para que gitlab hiciera pruebas del código en un contenedor de docker a través de un pipeline, por el momento aquí dejo algo sencillo, tengo este playbook:


simple_playbook.yml

---
- hosts: all
  connection: local
  tasks:
          - name: curl instalation
            apt: pkg=curl update_cache=yes

La conexión es local para ya que no es necesario trabajar con llaves ssh al estar aplicando las pruebas al contendor cada vez.

el archivo .gitlab-ci.yml es el siguiente:

image: "tonymoyoy/ubuntu_ansible:v2"

stages:
    - build
    - test

build:
    stage: build
    script:
        - echo $HOSTNAME > hosts
        - echo "Running ansible playbook"
        - ansible-playbook -i hosts local-playbook.yml

test:
    stage: test
    script:
        - echo "Test pending"

La forma que logre que se ejecutara en el contenedor fue agregando el hostname a un archivo y luego haciendo referencia al archivo hosts como variable del comando ansible-playbook

En este caso use la variable HOSTNAME de gitlab-ci (ver https://docs.gitlab.com/ee/ci/variables/) aunque también pude simplemente usar el comando hostname y enviar el resultado a el archivo, intente hacer la llamada después del comando ansible-playbook pero no encontré una forma de hacerlo funcionar.

Espero que este material puede servir de referencia para alguien


domingo, marzo 21, 2021

Instalacion de Gitlab (Community Edition) en Ubuntu 20.04

Recientemente instale Gitlab en una maquina personal con la finalidad de hacer algunas pruebas, me tope con varios problemas y decidí documentar como al final lo instale y cree un pipeline sencillo.

Varios de los problemas con los que me tope eran derivados de la validez del certificado que se intenta generar en la instalación de Gitlab y del dominio de DNS, si tienes un dominio valido y quieres utilizar un certificado puedes hacerlo, la instalación de Gitlab intentara crear uno con letsencrypt, pero para este caso no usare un certificado o un dominio.


Las instrucciones para la instalación de Gitlab Community Edition se encuentran aquí:

https://about.gitlab.com/install/?version=ce#ubuntu


sudo apt-get install -y curl openssh-server ca-certificates tzdata perl

Es opcional instalar y configurar el correo:

sudo apt-get install -y postfix

Con la siguiente instrucción puedes instalar Gitlab y definir el URL, en las instrucciones de Gitlab aconseja usar un dominio valido y el protocolo https, pero para fines de pruebas lo haremos con http y usare la dirección IP del servidor, (usa la ip de tu servidor)

sudo EXTERNAL_URL="http://192.168.1.210" apt-get install gitlab-ce

Igual esto se puede cambiar después desde el archivo:

/etc/gitlab/gitlab.rb

Editando el parametro external_url y reconfigurando gitlab:

sudo gitlab-ctl reconfigure


Con esto deberás tener tu servicio corriendo y puedes ir a http://localhost (o la ip de tu servidor) desde tu navegador web y tendrás que definir un password de root para Gitlab con el cual podrás administrar la aplicación

Para registrar un nuevo usuario puedes hacer logout del usuario root para volver a la pagina de login y ahí esta el botón de Register Now:



Por default los nuevos usuarios que se registren tienen que ser aprobados así que entras de nuevo como el usuario root 

Admin Area -> Users 

En esa sección encontraras un apartado llamado Pending Approval y ahí tienes la acción para aprobar al usuario recién creado 

El usuario nuevo ahora podrá hacer login,  y al ser la primera vez que este usuario esta entrando pedirá que te asignes un rol:





Una de las primeras cosas a realizar es agregar tu llave publica de SSH de la maquina donde estarías trabajando, esto lo puedes hacer en:

User Settings ->  SSH Keys


En caso de no tener una, usar el comando ssh-keygen

Al menos de que elijas otra localidad tu llave publica se encontrara en /home/usuario/.ssh/id_rsa.pub


Crea un nuevo Proyecto para comprobar la funcionalidad, elige Initialize repository with a README
para que el repositorio no este vacío.

Una vez creado el proyecto veras un botón Clone con la dirección para clonar el repositorio, si tu external_url es un dominio la dirección que veras aquí será en base a esa información, en mi caso estoy usando la dirección IP.



Desde tu maquina de trabajo clona el repositorio:

git clone git@192.168.1.220:jesus/ansible-hello2.git

Y crea estos tres archivos o una versión similar, yo aquí tengo la referencia a una maquina en mi red con la ip 192.168.1.210 a la cual entro con el usuario a6 y del cual tengo configuradas llaves de ssh, para fines prácticos este código no se usara en el pipeline aun.

hosts
192.168.1.210 ansible_user=a6
ping-playbook.yml
---
- hosts: all
  remote_user: a6
  tasks:
          - name: ping server
            ping:
.gitlab-ci.yml
build-job:
  stage: build
  script:
    - echo "Hello There!"

test-job1:
  stage: test
  script:
    - echo "This job tests something"

Empuja estos nuevos archivos a tu repositorio en Gitlab

git add hosts ping-playbook.yml .gitlab-ci.yml
git commit -a
git push

Los archivos hosts y ping-playbook.yml son parte un playbook de ansible muy simple, y el archivo .gitlab-ci.yml es un pipeline que solo manda unos mensajes, a continuación haremos el setup simplemente para que el pipeline se ejecute por los runners, configuraremos uno con docker.



Es necesario instalar docker

sudo apt-get install docker.io


Prueba que docker este funcionando:

sudo usermod -aG docker nombredetuusuario

Ejecuta un docker de prueba:

docker run hello-world


Ya que tengas docker instalado, instala lo siguiente gitlab-runner, los runners son los encargados de correr los Jobs de los pipelines, puedes tener distintos tipo, para este caso usaremos uno basado en docker.

 sudo apt-get install gitlab-runner


De regreso a Gitlab, ve a tu  proyecto

Settings -> CI/CD -> Runners

En esa sección encontraras las instrucciones para instalar y registrar un runner en:

Show Runner Installation Instructions

Veras algo como:

sudo gitlab-runner register --url http://192.168.1.220/ --registration-token JKuz82V6zA2maiaYsLs

De nuevo puedes ver que estoy usando http y no https y la ip en lugar de un dominio, el registration token en tu caso será diferente así como la ip de tu servidor

Entre las preguntas que necesitas contestar están las siguientes:

Please enter the executor: docker+machine, kubernetes, docker-ssh, parallels, shell, ssh, virtualbox, docker, docker-ssh+machine:
docker
Please enter the default Docker image (e.g. ruby:2.1):
ubuntu:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

De regreso a 

Settings -> CI/CD -> Runners

Podrás ver los runners que tienes registrados


En este punto es posible que el pipeline se intente ejecutar o lo puedes ejecutar desde 

CI/CD -> Pipeline - Run Pipeline

Pero es posible que el pipeline falle porque no lo tome el runner:




 en mi caso no tenia la imagen de docker necesaria e intente descargarla aunque tuve el siguiente error:


tony@x220:~$ docker pull gitlab/gitlab-runner-helper
Using default tag: latest
Error response from daemon: manifest for gitlab/gitlab-runner-helper:latest not found: manifest unknown: manifest unknown

Encontre que alguien la pudo descargar de la siguiente forma

tony@x220:~$ docker run --rm -it gitlab/gitlab-runner-helper:x86_64-6d9dd510
Unable to find image 'gitlab/gitlab-runner-helper:x86_64-6d9dd510' locally
x86_64-6d9dd510: Pulling from gitlab/gitlab-runner-helper
614f111fed99: Pull complete
Digest: sha256:2731a347dfb90e2a93a63a9d5f61ee19860ebb6cfeb1258ffaf8fb7afae33133
Status: Downloaded newer image for gitlab/gitlab-runner-helper:x86_64-6d9dd510
docker: Error response from daemon: No command specified.
See 'docker run --help'.
tony@x220:~$ docker tag  gitlab/gitlab-runner-helper:x86_64-6d9dd510 gitlab-runner-helper:11.2.0
tony@x220:~$


Ahora que tienes la imagen del contenedor necesaria ve de nuevo a tu pipeline y intenta correr el Job atorado: Retry This Job


Aquí Gitlab pudo tomar la configuración de .gitlab-ci.yml y ejecutar las instrucciones:






En una segunda parte de este tema incluiré in pipeline que pruebe el código de ansible y otro que la aplique a algún host