nokoのブログ

こちらは暫定のメモ置き場ですので悪しからず

GitLabCICD環境構築メモ

はじめに

参考

構成例

f:id:noko_htn:20200202164711p:plain

環境構築メモ例

  • (以下、runnerをEC2サーバで構築する場合)
  • セキュリティグループ、サブネット、EC2インスタンス作成
  • EC2インスタンスにDocker, GitLab Runnerをインストール(サービス起動まで)
  • EC2インスタンスに下記設定
    • gitコマンドインストール
    • gitlab-runnerユーザをvisudoに追加
    • gitlab-runnerユーザをdocker groupに追加
  • GitLab Runnerの登録(トークン取得->EC2インスタンス側に設定)

CI/CD処理フロー例

  • 開発機からGitLabサーバにコードをpush
  • GitLab Runnerがリポジトリをcloneして、①./gitlab-ci.ymlの内容を実行する
    • ②Dockerfileをビルド
    • ③./docker/run_ci.shで、コンテナをrun
      • CMDで設定されている④./scripts/ci.shを実行

gitlab-ci.yml

before_script:
  - echo "Before script section"

after_script:
  - echo "After script section"

build:
  stage: build
  script:
    - echo "Build and Test section"
    - echo "$SERVICE_ACCOUNT_KEY" > ./config/gcp_key.json
    - docker build -t test_container:latest -f ./docker/Dockerfile ./docker
    - docker tag test_container:latest test_container:$CI_COMMIT_SHORT_SHA
    - cd ./docker && sh run_ci.sh && cd -
    - docker rm test_container

Dockerfile

FROM 520713654638.dkr.ecr.ap-northeast-1.amazonaws.com/sagemaker-pytorch:1.1.0-cpu-py3

ARG PYTHON_PASS=/usr/bin/python3.6

# apt install
RUN apt-get update && \
    apt-get install -y --no-install-recommends \
         curl \
         git \
         vim \
         groff-base # awscli

# pip install
COPY requirements.txt /tmp/
RUN $PYTHON_PASS -m pip install --upgrade pip && \
    $PYTHON_PASS -m pip install -r /tmp/requirements.txt

# install gcloud
RUN echo "deb [signed-by=/usr/share/keyrings/cloud.google.gpg] https://packages.cloud.google.com/apt cloud-sdk main" | tee -a /etc/apt/sources.list.d/google-cloud-sdk.list && \
   apt-get install -y apt-transport-https ca-certificates && \
   curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key --keyring /usr/share/keyrings/cloud.google.gpg add - && \
   apt-get update && apt-get install -y google-cloud-sdk

# install docker
RUN curl https://get.docker.com | sh

# make dir
RUN mkdir -p /opt/config \
             /opt/data/raw \
             /opt/data/interim \
             /opt/data/processed \
             /opt/data/external \
             /opt/features \
             /opt/logs \
             /opt/models \
             /opt/notebooks \
             /opt/reports \
             /opt/scripts \
             /opt/utils

# cd
WORKDIR /opt

# expose port
EXPOSE 6006
EXPOSE 8888

# exec CMD
CMD sh ./scripts/ci.sh

run_ci.sh

#!/bin/bash

# usage
SCRIPT_FILE=`basename $0`
function usage()
{
  echo "usage: ${SCRIPT_FILE} docker/nvidia-docker" 1>&2
}

# arguments
if [ $# -ne 1 ]; then
  usage
  exit 1
fi
DOCKER_CMD=$1

# constant
SCRIPT_DIR=$(cd $(dirname $0); pwd)
LOG_FILE=${SCRIPT_DIR}/../logs/docker.log
CONTAINER_NAME=sagemaker_pytorch_1_1_0_local
CONTAINER_IMAGE=sagemaker_pytorch_1_1_0_local
HOST_PORT=28888
CONTAINER_PORT=8888

# log
function log() {
  local fname=${BASH_SOURCE[1]##*/}
  echo "$(date '+%Y-%m-%dT%H:%M:%S') ${PROCNAME} (${fname}:${BASH_LINENO[0]}:${FUNCNAME[1]}) $@" | tee -a ${LOG_FILE}
}

# main
log "info start script"
log "info CONTAINER_NAME: ${CONTAINER_NAME}, CONTAINER_IMAGE: ${CONTAINER_IMAGE}, HOST_PORT: ${HOST_PORT}, CONTAINER_PORT: ${CONTAINER_PORT}"

${DOCKER_CMD} run --name ${CONTAINER_NAME} \
  --privileged \
  -v $(pwd)/../config:/opt/config \
  -v $(pwd)/../data:/opt/data \
  -v $(pwd)/../features:/opt/features \
  -v $(pwd)/../logs:/opt/logs \
  -v $(pwd)/../models:/opt/models \
  -v $(pwd)/../notebooks:/opt/notebooks \
  -v $(pwd)/../reports:/opt/reports \
  -v $(pwd)/../scripts:/opt/scripts \
  -v $(pwd)/../utils:/opt/utils \
  -e AWS_ACCESS_KEY_ID=${AWS_ACCSESS_KEY_ID}
  -e AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
  -e CI_BUILD_REF_NAME=${CI_BUILD_REF_NAME}
  -p ${HOST_PORT}:${CONTAINER_PORT} \
   ${CONTAINER_IMAGE}
if [ $? -gt 0 ]; then
  log "error docker run"
fi

# log "info end script"

ci.sh

#!/bin/bash

# configure gcp
gcloud auth activate-service-account sa@gserviceaccount.com --key-file ./config/gcp_key.json --project project

# exec notebooks
papermill ./notebooks/notebook.ipynb s3://bucket/${CI_BUILD_REF_NAME}/notebook_`date "+%Y%m%d%H%M%S"`.ipynb