Thoughts, stories and ideas.

Docker - Jenkins 컨테이너에 jq 설치하기

Jenkins는 지속적 통합(CI) 및 지속적 배포(CD)를 자동화하는 데 널리 사용되는 오픈 소스 자동화 서버입니다. 때로는 Jenkins 파이프라인이나 스크립트 내에서 JSON 데이터를 처리해야 할 필요가 있을 수 있습니다. 이런 경우, **jq**는 매우 유용한 도구입니다. **jq**는 커맨드라인 JSON 프로세서로, JSON 형식의 데이터를 다루기 위한 강력한 도구입니다. 이 글에서는 Docker를 사용하여 Jenkins 컨테이너에 **jq**를 설치하는 방법을 안내합니다.

시작하기 전에

이 글을 따라 하기 위해서는 Docker와 Docker Compose가 설치되어 있어야 합니다. Docker Compose를 사용하면 여러 컨테이너의 설정을 docker-compose.yml 파일 하나로 관리할 수 있어 편리합니다.

Dockerfile 생성

첫 번째 단계는 **jq**를 포함한 커스텀 Jenkins 이미지를 만들기 위한 **Dockerfile**을 생성하는 것입니다. 아래는 해당 **Dockerfile**의 예시입니다:

# Dockerfile
FROM jenkins/jenkins:lts
USER root
RUN apt-get update && \
    apt-get install -y jq && \
    rm -rf /var/lib/apt/lists/*
USER jenkins

이 **Dockerfile**은 공식 Jenkins LTS 이미지를 기반으로 하며, root 사용자로 전환하여 **jq**를 설치한 후, 다시 jenkins 사용자로 전환합니다.

docker-compose.yml 수정

다음으로, docker-compose.yml 파일을 수정하여 위에서 생성한 **Dockerfile**을 사용하도록 설정합니다:

version: '3'
services:
 jenkins:
   build: .
   container_name: 'jenkins'
   restart: always
   ports:
     - '9090:8080'
     - '50000:50000'
   volumes:
     - '~/jenkins:/var/jenkins_home'
     - '/var/run/docker.sock:/var/run/docker.sock'
   environment:
     TZ: 'Asia/Seoul'

여기서 **build: .**는 현재 디렉토리에 있는 **Dockerfile**을 사용하여 이미지를 빌드하라는 의미입니다.

컨테이너 빌드 및 실행

모든 설정이 완료되었다면, 다음 명령어를 사용하여 컨테이너를 빌드하고 실행할 수 있습니다:

docker-compose up --build

이 명령어는 docker-compose.yml 파일에 정의된 설정에 따라 컨테이너를 빌드하고 실행합니다. --build 옵션은 이미지가 존재하지 않거나 **Dockerfile**이 변경된 경우 이미지를 다시 빌드하라는 지시입니다.

결론

이제 Jenkins 컨테이너 내부에서 **jq**를 사용하여 JSON 데이터를 쉽게 처리할 수 있습니다. 이 방법을 통해 Jenkins 파이프라인이나 스크립트에서 JSON 관련 작업을 보다 효율적으로 수행할 수 있게 되었습니다.


활용

| 슬렉 자동알림 : Post build task - Script

#!/bin/bash
cd /var/jenkins_home/workspace/subfolder
git_previous_successful_commit=$GIT_PREVIOUS_SUCCESSFUL_COMMIT
git_current_commit=$GIT_COMMIT
commit_messages=$(git log --pretty=format:"%h - %s" $git_previous_successful_commit..$git_current_commit)

JSON_PAYLOAD=$(jq -n \
  --arg token "xoxb-..." \
  --arg channel "..." \
  --arg text "
    subfolder 배포알림
    https://subfolder.ai
    <변경사항>
    $commit_messages
    " \
  '{token: $token, channel: $channel, text: $text}')

curl -X 'POST' \
  'https://.../v1/send/slack' \
  -H 'accept: application/json' \
  -H 'x-api-key: ...' \
  -H 'Content-Type: application/json' \
  -d "$JSON_PAYLOAD"