μ ν¨μ€ μμ΄μ νΈ (Feat. λΉλ νκ²½)
νμ¬ νμ¬μ κ°λ° μ‘°μ§μμλ νλμ λͺ¨λ리μ νλ‘μ νΈλ₯Ό λ€μν νκ²½μ μν΄μ λΉλ λ° λ°°ν¬νκ³ μλ€. κ·Έλ¦¬κ³ λΉλμ λ°°ν¬λ₯Ό μν΄μ νλμ λ§μ€ν°λ‘ λμνλ μ ν¨μ€ μλ²λ₯Ό ꡬμ±νμ¬ μ¬μ©νκ³ μκ³ νλμ μλ²μμ λΉλλ₯Ό μνν΄λ 무방ν λ§νΌ μλΉμ€ κ·λͺ¨κ° ν¬κ±°λ μμ€ν μ λν λ°°ν¬κ° μμ£Ό μνλμ§ μκΈ°μ λ¨μΌ λΉλ μλ²λ‘ μ΄μ©ν΄λ μΆ©λΆνλ€κ³ λ³Ό μ μλ€. κ°μΈμ μΌλ‘λ μΈν°λ·μ 곡μ λ κΈλ€μ ν΅ν΄ λλΆλΆμ νμ¬μμλ νλ‘λμ μ μν λΉλ νκ²½μ μν΄ λ€μν CI/CD λꡬλ€μ νμ©νκΈ°λ νκ³ μ ν¨μ€ μλ²μ λν΄ μ»¨νΈλ‘€λ¬(λ§μ€ν°)μ μμ΄μ νΈ(μ¬λ μ΄λΈ)λ‘ κ΅¬μ±λλ ν΄λ¬μ€ν°(λΆμ° λΉλ νκ²½)μΌλ‘ ꡬμ±νλ€λ κ²μ μκ³ μμλ€.
컨νΈλ‘€λ¬μ μμ΄μ νΈλ‘ λμνλ λΉλ νκ²½μ λ§λ€μ΄μΌνλ μꡬμ¬νμ΄ νμνκ² λ 건 λΆμ° λΉλμ λͺ©μ 보λ€λ μ ν¨μ€ μλ²κ° Amazon Linux 2 AMI μ΄λ―Έμ§λ‘ μ€νλ EC2 μλ²μ μ€μΉλμκΈ° λλ¬Έμ Node.js 18 LTS λ²μ μ μ§μνμ§ μλ μ μ½μ¬νμ΄ λ°μνκΈ° λλ¬Έμ΄λ€. μΌλΆ νκ²½μ λν΄μ μΈμ ν μ€νΈλ₯Ό ν΅ν νμ§ κ°νλ₯Ό μν΄μ Jestλ₯Ό λμ νκ² λλ©΄μ Node.js 12 λλ 14 LTSμ μμ‘΄νλ κ²μ Node.js 18 LTSλ‘ νΈνμ± λ²μ μ μ¬λ¦¬κ³ μ νκΈ° λλ¬Έμ΄λ€. (Node.js 16 λλ 18 LTS λ²μ μ νΈνμ± λ²μλ‘ μ²΄ν¬νλ€.)
Node.js 14λ νΈνμ± λ²μ ν보μ μμΌλ ARM μν€ν μ²λ‘ λμνλ M1 λλ M2 λ§₯ νκ²½μμ Node.js 14 LTSλ 곡μ λΉλκ° ν¬ν¨λμ΄μμ§ μκΈ° λλ¬Έμ Using NodeJs 14 with Mac Silicon (M1)μ κ°μ μ 보λ€μ μ°Έκ³ ν΄μ ν°λ―Έλμ΄ AMD 64 μν€ν μ²λ‘ λμνλλ‘ λ³κ²½ν΄μ μ¬μ©ν΄μΌ νλ λΆνΈν¨μ μν΄ μ μΈμμΌ°λ€.
μ ν¨μ€ μλ²λ₯Ό Amzon Linux 2023 λλ Ubuntu 20.24 μ΄μμ EC2 μλ²λ‘ μ΄κ΄νλ λ°©λ²λ μμ§λ§ μ ν¨μ€ μλ²λ₯Ό μ§μ μ’ λ£λλ AL1μμ Amazon Linux 2λ‘ μ΄κ΄ν μ§ μΌλ§λμ§ μμκΈ° λλ¬Έμ μΈνλΌ μμ§λμ΄μκ² μμ²νλ κ²μ λΉν¨μ¨μ μ΄λ€λΌλ μκ°μ΄ λ€μκΈ° λλ¬Έμ΄λ€. κ΅³μ΄ μ ν¨μ€ μλ²λ₯Ό μλ‘μ΄ EC2 μλ²λ‘ μ¬κ΅¬μ±νκ±°λ 컨ν μ΄λ κΈ°λ°μΌλ‘ μ€ννμ§ μμλ λΆμ° λΉλ νκ²½μΌλ‘ μ 곡νλ μμ΄μ νΈ(λ Έλλ ν΄λΌμ°λ) κΈ°λ₯μΌλ‘ λ³λμ μλ²λ 컨ν μ΄λμμ λΉλλ₯Ό μννλ κ²μ μ§μνκΈ° λλ¬Έμ ν΄λ¬μ€ν° ꡬμ±μ μλνκ³ μ νλ€.
μ ν¨μ€ λΆμ° λΉλ νκ²½μ ꡬμ±ν΄λ³΄λ κ²μ μ’μ κ²½νμ΄μλ€κ³ μκ°λλ λ³λμ μλ²μμ νλ‘μ νΈ λΉλλ₯Ό μνν μ μλλ‘ μ€μ νκΈ° κΉμ§ μκ°λ³΄λ€ μ΄λ €μ λ€. μ΄λ¬ν μ΄μ λ‘ λΉλμ μ±κ³΅νκΈ°κΉμ§μ κ³Όμ μμ λ°μν λ¬Έμ λ€μ κΈ°λ‘ν΄λ³΄κ³ μ νλ€.
μ ν¨μ€ κ΄λ¦¬ > Nodes and Clouds
λΆμ° λΉλ νκ²½μ μ ν¨μ€ ν΄λ¬μ€ν°λ₯Ό ꡬμ±νλ κ²μ μ ν¨μ€ κ΄λ¦¬μμ Nodes and Clouds λ©λ΄λ₯Ό ν΅ν΄ μνν μ μλ€. μμ΄μ νΈλ₯Ό λ±λ‘νλ λ°©μμ λ°λΌ λ Έλλ 리λ μ€ μλ² λλ VM λ¨Έμ μμ λΉλλ₯Ό μννκ³ ν΄λΌμ°λλ λ컀 컨ν μ΄λ λλ μΏ λ²λ€ν°μ€μ κ°μ νκ²½μΌλ‘ λΉλλ₯Ό μννλ κ²μ΄λΌκ³ μκ°νλ©΄ λλ€. μ ν¨μ€ μλ²κ° EC2μ μ€μΉλμ΄μλ€κ³ νλλΌλ EC2μ λ컀 μμ§κ³Ό 컨ν μ΄λκ° μ€μΉλμ΄μλ€λ©΄ λ컀 μμ§μ μ λμ€ λλ©μΈ μμΌμ ν΅ν΄ ν΄λΌμ°λ μμ΄μ νΈλ₯Ό λ±λ‘ν μ μλ€.
λ Έλ μμ΄μ νΈλ₯Ό λ±λ‘νλ λ°©λ²μλ μ ν¨μ€ μλ²μμ SSHμ κ°μ λ°©μμΌλ‘ μ°κ²°μ κ΄λ¦¬νλ κ²κ³Ό λ³λμ μλμ°λ 리λ μ€ μλ²μ κ°μ κ³³μμ μ€νλ λ Έλ μμ΄μ νΈκ° μ ν¨μ€ μλ²μ νΉμ ν¬νΈλ₯Ό μ¬μ©νμ¬ μ°κ²°μ μꡬνλ λ°©μμΌλ‘ λλμ΄μ§λ€. μ ν¨μ€ μλ²μ Elastic IPκ° ν λΉλμ΄μμΌλ―λ‘ κ΅³μ΄ VPC κ° μ°κ²°μ μνν μ μλλ‘ μμ μ νμ§ μλλΌλ λ Έλ μμ΄μ νΈμμ μ ν¨μ€ μλ²μ TCP μ°κ²°μ μνν μ μλλ‘ μΈλ°μ΄λ κ·μΉλ§ μ€μ νλ©΄ λλ κ°λ¨ν λ°©μμ΄λΌ νμλ₯Ό μ ννλ€. λ Έλ μμ΄μ νΈκ° μ€νλ μλ²λ μ€λ₯ νΈλνΉ μμ€ν μ΄ κ΅¬λλλ μλ²λ‘ λ―Έλ¬ νλ‘λΉμ λ μνλ‘ λ³΄κ³ λ EC2(Amazon Linux 2023μΌλ‘ μ€νλ μ μΌν EC2)λ₯Ό λ Έλλ‘ μΆκ°νκΈ°λ‘ νλ€.
Launch method β Launch agent by connecting it to the controller
μλ°λ‘ μ€νλλ λ Έλ μμ΄μ νΈμμ 컨νΈλ‘€λ¬(λ§μ€ν°)μ μ°κ²°νλ λ°©μμΌλ‘ λ Έλ μμ΄μ νΈμμ μ ν¨μ€ μλ²μ μ°κ²°ν μ μλ TCP ν¬νΈλ₯Ό μꡬνλ―λ‘ μ ν¨μ€ κ΄λ¦¬ > Security λ©λ΄μ Agents νλͺ©μμ TCP port for inbound agentsμ λν μ€μ μ Fixedλ‘ μ ννμ¬ 50000λ² ν¬νΈλ‘ μ λ ₯νλ€. μ ν¨μ€ μλ²μμ λ Έλλ₯Ό μΆκ°νλ©΄ μ ν¨μ€ μλ²λ‘ λΆν° μλ° μμ΄μ νΈ νμΌμ λ€μ΄λ‘λν μ μλ μ¬λ¬κ°μ§ λͺ λ Ήμ΄λ₯Ό μ 곡ν΄μ€λ€. λ Έλ μμ΄μ νΈλ₯Ό μ€μΉνλ €λ νκ²½μ λ§κ² 볡μ¬ν΄μ νΈμΆνλ©΄ λλ€.
μ ν¨μ€ μλ²μ μλ° μμ΄μ νΈκ° μ°κ²°ν μ μλλ‘ λ³΄μ κ·Έλ£Ήμ TCP 50000λ² ν¬νΈλ₯Ό μΈλ°μ΄λ κ·μΉμΌλ‘ μΆκ°ν΄μΌ νλ€. λν, μΌλ°μ μΌλ‘ λ Έλ μμ΄μ νΈλ₯Ό μ°κ²°νλ ν¬νΈκ° 50000λ²μ μ¬μ©νλ κ²μΌλ‘ μλ €μ Έ μκΈ°μ 보μμ μΈ κ΄μ μ λμ΄μΌνλ€λ©΄ λ³λμ ν¬νΈλ₯Ό μ§μ νλ κ²μ μΆμ²νλ€.
Usage β Only build jobs with label expressions matching this node
λ Έλ μμ΄μ νΈλ₯Ό μΆκ°νλ μ΄μ λ λΆμ° λΉλμ λͺ©μ μ΄ μλ Node.js 18 LTSλ₯Ό μ¬μ©νμ¬ νλ‘ νΈμλ μ ν리μΌμ΄μ μ½λλ₯Ό λΉλνμ¬ λ°°ν¬ν μ μλ νκ²½μ λ§λ€κ³ μ ν¨μ μμΌλ―λ‘ κΈ°μ‘΄μ λμνλ νλ‘μ νΈλ€μ κ·Έλλ‘ μ ν¨μ€ μλ²μμ μνν μ μλλ‘ νΉμ νλ‘μ νΈμμ λ³λλ‘ λΌλ²¨μ μ§μ νμ¬μΌλ§ ν΄λΉ λ Έλλ₯Ό ν΅ν΄ λΉλλ₯Ό μνν μ μλλ‘ νμλ€. μ ν¨μ€ μλ²μ λ Έλ μμ΄μ νΈλ₯Ό μΆκ°νλ κ³Όμ μμλ μΌλΆ νλ‘μ νΈκ° λΉλλ κ°λ₯μ±μ΄ μμΌλ―λ‘ μλͺ»λ νκ²½μμ λΉλλμ΄ λ°°ν¬λλ κ²μ λ§κ³ μνλ μ΅μνμ μ‘°μΉμ΄λ€.
Clouds > Docker Cloud details
λ Έλκ° μλ λ컀 컨ν μ΄λ νκ²½μμ λΉλλ₯Ό μννκ³ μ νλ κ²½μ° ν΄λΌμ°λλ₯Ό ν΅ν΄ λ컀 μμ΄μ νΈλ₯Ό λ±λ‘νλ©΄ λλ€. μμ μΈκΈνλ―μ΄ μ ν¨μ€ μλ² λ΄μ μ€μΉν λ컀 μμ§μ μ°κ²°νκ³ μ νλ κ²½μ° μ λμ€ λλ©μΈ μμΌ λ°©μμ unix:///var/run/docker.sockμ μ§μ νλ©΄ λλ©° λ³λμ μλ²μ λ컀 μμ§μ μ°κ²°νκ³ μ νλ κ²½μ°μλ ν΄λΉ μλ²μμ λ컀 μμ§μ μ€νν λ TCP μ°κ²°μ μνν μ μλλ‘ μλμ κ°μ΄ μλΉμ€λ₯Ό μμ νκ³ λ€μ μ€νν΄μΌνλ€.
vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
sudo systemctl daemon-reload
sudo service docker restart
curl http://localhost:2375/version
λ§μ½, 리λ μ€ μλ²κ° μλ μλμ° λλ λ§₯ νκ²½μ λ컀 λ°μ€ν¬νμμλ TCP μ°κ²°μ νμ±νν λ°©λ²μ΄ μμ μ μμΌλ λ³λμ λ°©λ²μ μ°Ύμ보μμΌ νλ€. λ§₯μ κ²½μ° socatμ ν΅ν΄ TCPμ μ λμ€ λλ©μΈ μμΌμ μ°κ²°νλ μ°ν λ°©λ²μ΄ μλ κ² κ°λ€.
λ컀 μμ΄μ νΈ μ΄λ―Έμ§ (Optional)
μ²μμλ λ컀 μμ΄μ νΈλ₯Ό μΆκ°νκ³ λμ μμ΄μ νΈ ν νλ¦Ώμ λ±λ‘νλ κ³Όμ μμ μμ΄μ νΈ μ΄λ―Έμ§λ₯Ό jenkins/agentλ₯Ό μ¬μ©νλλ‘ νμΌλ μ€μ λ‘ νλ‘μ νΈλ₯Ό λΉλνλ €λ κ³Όμ μμ μΌλΆ ν¨ν€μ§κ° μμ΄μ μ€λ₯κ° λ°μν¨μ λ°λΌ jenkins/agent:jdk17λ₯Ό λ² μ΄μ€λ‘ νμ¬ λ³λμ μμ΄μ νΈ μ΄λ―Έμ§λ₯Ό λ§λ€μ΄μ μ¬μ©ν΄μΌνλ€.
FROM jenkins/agent:jdk17
USER root
RUN apt-get update \
&& apt-get install build-essential python3 -y
USER jenkins
μ μ΄λ―Έμ§λ μ¬μ©μ€μΈ λΌμ΄λΈλ¬λ¦¬μ λ°λΌ g++ λλ python3 λ₯Ό μ°Ύμ μ μλ€λ μ€λ₯κ° λ°μνμ¬ μΆκ°ν κ²μΌλ‘ μ‘°μ§μμ μ¬μ©νλ λ컀 νλΈ κ³μ μ νΌλΈλ¦ 리νμ§ν 리μ μ¬λ ΈμΌλ©° νλΌμ΄λΉ νκ²½μ΄λΌλ©΄ Registry Authentication μ€μ μ΄ μꡬλλ€.
μ ν¨μ€ κ΄λ¦¬ > Security > Git Host Key Verification configuration
νλ‘μ νΈμμ λΉλν μμ€μ½λλ₯Ό κ°μ Έμ€κΈ° μν΄ κΉμ μ¬μ©νλ κ²½μ° SSH Host Key verificationμ Host Key Verification Strategyκ° Known hosts fileμ΄ κΈ°λ³Έκ°μΈ κ΄κ³λ‘ μ¬λ μ΄λΈ λ
Έλ μμ΄μ νΈλ ν΄λΌμ°λλ‘ μΆκ°ν λ컀 μμ΄μ νΈμμ λΉλλ₯Ό μννλ κ²½μ° No ECDSA host key is known for github.com and you have requested strict checking. Host key verification failed.
μ κ°μ μ€λ₯κ° λ°μν μ μλ€.
git ls-remote -h git@github.com:[user]/[project].git HEAD
λ Έλ λ¨Έμ μ΄λ λ컀 μμ΄μ νΈλ‘ μ€νλλ 컨ν μ΄λμ ~/.ssh/known_hosts νμΌμ΄ μκΈ° λλ¬Έμ΄λ©° μμ κ°μ΄ κΉνλΈ νΈμ€νΈμ λν μ§λ¬Έμ μ΅μν νλ²μ΄λΌλ μΆκ°νμ¬ known_hosts νμΌμ λ§λλ κ²μ΄ μꡬλ μ μλ€. λ§μ½, λ컀 μμ΄μ νΈμμ λ컀 컨ν μ΄λλ₯Ό λ§λλ κ²½μ° μ λͺ λ Ήμ΄λ₯Ό μνν μ μκΈ°μ λ컀 μμ΄μ νΈλ‘ μ°κ²°λλ μλ²μμ μ λͺ λ Ήμ΄λ₯Ό μνν ν λ§μ΄νΈ μ΅μ μ ν΅ν΄ known_hosts νμΌμ μ λ¬νλλ‘ μ€μ νλ κ²λ λ°©λ²μ΄λ€.
Container settings > Mounts
μμ κ°μ΄ Docker Agent Templatesλ₯Ό λ±λ‘νλ μ€μ μμ Container settings > Mounts μ΅μ
μ ν΅ν΄ μ λͺ
λ Ήμ΄λ‘ λ§λ€μ΄μ§ known_hosts νμΌμ 곡μ ν μ μλλ‘ type=bind,src=/home/ec2-user/.ssh,dst=/home/jenkins/.ssh
μ κ°μ λ°©μμΌλ‘ μ
λ ₯νλ©΄ λλ€.
μ ν¨μ€ μλ²μ λΆμ° λΉλ νκ²½ ꡬμ±μ λν νν 리μΌμ μλκΈ° λλ¬Έμ μλ΅ν μ λ³΄κ° λ§μ μ μμ§λ§ μΌλΆμ λ΄μ©λ§μΌλ‘λ λμμ΄ λκΈ°λ₯Ό λ°λλ³Έλ€.