diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 1fcf213..0000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,155 +0,0 @@ -image: docker:latest - -variables: - IMAGE_BASE: "$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME" - DOCKER_BUILDKIT: 1 - -stages: - - prep - - build - - test - - deliver - - deploy - -preparation: - stage: prep - tags: - - dev - script: - - export BUILD_ID=$(date +%Y%m%d%H%M) - - echo "BUILD_ID=${BUILD_ID}" > context.env - - - echo "API_PROD_IMAGE_NAME=${IMAGE_BASE}/api:prod-${BUILD_ID}" >> context.env - - echo "API_TEST_IMAGE_NAME=${IMAGE_BASE}/api:test-${BUILD_ID}" >> context.env - - echo "CLIENT_PROD_IMAGE_NAME=${IMAGE_BASE}/client:prod-${BUILD_ID}" >> context.env - - echo "CLIENT_TEST_IMAGE_NAME=${IMAGE_BASE}/client:test-${BUILD_ID}" >> context.env - - - echo "DOCKER_HUB_API_IMAGE=$DOCKER_HUB_USER/foodtruckers-api:${BUILD_ID}" >> context.env - - echo "DOCKER_HUB_CLIENT_IMAGE=$DOCKER_HUB_USER/foodtruckers-client:${BUILD_ID}" >> context.env - artifacts: - paths: - - context.env - -build-api: - stage: build - tags: - - dev - script: - - export $(cat context.env | xargs) - - - docker build sample-api-users -f sample-api-users/Dockerfile.prod -t ${API_PROD_IMAGE_NAME} - - docker build sample-api-users -f sample-api-users/Dockerfile.test --build-arg "BASE_IMAGE=$API_PROD_IMAGE_NAME" -t ${API_TEST_IMAGE_NAME} - - - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY - - - docker push ${API_PROD_IMAGE_NAME} - - docker push ${API_TEST_IMAGE_NAME} - needs: - - job: preparation - artifacts: true - -build-client: - stage: build - tags: - - dev - script: - - export $(cat context.env | xargs) - - - docker build sample-client-users -t ${CLIENT_PROD_IMAGE_NAME} - - docker build sample-client-users -f sample-client-users/Dockerfile.test -t ${CLIENT_TEST_IMAGE_NAME} - - - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY - - - docker push ${CLIENT_PROD_IMAGE_NAME} - - docker push ${CLIENT_TEST_IMAGE_NAME} - needs: - - job: preparation - artifacts: true - -test-api: - stage: test - tags: - - dev - script: - - export $(cat context.env | xargs) - - - export API_IMAGE=$API_TEST_IMAGE_NAME - - export CLIENT_IMAGE=dummy-image - - - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY - - - docker compose -f docker-compose.yml --env-file .env.dev --profile api pull - - docker compose -f docker-compose.yml --env-file .env.dev --profile api up --abort-on-container-exit - - docker cp foodtruckers_api:/usr/src/app/coverage.xml . - - docker cp foodtruckers_api:/usr/src/app/report.xml . - artifacts: - when: always - paths: - - coverage.xml - - report.xml - reports: - junit: report.xml - needs: - - job: preparation - - job: build-api - artifacts: true - -test-integration: - stage: test - tags: - - dev - script: - - export $(cat context.env | xargs) - - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY - - - export API_IMAGE=$API_TEST_IMAGE_NAME - - export CLIENT_IMAGE=$CLIENT_TEST_IMAGE_NAME - - export TEST_TARGET=INTEGRATION - - docker compose -f docker-compose.yml --env-file .env.dev --profile all pull - - docker compose -f docker-compose.yml --env-file .env.dev --profile all up --abort-on-container-exit - needs: - - job: test-api - - job: build-client - - job: preparation - artifacts: true - -deliver-dockerhub: - stage: deliver - tags: - - dev - script: - - export $(cat context.env | xargs) - - - docker login -u $CI_REGISTRY_USER --password $CI_JOB_TOKEN $CI_REGISTRY - - docker login -u $DOCKER_HUB_USER --password $DOCKER_HUB_PASS - - - docker tag $API_PROD_IMAGE_NAME $DOCKER_HUB_API_IMAGE - - docker tag $CLIENT_PROD_IMAGE_NAME $DOCKER_HUB_CLIENT_IMAGE - - - docker push $DOCKER_HUB_API_IMAGE - - docker push $DOCKER_HUB_CLIENT_IMAGE - needs: - - job: test-integration - - job: preparation - artifacts: true - -deploy-prod: - stage: deploy - tags: - - prod - script: - - export $(cat context.env | xargs) - - - export API_IMAGE=$DOCKER_HUB_API_IMAGE - - export CLIENT_IMAGE=$DOCKER_HUB_CLIENT_IMAGE - - - docker login -u $DOCKER_HUB_USER --password $DOCKER_HUB_PASS - - - docker compose -f docker-compose.yml --profile all --env-file .env.prod stop - - docker compose -f docker-compose.yml --profile all --env-file .env.prod rm - - docker compose -f docker-compose.yml --profile all --env-file .env.prod pull - - docker compose -f docker-compose.yml --profile all --env-file .env.prod up -d - needs: - - job: deliver-dockerhub - - job: preparation - artifacts: true \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 542f1e1..0000000 --- a/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# CI - -## GitlabRunner - -[Instalar el runner](https://docs.gitlab.com/runner/install/docker.html) - -`docker volume create gitlab-runner-config` - -```bash -docker run -d --name gitlab-runner --restart always \ - -v /var/run/docker.sock:/var/run/docker.sock \ - -v gitlab-runner-config:/etc/gitlab-runner \ - gitlab/gitlab-runner:latest -``` - -- [Registrar el runner](https://docs.gitlab.com/runner/register/index.html#docker) -- [Variables predefinidas](https://docs.gitlab.com/ee/ci/variables/predefined_variables.html) - -`docker run --rm -it -v gitlab-runner-config:/etc/gitlab-runner gitlab/gitlab-runner:latest register` - -Pide una URL y un Token que se consiguen en ` > Settings > CI/CD > Runners`, usar `docker` como executor. y `docker:latest` como imagen - -Hay que modificar el archivo `config.toml` del runner. Se puede acceder al mismo desde el host (la configuracion se monto como volumen) o desde el container. Hay que agregar `privileged=true` y en volumes: `["/cache", "/var/run/docker.sock:/var/run/docker.sock"]`. - -## Pipeline - -Para crear un pipeline dentro de gitlab vamos a definir un archivo llamado `.gitlab-ci.yml` en la raiz del proyecto. En este caso, vamos a usar un pipeline que ejecute en docker, por eso la imagen del mismo sera `image: docker:latest`. - -La estructura basica del archivo consiste en: - -```yaml -image: docker:latest - -variables: - IMAGE_BASE: "$CI_REGISTRY/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME" - ... - -stages: - - prep - - build - - test - - deliver - - deploy - -job1: - ... -job2: - ... -``` -[GitLab CI reference](https://docs.gitlab.com/ee/ci/yaml/) - -En este caso estamos declarando la imagen mencionada, declaramos variables a ser utilizadas en el pipeline, definimos el orden y nombre de los stages y declaramos los jobs en cuestiĆ³n. - -En nuestro caso utilizamos un stage llamado `prep` para realizar tareas de preparacion previas a la ejecucion del pipeline. En particular, se utiliza este stage para definir los nombres de todas las imagenes a ser creadas a lo largo del pipeline. Estos valores sera almacendas en un artifact llamado `context.env`. Luego, a medida que sea necesario, cada job solicitara el artifact y obtendra los valores requeridos. - -El uso de tags es importante para separar la ejecucion en los distinto ambientes. En este caso, eel ambiente de build + test y el ambiente productivo final. - -## Imagenes Docker - -La idea de las imagenes es generar imagenes de testing que sean lo mas parecido a la imagen final. En el caso de python, la imagen de testing es una extension de la imagen productiva, se agregan las dependencias de testing y se hacen los ajustes pertinentes. - -