GiitHub Action의 일회용 DB 활용
13516 단어 GitHub ActionsCItech
개시하다
GiitHub Actions에서 테스트를 진행할 때 매번 일회용 DB를 설치해 이 DB를 이용한 테스트 방법을 조사한다.
컨디션
글을 쓸 때 만들어진 샘플 코드는 지티허브KentarouSuzuki/actions-service-container에 업로드됐으니 필요에 따라 참고하시기 바랍니다.
이번에는 Go로 구현했다.원래 Go에 테스트 코드를 쓸 때
hoge_test.go
라는 파일 이름을 썼는데 이번에cmd/sample/main.go
에 코드를 썼다.데이터베이스
PostgreSQL
언어
Go 1.14
마이그레이션 도구
rubenv/sql-migrate
테스트 순서
다음 순서에 따라 테스트를 진행한다.
서비스 컨테이너
GiitHub Actions의 워크플로우에서 DB에 연결하여 테스트를 수행하려면 GiitHub Action서비스 컨테이너을 사용합니다.이 서비스 컨테이너의 진짜 모습은 Docker 컨테이너로 Docker Hub 이미지를 지정하고 만드는 것입니다.이 글은 PostgreSQL을 사용하거나 MySQL 등 다른 RDB, Redis,nginx를 사용할 수 있다.
예를 들어, 작업을 수행할 때 PostgreSQL의 서비스 컨테이너를 준비하려면 다음과 같이 하십시오.
jobs:
my-job:
runs-on: ubuntu-latest
services:
postgres:
# Docker Hubのイメージ
image: postgres
# 動かすコンテナで使う環境変数
# この場合はpostgresqlのパスワードを指定している。
env:
POSTGRES_PASSWORD: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
모든 작업의 바로 아래에 서비스 용기의 탭을 적으십시오. (이 예는postgres이지만 db도 가능합니다.) 아래로 이동할 Docker 이미지, 환경 변수, 건강 검사 설정을 지정합니다.서비스 컨테이너와 통신
작업 절차에서 제작된 서비스 용기와 통신하는 방법은 임무를 수행하는 환경에 따라 다르다.따라서 먼저 임무를 수행하는 환경을 설명한다.이후 각자의 방법으로 서비스 용기에 통신하는 방법을 설명한다.
GiitHub Actions에서 작업을 수행하는 환경
GiitHub Actions에서는 다음 두 환경에서 작업을 수행할 수 있습니다.
주루기에서 직접 임무를 집행하다
단지 공식 문서와 Qita 등 글에서 봤을 뿐, 많은 경우에 이 방법으로 집행된다.공식 문서빠른 시작도 이런 방식으로 집행된다.
이 방법은 다음과 같이 각 임무
runs-on
에서 지정한 기계 종류에서 임무를 수행한다.GiitHub Actions는 기본적으로 Windows, MacOS, Ubuntu 시스템을 제공합니다.임무에 정의된 steps
는 runs-on
가 지정한 기계에서 실행됩니다.이 글처럼 서비스 용기를 실행하려면 GiitHub Action의 규격으로 Linux의 주자를 지정해야 한다.[1] jobs:
my-job:
runs-on: ubuntu-latest
steps:
- name: Hello, world
run: |
echo "Hello, world"
컨테이너 내에서 작업 수행
이 방법은 작업 바로 아래
runs-on
에 기계의 종류를 설정하고steps
에 실행된 작업의 내용과 같다.단, 여기에 다시 설정container
한다.이 항목은 작업이 실제로 실행되는 용기 설정을 지정합니다.이 예에서 go version
는 ubuntu로 이동하는 golang:1.14
용기에서 실행됩니다.이 방법도 아까 주루기에서 임무를 수행할 때와 마찬가지로 GiitHub Actions의 규격으로 리눅스의 주자를 지정해야 한다.[1:1]
jobs:
my-job:
runs-on: ubuntu-latest
container:
# Docker Hubのイメージ
image: golang:1.14
steps:
- name: Print Go version
run: |
go version
서비스 용기와의 통신 방법
주루기에서 운행하는 임무
우선 주자 기기에서 이동하는 작업을 서비스 용기로 통신하는 방법을 설명한다.
작업이 주루기에서 실행될 때, 서비스 용기는 주루원 기계에 대해 기본적으로 포트를 공개하지 않는다.따라서 GiitHub Actions에서 서비스 컨테이너를 정의할 때는 서비스 컨테이너와 주자기의 포트를 매핑해야 합니다.예를 들어 이 글을 제작할 때 실제 샘플은 PostgreSQL을 서비스 용기로 하기 때문에 지도상 유수기의 5432호 포트와 서비스 용기의 5432호 포트이다.실제 설정 파일은 다음과 같다.
jobs:
runner-job:
runs-on: ubuntu-latest
env:
ENV: runner-job
services:
postgres:
image: postgres
env:
POSTGRES_USER: sue
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
ports:
- 5432:5432
그리고 서비스 용기의 호스트는 local
또는 127.0.0.1
로 설정되었다.따라서 방문localhost:5432
하면 PostgreSQL과 통신할 수 있다.실제로 샘플이 주루기에서 작업을 수행할 때의 sql-migrate 설정은 다음과 같다localhost:5432
.runner-job:
dialect: postgres
datasource: host=localhost dbname=postgres user=sue password=postgres sslmode=disable
dir: migrations
table: migrations
컨테이너 안에서 이동하는 작업
다음은 용기 안에서 이동하는 작업이 서비스 용기로 통신하는 방법을 설명한다.
컨테이너 안에서 임무를 수행할 때 주루기에서 임무를 수행할 때보다 서비스 용기와 간단하게 통신할 수 있다.Docker의 사용자 정의 브리지 네트워크를 사용합니다.따라서 임의의 호스트 이름이 붙기 때문에 GiitHub Actions에서 서비스 용기의 탭 이름으로 접근할 수 있습니다.그리고 컨테이너가 서로 모든 포트를 공개했기 때문에 포트를 비출 필요가 없다.
따라서 샘플이라도 서비스 용기를 정의할 때 다음과 같은 설정을 해야 한다
container-job:
runs-on: ubuntu-latest
container:
image: golang:1.14
env:
ENV: container-job
services:
postgres:
image: postgres
env:
POSTGRES_USER: sue
POSTGRES_PASSWORD: postgres
POSTGRES_DB: postgres
options: >-
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
sql-migrate를 통해 DB 이전할 때의 설정설정
container-job:
dialect: postgres
datasource: host=postgres dbname=postgres user=sue password=postgres sslmode=disable
dir: migrations
table: migrations
, 방문postgres:5432
.각주
공식 문서이 부분에 언급되었다.↩︎ ↩︎
Reference
이 문제에 관하여(GiitHub Action의 일회용 DB 활용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/sue/articles/378fb1689f7289e556e9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)