Jenkins에서 Docker 빌드를 유발할때 몇가지 방법이 존재한다.

다음 기술된 방법은 그중의 한가지 방법이며,  Jenkins Master & Slave 를 구성하지 않고

외부 Jenkins 에서 Docker Build 를 유발하였다.


시작하기전.

  • Docker Jenkins 설치.
  • Docker 설치.
  • Docker Build Plugin 설치.


플러그인 설치

Jenkins 에서 Docker 빌드를 위한 플러그인을 다음과 같이 설치 했다.

https://wiki.jenkins.io/display/JENKINS/Docker+Plugin

https://wiki.jenkins.io/display/JENKINS/Docker+build+step+plugin



설정

Jenkins 관리 → 시스템설정 → Docker Builder 

Docker server REST API 를 사용하는 방법은 공식 사이트를 참조 한다.

https://docs.docker.com/develop/sdk/

호스트에 설치된 Docker server REST API URL 를 통하여 공유한다.

Test Connection 를 통하여 Connected to unix:///var/run/docker.sock 메세지 노출을 확인할 수 있다.

Linux 사용자이고 로컬 컴퓨터의 Docker API에 연결해야하는 경우 해당 URL은 unix:///var/run/docker.sock설명서에 언급 된 것과 같다.

기본적으로 Docker 데몬은 수신 대기 unix:///var/run/docker.sock하고 클라이언트는 데몬과 상호 작용하기 위해 루트 액세스 권한을 가져야한다.

docker라는 그룹이 시스템에 존재하면 docker는 소켓 소유권을 그룹에 적용한다.

Docker REST API에 원격으로 액세스 하는 경우

docker server rest api url jenkins
# /lib/systemd/system/docker.service
# sudo vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://0.0.0.0:1111
# systemctl daemon-reload
# sudo service docker restart
# curl http://localhost:1111/version
{"Version":"17.05.0-ce","ApiVersion":"1.29","MinAPIVersion":"1.12","GitCommit":"89


호스트의 Docker server REST API URL 설정이 끝나면,

Jenkins JOB 프로젝트 구성의 Steop 에서 다음과 같이 Execute Docker Command 로 명령어 실행을 할 수 있다.

차이점은 Docker server REST API 호스트를 공유하지않고 사용하는 경우에는  Execute Shell 로 다음과 같이 스크립트를 통한 Docker images를 생성하였다.

아래와 같이 스크립트 작성으로 실행해도 무관하나 사설 레지스트리를 이용하는 경우 레지스트리의 ID/PW가 자칫 공개될수 있는 보안적 이슈가 발생한다.

echo "REGISTRY_HOST ::::: " $REGISTRY_HOST
echo "JOB_NAME ::::: " + $JOB_NAME
echo "BUILD_NUMBER ::::: " + $BUILD_NUMBER
echo "WORKSPACE ::::: " + $WORKSPACE
cd $WORKSPACE
docker login {{docker registry ip}} -u {{user id}} -p {{user pw}}
docker build -f Dockerfile -t $JOB_NAME:$BUILD_NUMBER .
docker tag $JOB_NAME:$BUILD_NUMBER {{docker registry ip}}/$JOB_NAME:$BUILD_NUMBER
docker push {{docker registry ip}}/$JOB_NAME:$BUILD_NUMBER

Execute Docker Command 로 명령 및 실행을 하는 경우

레지스트리의 ID/PW가 공개되지 않고 보안적인 이슈까지 해결된다.

Jenkins 빌드를 진행하게 되면,

아래와 같이 빌드가 완료되고 Docker images 빌드 후 사설 레지스트리에 Push 된다.




  • No labels