[CI/CD] GiitHub Actions에서 Cloud Run, Cloud SQL로 자동 디버깅

이 글은 필자가 이하 투고한 일본어판이다.

이번 보도의 종점


GiitHub Actions를 사용하여 Google Cloud Run의 Laavel8 애플리케이션을 자동으로 설계하는 것이 목적입니다.다음 절차에 따라 설계를 시도해 보세요.
  • Docker compose를 통해 Laavel 시작
  • Docker 이미지를 Container Registry
  • 로 밀어냄
  • Google Cloud Run deproi & Google Cloud SQL
  • 에 연결
  • GiitHub Action에서 처리 자동화
  • 디렉토리 구조


    다음은 이번에 사용한 창고의 구조.
    .
    ├── .github/
    │   └── workflows
    │       └── deploy.yml # GitHub Actions用のymlファイル
    ├── env/
    ├── docker/
    │   ├── 000-default.conf
    │   ├── Dockerfile
    │   └── php.ini
    ├── sh/ # ビルド後に使用するシェルスクリプト用のディレクトリ
    ├── src/ # Laravelが格納されているディレクトリ
    └── docker-compose.yml
    

    1. Docker compose로 Laavel 이동


    현지 환경의 개발을 고려하여 우리는 docker compose에서 컨테이너를 가동할 수 있도록 창고를 준비했다.설명하기 편리하도록/src 바로 아래에 Laavel8의 파일 그룹이 추가되어 다른 버전의 Laavel도 움직일 것 같습니다.
  • https://github.com/uuta/cloud-run-laravel8
  • 1-1. GiitHub 클론 저장소에서


    GiitHub에서 창고를 복제하세요.
    $ git clone [email protected]:uuta/cloud-run-laravel8.git
    $ cd cloud-run-laravel8
    
    Docker compose를 통해 컨테이너를 시작합니다.
    $ cp env/.env.example env/.env.local
    $ docker-compose up -d --build
    ...
    ...
    ...
    Creating cloud-run-laravel8_db_1  ... done
    Creating cloud-run-laravel8_app_1 ... done
    Time: 0h:00m:24s
    
    src/.env 파일 내APP_KEY가 비어 있어 앱 컨테이너에 로그인하여 KEY를 생성합니다.
    $ docker-compose exec app bash
    $ php artisan route:clear && \
    php artisan cache:clear && \
    php artisan config:clear && \
    php artisan view:clear && \
    php artisan key:generate
    
    APP_KEY는 다음과 같이 생성된다.
    # before
    APP_KEY=
    # after
    APP_KEY=base64:<key>
    
    그러면 로컬 호스트에 연결하여 Laavel의 초기 화면이 표시되는지 확인합니다.
  • http://localhost:8080/
  • Image description
    나는 나의 이동률이 어떻다고 생각한다.app 용기에서 이동을 실행하면 다음과 같은 정보를 표시합니다.
    $ docker-compose exec app bash
    $ php artisan migrate
    Nothing to migrate.
    
    실제로 Docker image를 구축할 때 이전을 실행하고 있기 때문에 Nothing to migrate 이런 정보가 표시됩니다.창고에 있는 것Dockerfile.local을 봅시다.
    FROM composer:latest as build
    WORKDIR /app
    COPY . /app
    
    FROM php:8.0-apache
    COPY docker/php.ini /usr/local/etc/php/
    RUN apt update
    RUN apt install -y git
    RUN apt install -y vim
    RUN apt install -y zip unzip
    RUN docker-php-ext-install bcmath pdo_mysql
    
    # composer install
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    EXPOSE 8080
    COPY --from=build /app /var/www
    COPY docker/000-default.conf /etc/apache2/sites-available/000-default.conf
    RUN chmod 777 -R /var/www
    
    WORKDIR /
    RUN echo "Listen 8080" >> /etc/apache2/ports.conf
    RUN chown -R www-data:www-data /var/www
    RUN a2enmod rewrite
    
    # Make the file executable, or use "chmod 777" instead of "chmod +x"
    RUN chmod +x /var/www/sh/laravel/laravel.local.sh
    
    # This will run the shell file at the time when container is up-and-running successfully (and NOT at the BUILD time)
    ENTRYPOINT ["/var/www/sh/laravel/laravel.local.sh"]
    
    파일의 마지막 부분에서 sh/laravel/laravel.local.sh를 통해 케이스 스크립트를 실행합니다.
    RUN chmod +x /var/www/sh/laravel/laravel.local.sh
    ...
    ENTRYPOINT ["/var/www/sh/laravel/laravel.local.sh"]
    
    구체적으로 보자.composer installmigrate 명령이 여기에 실행됩니다.
    #!/bin/bash
    
    # initialize laravel
    cd /var/www/src
    composer install --optimize-autoloader
    php artisan config:cache
    php artisan route:cache
    php artisan view:cache
    
    # Run Laravel migration
    php artisan migrate
    
    # Run Apache in "foreground" mode (the default mode that runs in Docker)
    apache2-foreground
    
    이전 지령 등을 Dockerfile에 모으기를 희망합니다.그러나 Build 단계에서는 Google Cloud SQL에 연결할 수 없으며, Build가 성공한 후에는 이 명령을 실행해야 합니다.그래서 우리는 비집행 케이스 스크립트의 형식을 채택했다.
  • https://github.com/GoogleCloudPlatform/community/issues/351#issuecomment-370056462
  • 또한 로컬 환경에서는 Google Cloud SQL이 아닌 로컬 데이터베이스에 연결됩니다.

    1-2. Docker file의 내용을 보도록 하겠습니다.


    다시 한 번 봅시다Dockerfile.local.간단히 설명해 주세요.Google Cloud Run에서 이미지를 구축하기 위해 8080개 포트의 조개 스크립트가 공개되었습니다.
    EXPOSE 8080
    ...
    RUN echo "Listen 8080" >> /etc/apache2/ports.conf
    
    This command copies 000-default.conf to configure the Apache WEB server.
    COPY docker/000-default.conf /etc/apache2/sites-available/000-default.conf
    

    2. Docker 이미지를 Container Registry로 밀어냄


    그럼 로컬에서 Laavel 애플리케이션을 디버깅해 봅시다.우선, 도커 용기를 멈추십시오.
    $ docker-compose down
    

    2-1. 콘솔에서 GCP 설정


    GCP의 프로젝트 이름을 확인한 후 다음 명령을 실행하십시오.
    $ gcloud auth login
    $ PROJECT_NAME=(<Project name in GCP>)
    PROJECT_ID=$(gcloud projects list --format 'value(projectId)' --filter name=$PROJECT_NAME)
    export PROJECT_ID
    gcloud config set project $PROJECT_ID
    gcloud services enable \
        containerregistry.googleapis.com \
        cloudresourcemanager.googleapis.com \
        iam.googleapis.com
    
    Image description

    2-2. 서비스 계정 만들기


    서비스 계정을 만들고 소유자에게 권한을 부여합니다.키 다운로드google_cloud_run_key.json으로 저장하고 환경 변수로 설정하며 서비스 계정으로 인증합니다.다음 명령을 사용할 수 있습니다.
    $ gcloud iam service-accounts create deployer \
        --display-name "deployer"
    gcloud projects add-iam-policy-binding ${PROJECT_ID} \
      --member serviceAccount:deployer@${PROJECT_ID}.iam.gserviceaccount.com \
      --role roles/owner
    export GOOGLE_APPLICATION_CREDENTIALS=credentials/laravel8_google_cloud_run_key.json
    gcloud iam service-accounts keys create $GOOGLE_APPLICATION_CREDENTIALS \
      --iam-account deployer@${PROJECT_ID}.iam.gserviceaccount.com
    gcloud auth activate-service-account --key-file=$GOOGLE_APPLICATION_CREDENTIALS
    
    상기 명령 예시에서credentials 디렉터리에 저장laravel8_google_cloud_run_key.json.
    export GOOGLE_APPLICATION_CREDENTIALS=~/credentials/laravel8_google_cloud_run_key.json
    

    2-3. Docker 이미지 만들기

    docker-compose 명령을 사용하지 않고 docker 이미지를 만듭니다.
    $ export SERVICE_NAME=docker-laravel8-run
    docker build -f docker/Dockerfile.prod -t asia.gcr.io/${PROJECT_ID}/${SERVICE_NAME} .
    
    docker run으로 돌려보세요.
    $ docker run --init -d -e PORT=8080 -p 8080:8080 asia.gcr.io/${PROJECT_ID}/${SERVICE_NAME}
    
    Docker compose에서 구축했을 때와 같이 로컬 페이지가 제대로 작동하는지 확인합니다.
    Image description

    2-4. Container Registry로 Docker 이미지 밀기


    $ gcloud auth configure-docker
    docker push asia.gcr.io/${PROJECT_ID}/${SERVICE_NAME}
    
    docker-laravel8이라는 창고에 로그인한 것을 확인했습니다.
    Image description

    2-5. Cloud SQL Admin API 활성화


    Google Cloud Run과 Google Cloud SQL을 결합하려면 Cloud SQL Admin API를 사용해야 합니다.
    Image description
  • Connect from Cloud Run | Cloud SQL for MySQL | Google Cloud
  • 3. Google Cloud Run deproi & Google Cloud SQL에 연결


    테스트용 Google Cloud SQL 인스턴스를 임시로 만듭니다.이 견본은 다음 실례를 만들 것입니다. 환경에 따라 설정을 변경하십시오.이 일은 아마 시간이 걸릴 것이다.
    $ DATABASE_NAME=(docker-laravel8-run)
    gcloud sql instances create $DATABASE_NAME \
      --database-version=MYSQL_8_0 \
      --region=us-central1 \
      --storage-size=100 \
      --storage-type=HDD \
      --tier=db-f1-micro \
      --root-password=homestead
    
    Image description
  • How to securely connect to Cloud SQL from Cloud Run? - Stack Overflow
  • How do I connect to Cloud SQL from a Laravel project running on Cloud Run? - Stack Overflow
  • Laavel이라는 데이터베이스를 만들자.
    $ gcloud sql databases create laravel \
    --instance=$DATABASE_NAME
    
  • Create and manage databases | Cloud SQL for MySQL | Google Cloud
  • 3-1. 구글 클라우드 런의 디자인


    Google Cloud Run을 설계해 보십시오.다음 명령을 실행하려면 Google Cloud SQL의 Connection name을 <Connection name>로 바꾸십시오.
    $ SQL_CONNECTION_NAME=(<Connection name>)
    gcloud run deploy ${SERVICE_NAME} \
    --image asia.gcr.io/"${PROJECT_ID}"/"${SERVICE_NAME}" \
    --region asia-east1 \
    --platform=managed \
    --add-cloudsql-instances ${SQL_CONNECTION_NAME} \
    --allow-unauthenticated
    
    Image description
    디버그 후 URL을 생성합니다.Laavel8에서 사용하는 페이지가 올바르게 표시되는지 확인하십시오.
    Image description
    Image description

    4. GiitHub Actions에서 설계 자동화


    4-1. 간단한 설명


    이렇게 되면 Laavel 애플리케이션은 Local 환경에서 정상적으로 디버깅할 수 있습니다.다음은 GiitHub Action의 디자인을 고려해 보겠습니다.GiitHub Actions는 마스터와main 분기를 제출할 때 디버깅에 사용할 명령을 실행하려고 합니다.이 예에서 프로그램 해제 명령은 .github/workflows/deploy.yml 파일에 정의되어 있다.그리고 deply의 트리거가 master 로 설정되었을 때.
    name: cloud-run-laravel8-deploy
    on:
      push:
        branches:
          - master
    
    다시 봅시다.이 원격 저장소는 파일.gitignore을 통해 Laavel 응용 프로그램을 설정하는 데 사용됩니다.env 파일이 없습니다.따라서 디버그할 때만 설정 .env 파일이 필요합니다.그리고 로컬 .env 파일을 베이스 64에서 디코딩한 환경 변수를 인코딩하여 디버깅할 수 있습니다.
    - name: Decode .env file
      run: |
        echo ${{ secrets.TEST_ENV_FILE }} | base64 --decode > src/.env
    
    .github/workflows/deploy.파일에 6개의 환경 변수가 준비되어 있습니다.
  • secrets.TEST_GCP_EMAIL: deploy email
  • secrets.TEST_GCP_CREDENTIALS: the content of credentials/laravel8_google_cloud_run_key.json in your local environment
  • secrets.TEST_ENV_FILE: env/.env.prod
  • secrets.TEST_GCP_PROJECT: project id
  • secrets.TEST_GCP_APPLICATION: service name
  • secrets.TEST_SQL_CONNECTION_NAME: SQL connection name
  • 4-2. 원격 창고를 자신의


    이어서 원격 창고를 test-cloud-run로 변경한다.당신이 좋아하는 이름을 지어주세요.
    $ git config remote.origin.url
    [email protected]:uuta/cloud-run-laravel8.git
    $ git remote set-url origin [email protected]:uuta/test-cloud-run.git
    $ git config remote.origin.url
    

    4-3. GiitHub에 환경 변수 입력


    다음과 같이 GiitHub의 환경 변수를 입력합니다.
    Image description
    TEST_GCP_EMAIL은 Google Cloud Run 페이지에서 사용할 수 있습니다.
    Image description
    TEST_ENV_FILE을 변경하는 것은 좀 번거롭다.먼저 .env.example 파일을 .env.prod로 복제합니다.
    $ cp env/.env.local env/.env.prod
    
    .env.prod 파일을 다음과 같이 수정합니다.수정DB_SOCKET을 잊지 마십시오.
    APP_NAME=Laravel
    APP_ENV=production
    APP_KEY=<your app key>
    APP_DEBUG=false
    APP_URL=<your app url>
    
    LOG_CHANNEL=stack
    LOG_DEPRECATIONS_CHANNEL=null
    LOG_LEVEL=debug
    
    DB_CONNECTION=mysql
    DB_HOST=localhost
    DB_PORT=3306
    DB_DATABASE=laravel
    DB_USERNAME=root
    DB_PASSWORD=homestead
    DB_SOCKET=/cloudsql/<connection name to Google Cloud SQL>
    
    다음 명령을 실행할 때 env 파일의 값은 기본 64 인코딩 문자열로 전송됩니다.따라서 TESTENV_FILE로 붙여넣은 값을 복사할 수 있습니다.
    $ cat env/.env.prod | base64 | pbcopy
    

    4-4. GiitHub 키를 눌러 자동 디버깅


    $ git push
    
    메인 창고를 누르면 자동으로 원격 창고의 예처리를 시작합니다.성공 여부를 확인해 보자.
    Image description
    잘 됐다!

    References

  • CircleaCI 2.0에 있습니다.환경 변수로 env 파일을 사용하는 방법 | Casual Developers Note
  • Cloud Run에서 Cloud SQL 및 Memorystore로 연결하는 방법 - Tech Blog 전체 포위
  • Cloud Run을 사용하면 그걸 알면 얻는 마음이 생긴다-Qita
  • About connection options | Cloud SQL for MySQL | Google Cloud
  • 좋은 웹페이지 즐겨찾기