vi Dockerfile
FROM ubuntu:20.04
ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8
RUN touch /etc/default/locale
RUN echo 'export TEST=LJS' >> ~/.bashrc
RUN apt-get update && \
apt-get install -y curl wget cron unzip vim software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa && \
apt-get update && \
apt-get install -y python3.7
RUN apt-get install -qq -y init systemd
RUN curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
./aws/install && \
rm awscliv2.zip && \
rm -rf aws
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1
RUN apt-get install -y fontconfig openjdk-17-jre
RUN wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian/jenkins.io-2023.key
RUN echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian binary/ | tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
RUN echo "Acquire::Check-Valid-Until \"false\";\nAcquire::Check-Date \"false\";" | cat > /etc/apt/apt.conf.d/10no--check-valid-until
RUN apt-get update && \
apt-get install -y jenkins
COPY run_check_jenkins.sh /run_check_jenkins.sh
RUN chmod +x /run_check_jenkins.sh
RUN echo "*/5 * * * * /run_check_jenkins.sh >> /var/log/cron.log 2>&1" | crontab -
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN systemctl mask systemd
CMD ["/usr/sbin/init"]
vi jenkins_start.sh
#!/bin/bash
docker build -t jenkins .
docker run -d -p 80:8080 --privileged --name js-jenkins jenkins
sleep 20
docker exec -it js-jenkins cat /var/lib/jenkins/secrets/initialAdminPassword
vi run_check_jenkins.sh
#!/bin/bash
jenkins_war="/usr/share/java/jenkins.war"
count=$(ps -ef | grep "$jenkins_war" | grep -v grep | wc -l)
if [ "$count" -eq 0 ]; then
systemctl restart jenkins
echo "jenkins is restart."
else
echo "jenkins is already running."
fi
vi run_check_jenkins.sh
#!/bin/bash
export LANG=ko_KR.UTF-8
export LC_ALL=ko_KR.UTF-8
jenkins_war="/usr/share/java/jenkins.war"
count=$(ps -ef | grep "$jenkins_war" | grep -v grep | wc -l)
webhook_url="https://hooks.slack.com/services/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"
get_jenkins_status() {
if [ "$count" -eq 0 ]; then
echo "중지"
else
echo "실행 중"
fi
}
timestamp=$(TZ='Asia/Seoul' date +'%Y년 %m월 %d일 %H시 %M분 %S초')
if [ "$count" -eq 0 ]; then
systemctl restart jenkins
action_message="젠킨스를 재시작합니다."
else
action_message="젠킨스가 실행 중입니다."
fi
curl -X POST -H "Content-Type: application/json" -d "{
\"text\": \"\",
\"attachments\": [
{
\"color\": \"#36a64f\",
\"pretext\": \"*제목: 젠킨스 상태 확인*\",
\"fields\": [
{
\"title\": \"상태\",
\"value\": \"$(get_jenkins_status)\",
\"short\": true
},
{
\"title\": \"시간\",
\"value\": \"$timestamp\",
\"short\": true
},
{
\"title\": \"메시지\",
\"value\": \"$action_message\",
\"short\": true
}
]
}
]
}" "$webhook_url"
vi Dockerfile
FROM ubuntu:20.04
ENV TZ Asia/Seoul
ENV PYTHONIOENCODING UTF-8
ENV LC_CTYPE C.UTF-8
RUN touch /etc/default/locale
RUN echo 'export TEST=LJS' >> ~/.bashrc
RUN apt-get update && \
apt-get install -y curl wget cron unzip vim software-properties-common
RUN add-apt-repository ppa:deadsnakes/ppa && \
apt-get update && \
apt-get install -y python3.7
RUN apt-get install -qq -y init systemd
RUN curl "https://d1vvhvl2y92vvt.cloudfront.net/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" && \
unzip awscliv2.zip && \
./aws/install && \
rm awscliv2.zip && \
rm -rf aws
RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1
RUN apt-get install -y fontconfig openjdk-17-jre
RUN wget -O /usr/share/keyrings/jenkins-keyring.asc \
https://pkg.jenkins.io/debian/jenkins.io-2023.key
RUN echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian binary/ | tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
RUN echo "Acquire::Check-Valid-Until \"false\";\nAcquire::Check-Date \"false\";" | cat > /etc/apt/apt.conf.d/10no--check-valid-until
RUN apt-get update && \
apt-get install -y jenkins
COPY run_check_jenkins.sh /run_check_jenkins.sh
RUN chmod +x /run_check_jenkins.sh
RUN echo "*/5 * * * * /run_check_jenkins.sh >> /var/log/cron.log 2>&1" | crontab -
RUN curl -s https://get.docker.com | sh
RUN usermod -aG docker jenkins
RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*
RUN systemctl mask systemd
CMD ["/usr/sbin/init"]
트리거를 GitHub hook으로 설정
GitHub Repository에 Webhook 추가
SCM을 GitHub Repository와 위에서 생성한 Credentials로 설정
Jenkins의 빌드 넘버와 latest 태그로 빌드
Docker Hub에 정상적으로 저장되면 모든 이미지 삭제
pipeline {
agent any
environment {
DOCKER_USERNAME = credentials('username')
DOCKER_PASSWORD = credentials('password')
}
stages {
stage('Build Docker Image') {
steps {
script {
withCredentials([string(credentialsId: 'username', variable: 'DOCKER_USERNAME'),
string(credentialsId: 'password', variable: 'DOCKER_PASSWORD')]) {
sh "docker build -t $DOCKER_USERNAME/jenkins:${currentBuild.number} ."
sh "docker build -t $DOCKER_USERNAME/jenkins:latest ."
}
}
}
}
stage('Docker Login') {
steps {
script {
withCredentials([string(credentialsId: 'username', variable: 'DOCKER_USERNAME'),
string(credentialsId: 'password', variable: 'DOCKER_PASSWORD')]) {
sh 'docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD'
}
}
}
}
stage('Docker Push') {
steps {
script {
withCredentials([string(credentialsId: 'username', variable: 'DOCKER_USERNAME'),
string(credentialsId: 'password', variable: 'DOCKER_PASSWORD')]) {
sh "docker push $DOCKER_USERNAME/jenkins:${currentBuild.number}"
sh 'docker push $DOCKER_USERNAME/jenkins:latest'
}
}
}
}
}
post {
success {
script {
sh 'docker rmi $(docker images -q)'
}
echo 'Docker image build, login, push, and local image cleanup successful!'
}
failure {
echo 'One or more stages failed. Check the logs for details.'
}
}
}