Jenkins 파이프라인 to Build Image / Push Image on Kubernetes

Posted by Just Do It ! 행동하지 않으면 성공도 실패도 없다 on Monday, January 11, 2021

Jenkins 설치 On K8s

Prerequisites

  • Docker pipeline plugin
  • Google container registry for authenticate
  • Kubernetes config

Remote Docker Server

docker daemon 에서 0.0.0.0:4243 을 추가해서 원격에서 tcp 로 접속할 수 있도록 한다.

# File : /etc/default/docker
DOCKER_OPTS="--dns 8.8.8.8 -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock"
# File : /lib/systemd/system/docker.service
EnvironmentFile=/etc/default/docker
ExecStart=/usr/bin/docker -H fd:// $DOCKER_OPTS --containerd=/run/containerd/containerd.sock

또는

# File : /etc/docker/deamon.json
..
"hosts": ["tcp://0.0.0.0:4243", "unix:///var/lib/docker.sock", "fd://"],
..
# File : /lib/systemd/system/docker.service
ExecStart=/usr/bin/docker --containerd=/run/containerd/containerd.sock

또는 ssh 로 접속하도록 할 수 있는데, 이 경우 ssh-copyid 로 미리 authorizedeky 로 등록 해 줘야한다. ssh://ubuntu@10.10.10.10

docker.withServer("tcp://10.10.10.10:4243")

Jenkins Inegrate with Git Server

Build Image

Jenkinsfile 에서 컨테이너 이미지를 빌드하기 위해서 docker.build 를 사용한다. docker 는 docker workflow

stage('Build credit-demo image')  {
  when { branch 'master' }
  steps {
    script {
      dockerImage = docker.build('gcr.io/pa-jhwang/credit-demo')
    }
  }
}

Push Image to Container Registry

DockerHub

jenkins » credentials 에서 username / password 로 docker hub 인증정보를 생성하고, credentialsId 를 확인한다.

docker.withRegistry("https://registry.hub.docker.com", "<credentialsId>")  {
  app.push("<tags>")
  app.push("lastest")
}

Google Container Registry (GCR)

gcr에 컨테이너 이미지를 Push 하기 위해서는 google cloud 의 credential (json or pk12) 가 필요하다. <- GCP > API Manager > Credentials 에서 key 를 생성하고 json 을 다운로드 받는다. service account 는 storage admin role 을 가지고 있어야 한다.

jenkins » credentials 에서 google container registry for authenticate 를 위한 plugin 을 다운로드 받아서 설치한다. 위에서 다운로드 받은 gcp-credentials.json 을 jenkins credentials 로 등록하고 credentialsId 를 확인한다.

container image의 tag에 timestamp 를 적용할려면

stage('Push to registry') {
  steps {
    script {
      def build_time = new Date()
      def sdf = new SimpleDateFormat("yyyyMMddHHmm")
      // docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-jhwangdemo') {
      docker.withRegistry('https://gcr.io', 'gcr:pa-jhwang') {
        dockerImage.push("${sdf.format(build_time)}-${env.BUILD_NUMBER}")
        dockerImage.push("latest")
      }
    }
  }
}

Deploy to kubernetes