Exemple de model de treball per a CI/CD d’un AWS Batch
Com ja s’ha comentat anteriorment, el nou model de treball es basarà en:
- Gestió de branques amb un model Gitflow.
- Integracions de branques basades en Pull Request.
- Tagging d’artefactes i repositoris amb el model Semantic Version 2.0.
En el següent exemple es mostra l’execució e2e d’un flux de treball, des que el desenvolupador realitza la seva implementació en una branca Feature, fins al desplegament en Producció. La infraestructura ha estat desplegada prèviament. En el cas que l’aplicació no disposi d’entorn de desenvolupament, l’estratègia seria la integració de feature en develop i d’aquesta a rellegeixi sense desplegar en l’entorn de development.
L’accés a GHEC es realitzarà des de l’URL: https://ctti.ghe.com/enterprises/ctti/.
-
Prerequisits Per a poder aplicar aquesta lògica és necessari partir d’una configuració correcta d’AWS batch, en concret la que permet executar imatges de contenidor des de batch. A continuació deixem un snipet d’exemple amb la configuració:
- Fitxers terraform:
resource "aws_batch_compute_environment" "this" { compute_environment_name = var.compute_environment_name type = "MANAGED" state = "ENABLED" service_role = aws_iam_role.batch_service.arn compute_resources { type = var.compute_type max_vcpus = var.max_vcpus subnets = var.subnet_ids security_group_ids = var.security_group_ids } lifecycle { create_before_destroy = true } } resource "aws_batch_job_queue" "this" { name = "${var.project}-${var.environment}" state = "ENABLED" priority = 1 compute_environment_order { order = 1 compute_environment = aws_batch_compute_environment.this.arn } } resource "aws_batch_job_definition" "this" { name = "${var.project}-${var.environment}" type = "container" platform_capabilities = [var.compute_type] timeout { attempt_duration_seconds = var.job_timeout_seconds } retry_strategy { attempts = 2 } container_properties = jsonencode({ image = "${var.ecr_repository_url}:${var.image_tag}" command = var.job_command # Fargate requiere resourceRequirements en vez de vcpus/memory resourceRequirements = [ { type = "VCPU", value = tostring(var.job_vcpus) }, { type = "MEMORY", value = tostring(var.job_memory) } ] executionRoleArn = aws_iam_role.execution_role.arn jobRoleArn = aws_iam_role.job_role.arn logConfiguration = { logDriver = "awslogs" options = { "awslogs-group" = "/aws/batch/${var.project}-${var.environment}" "awslogs-region" = var.aws_region "awslogs-stream-prefix" = "batch" } } networkConfiguration = { assignPublicIp = "DISABLED" } fargatePlatformConfiguration = { platformVersion = "LATEST" } }) lifecycle { ignore_changes = [container_properties] } } # CloudWatch Log Group resource "aws_cloudwatch_log_group" "batch" { name = "/aws/batch/${var.project}-${var.environment}" retention_in_days = 30 } -
Integració en branca develop des de feature L’usuari ja ha realitzat el seu desenvolupament en la branca feature i es disposa a Integrar els seus canvis a develop.

Objectiu: Integració de feature a develop i generació d’artefacte per a desplegament en Desenvolupament.
Actors:
- Usuari amb Rol Write que realitza el desenvolupament.
- Usuari amb Rol Maintain que aprova la Pull Request (PR).
Configuració dels workflow per a AWS batch Aquest necessari definir:
- Fitxer .github/workflows/container-cd.yaml
- Definir engine i cloud
cloud: aws engine: registry
Execució de Workflows: Automàtic
- Container CI on PR en realitzar la PR. Genera l’artefacte, havent realitzat prèviament anàlisi de qualitat i seguretat.
- Container CI on Commit to develop, en realitzar el Commit, empaquetant el codi en una imatge de contenidor i pujant-la al registre d’imatges JFrog Artifactory.
Resultat de l’operació:
- Branca feature integrada en develop.
- Codi validat per un Reviewer i per eines de qualitat i seguretat.
- Generació i pujada de la imatge de contenidor a JFrog Artifactory.
- Tag del repositori a 0.0.1-SNAPSHOT i Tag de la imatge a app.0.0.1-SNAPSHOT.
-
Validació funcional d’artefacte en desenvolupament. L’usuari es disposa a realitzar el desplegament de l’artefacte generat en el pas 1 i desplegar-lo en l’entorn de desenvolupament per a la seva validació funcional.

Objectiu: Desplegament en desenvolupament de l’artefacte generat anteriorment per a la seva validació.
Actors:
- Usuari amb Rol Write o Maintain.
Execució de Workflows: Sota Demanda per part de l’usuari.
-
Container CD, comprova que existeixi la imatge, que es pugui desplegar en l’entorn, i executa el desplegament.
En aquest cas l’execució és manual i per a això l’usuari (independentment del seu rol, però s’aconsella que sigui el de maintain) tindrà que:
-
Accedir als WorkFlows del repositori mitjançant l’opció “Actions”, indicada en l’apartat Configuració dels diferents WorkFlows de CI/CD.
-
Seleccionar el workflow a executar, en aquest cas Container CD, i prémer “Run Workflow”, apareixent el formulari per introduir la informació necessària per a l’execució:

- Branca o branch on es troba el workflow actualitzat: develop.
- Artifact Version: Versió de l’artefacte, en aquest cas 0.0.1-SNAPSHOT.
- Environment: dev, per al desplegament a desenvolupament.
- ITSM ID Change Coordinator: ID de l’usuari per crear la CRQ en ITSM amb l’objectiu d’informar sobre el desplegament.
-
-
Execució d’AWS batch amb la nova imatge generada: El procés de CD finalitza amb la pujada de la imatge al registre d’AWS ECR, quedant fora de l’abast d’aquest l’execució del propi contenidor i havent de realitzar-se per part de l’aplicació.
1. Describe Job Definitions POST /v1/describejobdefinitions HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinitionName": "my-batch-app-dev", "status": "ACTIVE" } 2. Register Job Definition POST /v1/registerjobdefinition HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinitionName": "my-batch-app-dev", "type": "container", "containerProperties": { "image": "123456789012.dkr.ecr.eu-west-1.amazonaws.com/my-app:new-tag", "resourceRequirements": [ { "type": "VCPU", "value": "2" }, { "type": "MEMORY", "value": "4096" } ], "executionRoleArn": "arn:aws:iam::123456789012:role/my-batch-execution" } } 3. Deregister Job Definition POST /v1/deregisterjobdefinition HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinition": "arn:aws:batch:eu-west-1:123456789012:job-definition/my-batch-app-dev:old-tag" } 4. Submit Job POST /v1/submitjob HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobName": "my-job-run", "jobQueue": "my-batch-app-dev", "jobDefinition": "my-batch-app-dev" } 5. Describe Jobs POST /v1/describejobs HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobs": ["a1b2c3d4-5678-90ab-cdef-example11111"] }
Resultat de l’operació:
- Codi desplegat entorn de Desenvolupament per a la seva validació.
- Creació de TAG de repositori «tag-repositori-actual»-development per a propòsits de rollback automàtic. Exemple “0.0.1-SNAPSHOT-development”.
- Codi executat i testat en AWS batch.
-
Integració en branca release des de develop Un cop validat el codi en l’entorn de desenvolupament, el desenvolupador pot promocionar-lo a la branca Release i així poder desplegar-lo posteriorment al pas 4.

Objectiu : Integrar el codi a Release per posteriorment desplegar en entorns Preproductions un artefacte Release Candidate.
Actors:
- Usuari amb Rol Write realitza el desenvolupament i sol·licita la Pull Request.
- Usuari amb Rol Maintain aprova la Pull Request.
Execució de Workflows: Automàtic.
- Container CI on Commit en aprovar la Pull Request. L’artefacte ha estat creat a la fase anterior i només es realitza un “Re-Tag” amb el tag de release.
Resultat de l’operació:
- Branca develop integrada en release.
- Re-Tag de la imatge de contenidor en JFrog Artifactory a app.0.0.1-RC (Release Candidate).
- Re-Tag del repositori a 0.0.1-RC (Release Candidate).
-
Validació funcional d’artefacte en Preproducció Estant disponible la imatge amb un tag vàlid, es realitza el desplegament per realitzar les validacions necessàries.

Objectiu: Desplegament en Preproducció de l’artefacte per a la seva validació funcional.
Actors:
- Usuari amb Rol Write o Maintain.
Execució de Workflows: Sota Demanda per part de l’usuari.
-
Container CD, comprova que existeixi la imatge, que es pugui desplegar en l’entorn de Preproducció, i executa el desplegament informant en ITSM.
En aquest cas l’execució és manual i l’usuari haurà d’omplir un formulari amb la informació del desplegament (revisar com executar workflow manualment descrit en l’apartat Validació funcional d’artefacte en desenvolupament):
- Branca o branch on es troba el workflow actualitzat: release.
- Artifact Version: Versió de l’artefacte, en aquest cas 0.0.1-RC.
- Environment: pre, per al desplegament a Preproducció.
- ITSM ID Change Coordinator: ID de l’usuari per crear la CRQ en ITSM amb l’objectiu d’informar sobre el desplegament.
-
Execució de AW batch amb la nova imatge generada El procés de CD finalitza amb la pujada de la imatge al registre d’AWS ECR, quedant fora de l’abast d’aquest l’execució del propi contenidor i havent de realitzar-se per part de l’aplicació.
1. Describe Job Definitions POST /v1/describejobdefinitions HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinitionName": "my-batch-app-dev", "status": "ACTIVE" } 2. Register Job Definition POST /v1/registerjobdefinition HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinitionName": "my-batch-app-dev", "type": "container", "containerProperties": { "image": "123456789012.dkr.ecr.eu-west-1.amazonaws.com/my-app:new-tag", "resourceRequirements": [ { "type": "VCPU", "value": "2" }, { "type": "MEMORY", "value": "4096" } ], "executionRoleArn": "arn:aws:iam::123456789012:role/my-batch-execution" } } 3. Deregister Job Definition POST /v1/deregisterjobdefinition HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinition": "arn:aws:batch:eu-west-1:123456789012:job-definition/my-batch-app-dev:old-tag" } 4. Submit Job POST /v1/submitjob HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobName": "my-job-run", "jobQueue": "my-batch-app-dev", "jobDefinition": "my-batch-app-dev" } 5. Describe Jobs POST /v1/describejobs HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobs": ["a1b2c3d4-5678-90ab-cdef-example11111"] }
Resultat de l’operació:
- Codi desplegat entorn de Preproducció per a la seva validació. [Pendent] Es realitzaran validacions mitjançant la integració amb el Marc d’Automatització de Testing (MAT) i MAM (Marc d’Automatització de Monitoratge).
- Creació de TAG de repositori «tag-repositori-actual»-preproduction per a propòsits de rollback automàtic. Exemple “0.0.1-RC-preproduction”.
- Codi executat i testat en AWS batch.
-
Integració en branca master des de release Una vegada realitzarà la validació funcional, l’usuari es disposa a integrar en master per a deixar un artefacte disponible per a desplegar en Producció.

Objectiu: Integrar el codi a branca master i generar artefacte final per al desplegament en Producció.
Actors:
- Usuari amb Rol Write realitza el desenvolupament i sol·licita la Pull Request a màster.
- Usuari amb Rol Maintain aprova la Pull Request.
Execució de Workflows: Automàtic
- Container CI on Commit en aprovar la Pull Request. L’artefacte ha estat creat a la fase anterior i només es realitza un “Re-Tag” amb el tag de master.
Resultat de l’operació:
- Branca release integrada en master.
- Imatge de contenidor, a JFrog Artifactory, amb nou Tag per desplegament en Producció app.0.0.1 (Final).
- Re-Tag del repositori a 0.0.1.
-
Desplegament d’aplicació a Producció Una vegada hi ha l’artefacte disponible a JFrog Artifactory amb un tag que habilita la seva promoció a pro, i totes les validacions realitzades en entorns Preproductions, l’artefacte es pot desplegar en Producció.

Objectiu: Desplegament en Producció de l’aplicació.
Actors:
- Usuari amb Rol Write o Maintain.
Execució de Workflows: Sota Demanda per part de l’usuari.
-
Container CD, comprova que existeixi la imatge, que es pugui desplegar en l’entorn de Producció, i executa el desplegament informant en ITSM.
En aquest cas l’execució és manual i l’usuari haurà d’omplir un formulari amb la informació del desplegament (revisar com executar workflow manualment descrit en l’apartat Validació funcional d’artefacte en desenvolupament):
- Branca o branch on es troba el workflow actualitzat: master.
- Artifact Version: Versió de l’artefacte, en aquest cas 0.0.1.
- Environment: pro, per al desplegament a Producció.
- ITSM ID Change Coordinator: ID de l’usuari per crear la CRQ en ITSM amb l’objectiu d’informar sobre el desplegament.
-
Execució d’AWS batch amb la nova imatge generada El procés de CD finalitza amb la pujada de la imatge al registre d’AWS ECR, quedant fora de l’abast d’aquest l’execució del propi contenidor i havent de realitzar-se per part de l’aplicació.
1. Describe Job Definitions POST /v1/describejobdefinitions HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinitionName": "my-batch-app-dev", "status": "ACTIVE" } 2. Register Job Definition POST /v1/registerjobdefinition HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinitionName": "my-batch-app-dev", "type": "container", "containerProperties": { "image": "123456789012.dkr.ecr.eu-west-1.amazonaws.com/my-app:new-tag", "resourceRequirements": [ { "type": "VCPU", "value": "2" }, { "type": "MEMORY", "value": "4096" } ], "executionRoleArn": "arn:aws:iam::123456789012:role/my-batch-execution" } } 3. Deregister Job Definition POST /v1/deregisterjobdefinition HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobDefinition": "arn:aws:batch:eu-west-1:123456789012:job-definition/my-batch-app-dev:old-tag" } 4. Submit Job POST /v1/submitjob HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobName": "my-job-run", "jobQueue": "my-batch-app-dev", "jobDefinition": "my-batch-app-dev" } 5. Describe Jobs POST /v1/describejobs HTTP/1.1 Host: batch.eu-west-1.amazonaws.com { "jobs": ["a1b2c3d4-5678-90ab-cdef-example11111"] }
Resultat de l’operació:
- Codi desplegat entorn de Producció.
- Creació de TAG de repositori «tag-repositori-actual»-production per a propòsits de rollback automàtic. Exemple “0.0.1-production”.
- Codi executat i testat en AWS batch.