private 리포지토리에서도 Jenkins와 S3를 사용하여 GithubPages와 같은 것을 시도했습니다.

목적



Github의 private 리포지토리에서 관리하는 정적 콘텐츠를 master 브랜치에 병합한 타이밍에 Jenkins에서 자동으로 AWS S3 버킷으로 전송하여 특정 IP에서만 볼 수 있도록 합니다.

배경



Github의 private 저장소에서도 GithubPages와 같은 기능을 실현할 필요가 있었다.
한편, 특정 IP로부터만의 열람 제한을 걸 필요가 있었다.

요점



Jenkins


  • Github에서 Webhook에서 실행되는 Job 정의
  • Jenkins의 Job 내에서 AWS-cli를 사용하여 S3 버킷으로 전송

  • Github



  • 개인 저장소에서 정적 콘텐츠 관리
  • Webhook 기능을 사용하여 Github 병합을 Jenkins에 알립니다.

  • S3


  • S3 버킷을 웹 사이트 호스팅
  • S3 버킷 정책을 활용하여 특정 IP만 허용 목록에 추가

  • 참고로 한 기사


  • 【전자동 잡용 오타니】 Github에 push를 받고 Jenkins의 Job을 실행해 보자
  • 【이외로 간단】 S3 버킷에 IP 제한을 가하는 방법
  • - GitHub-Jenkins 연계 우선 메모

  • 작업



    Jenkins



    Github의 Webhook용 IP 권한



    Github로부터 Webhook 통지를 받을 때는, 이하의 IP로부터 통신이 있는 것 같기 때문에, 보안 그룹이 되고 conf 파일이 되어, IP를 허가할 필요가 있습니다.

    ip
    ①192.30.252.0/22
    ②185.199.108.0/22
    

    ※ 자세한 내용은 이쪽

    SSH 키 발급



    그런 다음 Jenkins 서버에서 Jenkins 사용자의 SSH 키를 발행합니다.
    이번에는 우선 이하의 커맨드로 바삭하게 작성해 버립니다.

    command
    ssh-keygen -t rsa
    

    여기서 만들어진 공개키는 나중에 Github 측에 등록하므로 삼가합시다.

    Github 연결에 대한 자격 증명 만들기



    다음에 위에서 작성한 비밀키를 사용해 Github와 접속하기 위한 인증 정보를 Jenkins에서 등록합니다.



    Job 만들기



    다음으로 Github에서 Webhook을 받았을 때 실행할 Job을 만들어 보겠습니다.



    여기서 눌려야 할 포인트는
  • 자격 증명에 방금 만든 것을 선택합니다.

  • 알림을받을 분기 이름을 지정합니다
  • 분기를 체크 아웃 할 디렉토리를 지정합니다 (필요한 경우)

  • 덧붙여 방금 등록하고 있던 인증 정보가 잘못되어 있으면, 선택했을 때에 이하와 같은 인증 에러가 나오므로 설정을 다시 한번 재검토합시다.



    그런 다음 Job에서 실행할 쉘을 정의합니다.
    이번에는 AWS-cli로 전송하므로 다음과 같습니다.

    command
    aws --profile {対象プロフィール} s3 cp {チェックアウトディレクトリ} s3://{対象バケット名}  --recursive --acl public-read
    

    위의 명령은 재귀적(--recursive)에 공개 설정(public-read)으로 체크아웃한 파일 모두를 전송한다는 설정이 되어 있습니다.
    특정 파일을 전송하고 싶지 않아! 등이 있으면 각자 기호로 조정하십시오.

    이것으로 Jenkins 측 설정이 완료됩니다.

    Github



    SSH 설정



    방금 만든 Jenkins의 공개 키를 등록합니다.
    복사하고 저장! !



    Webhook 설정



    그런 다음 Jenkins에게 알림을 실행하려는 리포지토리에 Webhook을 설정합니다.



    S3



    버킷 정책 설정



    다음과 같이 버킷 정책을 설정합니다.

    정책
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "PublicReadGetObject",
                "Effect": "Deny",
                "Principal": "*",
                "Action": "s3:*",
                "Resource": [
                    "arn:aws:s3:::{転送先バケット名}",
                    "arn:aws:s3:::{転送先バケット名}/*"
                ],
                "Condition": {
                    "NotIpAddress": {
                        "aws:SourceIp": [
                            "{許可するIP}",
                            "{JenkinsサーバーのIP}"
                        ]
                    }
                }
            }
        ]
    }
    

    ※Jenkins 서버로부터 AWS-cli로의 통신을 허가할 필요가 있으므로 잊지 않도록 설정합시다.



    확인



    이제 준비가 되었습니다.
    시험에 master 브랜치에 병합을 시도하십시오.

    Jenkins에서 Job이 달리고,



    S3로 콘텐츠가 전송되고,



    브라우저에서 표시됩니다.



    허용하지 않는 IP는 403 오류가 발생합니다.



    끝에



    뭐라고는 GithubPages의 완성☆

    좋은 웹페이지 즐겨찾기