[CI/CD] GiitHub Actions에서 Cloud Run, Cloud SQL로 자동 디버깅
이번 보도의 종점
GiitHub Actions를 사용하여 Google Cloud Run의 Laavel8 애플리케이션을 자동으로 설계하는 것이 목적입니다.다음 절차에 따라 설계를 시도해 보세요.
디렉토리 구조
다음은 이번에 사용한 창고의 구조.
.
├── .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도 움직일 것 같습니다.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의 초기 화면이 표시되는지 확인합니다.나는 나의 이동률이 어떻다고 생각한다.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 install
및 migrate
명령이 여기에 실행됩니다.#!/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가 성공한 후에는 이 명령을 실행해야 합니다.그래서 우리는 비집행 케이스 스크립트의 형식을 채택했다.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
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
에서 구축했을 때와 같이 로컬 페이지가 제대로 작동하는지 확인합니다.2-4. Container Registry로 Docker 이미지 밀기
$ gcloud auth configure-docker
docker push asia.gcr.io/${PROJECT_ID}/${SERVICE_NAME}
docker-laravel8이라는 창고에 로그인한 것을 확인했습니다.2-5. Cloud SQL Admin API 활성화
Google Cloud Run과 Google Cloud SQL을 결합하려면 Cloud SQL Admin API를 사용해야 합니다.
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
$ gcloud sql databases create laravel \
--instance=$DATABASE_NAME
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
디버그 후 URL을 생성합니다.Laavel8에서 사용하는 페이지가 올바르게 표시되는지 확인하십시오.
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개의 환경 변수가 준비되어 있습니다.credentials/laravel8_google_cloud_run_key.json
in your local environment env/.env.prod
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의 환경 변수를 입력합니다.
TEST_GCP_EMAIL은 Google Cloud Run 페이지에서 사용할 수 있습니다.
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
메인 창고를 누르면 자동으로 원격 창고의 예처리를 시작합니다.성공 여부를 확인해 보자.잘 됐다!
References
Reference
이 문제에 관하여([CI/CD] GiitHub Actions에서 Cloud Run, Cloud SQL로 자동 디버깅), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yutti/articles/5d11428ca5e316텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)