O jenkins agentoch počul snáď každý. Jednoduché inštancie, ktoré zavoláme on-demand, keď ich potrebujeme, vykonajú úlohu a efektívne ich vypneme.
Premýšľali ste niekedy nad tým, ako presne sa títo agenti vytvárajú? Ja áno, dlho, ale aj tak ma prekvapila miera zložitosti, ktorú som musel prekonať, aby som ich vytvoril.
Cieľ
Vytvoriť jenkins agenta, ktorý sa spawne na AWS ECS ako fargate task a vykoná úlohu, ktorú mu zadáme. Po dokončení úlohy sa automaticky vypne. Ušetrí nám to, čas, peniaze a zároveň je to bezpečnejšie, ako spúšťať jenkins agenta na EC2 inštancii, ktorá je vystavená na internete.
AWS ECS Jenkins agenti
Na vytvorenie jenkins agenta, ktorý by bol spojený s našim master/main jenkins serverom a zároveň vykonával úlohy na AWS ECS, potrebujeme viacero krokov:
- Dokerizovať našu aplikáciu
- Vytvoriť ECS cluster
- Vytvoriť ECS task definition
- Inštalovať AWS ECS plugin pre jenkins
- Vytvoriť Docker image s jenkins agentom
Poďme na to postupne a presne odspodu :)
Requirements
Predtým ako začneme, vyriešme najskôr dôležité veci:
- IAM Role pre ECS task
- Security Groups
IAM Role pre ECS task
Predpokladám, že využívate nastavenie IAM role pre Jenkins server. Do sekcie Trusted advisors potrebujeme doplniť novú rolu, pokiaľ ešte nemáme:
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "es.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
K samotnej role pre jenkins server potrebujeme doplniť nasledovné povolenia:
{
"Sid": "VisualEditor2",
"Effect": "Allow",
"Action": [
"ecs:DescribeTaskDefinition",
"ecs:DeregisterTaskDefinition",
"ecs:RunTask",
"ecs:RegisterTaskDefinition",
"ecs:StopTask",
"ecs:DescribeContainerInstances",
"ecs:DescribeTasks",
"ecs:ListTaskDefinitions",
"ecs:ListClusters",
"ecs:DescribeClusters",
"ecs:ListTagsForResource",
"ecs:ListContainerInstances",
],
"Resource": "*"
}
Nezabudnite opraviť povolenia podľa vlastných potrebieb, najmä sekciu Resource.
Security Group pre ECS task
Náš Jenkins server musí vedieť komunikovať s jenkins agentom. Vytvoríme 2 security groups, jednu pre hlavný Jenkins server a druhú pre agenta:
# Jenkins server security group
Inbound:
- TCP 8080 from <agent-security-group>
- TCP 50000 from <agent-security-group>
# Jenkins agent security group
Inbound:
- Whatever you need
Komunikácia medzi Jenkins serverom a Jenkins agentom prebieha z agenta -> na server. Agent potrebuje povolené porty iba ak to vyžaduje aplikácia alebo úloha, ktorú chceme na agentovi vykonávať.
Create Docker image pre jenkins agenta
Vytvoríme si vlastný docker image, ktorý obashuje Jenkins agenta. Keďže tento docker image plánujeme použiť na front-endové aplikácie, pridáme aj Node.js 18 a ďalšie doplnkové package yarn a awscli. Tento predinštalovaný image bude následne pracovať s našou aplikáciu, ktorú mu pošleme cez hlavný Jenkins server.
FROM node:18.17.0-alpine AS node
FROM jenkins/inbound-agent:alpine
USER root
RUN apk update
RUN apk add ca-certificates curl g++ make
# Node.js
COPY --from=node /usr/lib /usr/lib
COPY --from=node /usr/local/share /usr/local/share
COPY --from=node /usr/local/lib /usr/local/lib
COPY --from=node /usr/local/include /usr/local/include
COPY --from=node /usr/local/bin /usr/local/bin
# Image specific
RUN apk add yarn
RUN apk --no-cache add python3 py3-pip
RUN pip3 install --upgrade pip \
&& pip3 install --no-cache-dir awscli
RUN node -v
RUN yarn -v
RUN mkdir -p /home/jenkins && chown -R 1000:1000 /home/jenkins
# Jenkins directory
WORKDIR /home/jenkins
ENTRYPOINT ["/usr/local/bin/jenkins-agent"]
Amazon Elastic Container Service (ECS) / Fargate Plugin pre Jenkins
Inštalácia jednoduchá, stačí nainštalovať plugin do Jenkinsa. Bližšie informácie