Jenkins build시 에러가 발생한다.
output log를 보면 아래와 같이 나타난다.
15:48:12 Login Succeeded
[Pipeline] {
[Pipeline] sh
15:48:12 + docker push ....
15:48:12 1a47e87836f0: Preparing
15:48:12 59cb78737c11: Preparing
15:48:12 432e22ca3ea4: Preparing
15:48:12 954be880ce7c: Preparing
15:48:12 cd5a0a9f1e01: Preparing
15:48:12 eafe6e032dbd: Preparing
15:48:12 92a4e8a3140f: Preparing
15:48:12 eafe6e032dbd: Waiting
15:48:12 92a4e8a3140f: Waiting
15:48:12 cd5a0a9f1e01: Layer already exists
15:48:12 954be880ce7c: Layer already exists
15:48:12 eafe6e032dbd: Layer already exists
15:48:12 92a4e8a3140f: Layer already exists
15:48:12 59cb78737c11: Pushed
15:48:12 1a47e87836f0: Pushed
15:48:12 error parsing HTTP 413 response body: invalid character '<' looking for beginning of value: "<html>\r\n<head><title>413 Request Entity Too Large</title></head>\r\n<body>\r\n<center><h1>413 Request Entity Too Large</h1></center>\r\n<hr><center>nginx/1.22.1</center>\r\n</body>\r\n</html>\r\n"
[Pipeline] }
[Pipeline] // withDockerRegistry
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Image-CleanUp)
Stage "Image-CleanUp" skipped due to earlier failure(s)
[Pipeline] }
nginx에서 "error parsing HTTP 413 response body: invalid character '<' looking for beginning of value: "\r\n413 Request Entity Too Large" 에러가 발생한 것을 알 수 있다.
즉, nginx proxy에서 요청하는 값이 너무 커서 실패하는 것으로 보인다.
image는 harbor에서 가져오니, harbor에서 사용하는 nginx.conf를 확인해보자.
$ cat harbor.conf
server {
listen 443 ssl;
server_name harbor.com;
ssl_certificate /etc/nginx/tls/tls.crt;
ssl_certificate_key /etc/nginx/tls/tls.key;
ssl_session_timeout 5m;
location / {
proxy_pass http://***.***.***.***;
}
}
음... client_max_body_size에 대한 내용이 없다.
이러면 default값인 1MiB로 정의가된다.
1MiB보다 높은 용량의 파일이 요청되면 413 error가 발생한다.
$ cat harbor.conf
server {
listen 443 ssl;
server_name harbor.com;
ssl_certificate /etc/nginx/tls/tls.crt;
ssl_certificate_key /etc/nginx/tls/tls.key;
ssl_session_timeout 5m;
+ client_max_body_size 0;
location / {
proxy_pass http://***.***.***.***;
}
}
client_max_body_size 0 을 추가해주자.
(limit을 해제해서 파일 크기에 상관없이 받도록)
이후로는 정상 build가 되며 413 error는 발생하지 않게된다.
추가로 현재 사용하는 jenkins는 사설 인증서로 변경하자.
10년의 사설인증서로 우선 인증서를 생성한다.
# 1. Certificate Authority 생성
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=KR/ST=Seoul/L=Seoul/O=Test/OU=Test/CN=harbor.com" \
-key ca.key \
-out ca.crt
# 2. CSR생성
openssl genrsa -out server.key 4096
openssl req -sha512 -new \
-subj "/C=KR/ST=Seoul/L=Seoul/O=company/OU=Test/CN=harbor.com" \
-key server.key \
-out server.csr
# 3. Subject Alternative Name 파일생성
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.com
IP.1=***.***.***
EOF
# 4. 서버 인증서 생성
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in server.csr \
-out server.crt
인증서 생성 후 jenkins container를 재시작하면 적용이 된다.