Lilyrs

Gitlab CI에서 배포된 Hexo 포스트의 Permalink 날짜가 잘못 생성된 경우

원래 이 블로그는, Gitlab CI/CD Pipeline 을 적용하기 전엔 Hexo 3의 명령행 도구를 통해 HTML만 정적 블로그 저장소에 디플로이하여 호스트하고 원본 코드는 내 로컬 PC에 관리되던 블로그였다.

물론 지금은 커밋 후 푸시와 동시에 파이프라인이 동작하고, 내 블로그는 정해진 절차에 따라 자동으로 배포된다. 이 얼마나 편리한가.

그러나 몇가지 문제가 있었다. CI/CD 파이프라인 처리를 위해 사용되는 컨테이너 환경과 연관이 있었는데,

첫번째는, _posts 내부에 별도로 파일명 명명 규칙없이(예를 들어 2019-01-01-본문 제목.md) 만들어둔 파일들은 로컬에서 정렬 순서가 유지되었지만 디플로이 후에 순서는 모두 엇나간 문제이다.

두번째로, 간신히 날짜 정보를 파일명과 본문 내에서 인식하도록 수정하여 올려두었지만, Permalink (영구적으로 접근 가능한 경로)의 날짜 필드가 로컬 PC와는 다르게 생성되었다. 마치, 9시간[1] 뒤로 돌아가버린 것처럼 말이다. 예를 들어 로컬에선 9월 5일자로 인식되던 글이, 컨테이너 안에서는 9월 4일로 처리되는 것처럼 말이다.

첫번째 문제는 날짜 정보를 포스트에 추가함으로써 해결했고[2], 두번째의 경우는 Hexo 의 설정파일인 _config.yml 을 사용하여 처리하려했으니 이미 이 파일은 Asia/Seoul 시간대로 잘 설정되어있었기 때문에 다른 부분을 의심해야만 했다.

결국 permalink date is incorrect if the time zone of _config.yml and the time zone setting of the machine are different 라는 Github 이슈를 찾아보게 되었다. 해당 이슈는 아직 Open 상태이며, 완전히 해결되진 않았다. 이외에도 Permalink의 날짜가 잘못 생성되었다는 이슈는 꽤 많이 보인다.

몇가지를 더 찾아본 끝에 Possible dates bug lib/plugins/processor/post.js 까지 도달했는데, 아무래도 post.js 내부에서 날짜를 처리하는 부분에서 로컬 시스템의 타임존 세팅의 영향을 받는 것 같은 부분이 보인다. 예를 들면,

1
data.date = data.date ? moment(data.date) : moment();

그래서 CI/CD 파이프라인에서 사용할 컨테이너에 TZ, 타임존 환경변수를 설정해두는 걸 권장한다. 실제로 설정하여 해결하였으니, 이 링크 를 통해 TZ 라는 환경변수에 Asia/Seoul 이라는 값을 설정해주고 다시 빌드해보길 권한다.

일단 컨테이너의 기본 세팅이 보통 UTC로 되어있을 가능성이 높긴한데, 그래도 _config.yml 에도 설정되어있는 타임존 정보를 활용하지 못하고 시스템 타임존 설정에 영향을 받는다니 좀 의외이다.


  1. 1.이 9시간의 시간 차이를 보고 뭔가 눈치채기 좋다. 한국은 서울 기준 GMT+9 시간대를 유지하고 있기 때문이다. 자세한 건 Coordinated Universal Time 를 참고하기 바란다.
  2. 2.Hexo writing - FilenameHexo Front Matter 에서 제공하는 date: 필드를 함께 이용하고 있다. hexo new 커맨드를 이용하여 만든 포스트 뼈대엔 해당 필드가 자동생성되어있다.