diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a4d5990..d72b101 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -6,26 +6,23 @@ on: pull_request: branches: [ main ] +env: + PORT: ${{ secrets.PORT }} + GIN_MODE: ${{ secrets.GIN_MODE }} + LOG_LEVEL: ${{ secrets.LOG_LEVEL }} + LOG_OUTPUT: ${{ secrets.LOG_OUTPUT }} + AUTHORIZATION_URL: ${{ secrets.AUTHORIZATION_URL }} + POSTGRES_HOST: ${{ secrets.POSTGRES_HOST }} + POSTGRES_PORT: ${{ secrets.POSTGRES_PORT }} + POSTGRES_USER: ${{ secrets.POSTGRES_USER }} + POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }} + POSTGRES_DB: ${{ secrets.POSTGRES_DB }} + POSTGRES_URL: ${{ secrets.POSTGRES_URL }} + jobs: build: runs-on: ubuntu-22.04 steps: - - name: Create .env file - run: | - echo "PORT=${{ secrets.PORT }}" >> .env - echo "GIN_MODE=${{ secrets.GIN_MODE }}" >> .env - echo "JWT_SECRET_KEY=${{ secrets.JWT_SECRET_KEY }}" >> .env - echo "JWT_SECRET_REFRESH_KEY=${{ secrets.JWT_SECRET_REFRESH_KEY }}" >> .env - echo "LOG_LEVEL=${{ secrets.LOG_LEVEL }}" >> .env - echo "LOG_OUTPUT=${{ secrets.LOG_OUTPUT }}" >> .env - echo "AUTHORIZATION_URL=${{ secrets.AUTHORIZATION_URL }}" >> .env - echo "POSTGRES_HOST=${{ secrets.POSTGRES_HOST }}" >> .env - echo "POSTGRES_PORT=${{ secrets.POSTGRES_PORT }}" >> .env - echo "POSTGRES_USER=${{ secrets.POSTGRES_USER }}" >> .env - echo "POSTGRES_PASSWORD=${{ secrets.POSTGRES_PASSWORD }}" >> .env - echo "POSTGRES_DB=${{ secrets.POSTGRES_DB }}" >> .env - echo "POSTGRES_URL=${{ secrets.POSTGRES_URL }}" >> .env - - uses: actions/checkout@v3 - name: Set up Go @@ -38,7 +35,7 @@ jobs: - name: Test run: go test -v ./internal/... - + check: needs: build runs-on: ubuntu-22.04 @@ -49,7 +46,7 @@ jobs: run: docker-compose up -d --build - name: Run project - run: make ci + run: make build-ci - name: Set up Go for E2E tests uses: actions/setup-go@v3 @@ -67,4 +64,4 @@ jobs: - name: Tear Down if: always() - run: docker-compose down + run: docker-compose down \ No newline at end of file diff --git a/Makefile b/Makefile index 24bcf01..c061e97 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,33 @@ -.PHONY: up -up: - docker compose up -d +# Developer commands +.PHONY: dev-up +dev-up: + docker-compose -f docker-compose.dev.yml up -d -.PHONY: down -down: - docker compose down +.PHONY: dev-down +dev-down: + docker-compose -f docker-compose.dev.yml down -.PHONY: ci -ci: - docker compose up -d --build api +.PHONY: dev-ci +dev-ci: + docker-compose -f docker-compose.dev.yml up -d --build api -.PHONY: runapi -runapi: - go run cmd/api/main.go +.PHONY: dev-runapi +dev-runapi: + go run cmd/api/main.go + +# Build commands +.PHONY: build-up +build-up: + docker-compose -f docker-compose.ci.yml up -d + +.PHONY: build-down +build-down: + docker-compose -f docker-compose.ci.yml down + +.PHONY: build-ci +build-ci: + docker-compose -f docker-compose.ci.yml up -d --build api + +.PHONY: build-runapi +build-runapi: + go run cmd/api/main.go diff --git a/build/api/Dockerfile-build b/build/api/Dockerfile-build new file mode 100644 index 0000000..27a132e --- /dev/null +++ b/build/api/Dockerfile-build @@ -0,0 +1,15 @@ +FROM golang:1.22-alpine3.20 as builder + +WORKDIR /app +COPY . . + +ENV GIN_MODE=${GIN_MODE:-release} + +RUN go get -d -v ./... +RUN CGO_ENABLED=0 GOOS=linux go build -o api ./cmd/api/main.go + +FROM scratch +WORKDIR / +COPY --from=builder /app/api ./ + +ENTRYPOINT ["./api"] \ No newline at end of file diff --git a/build/api/Dockerfile b/build/api/Dockerfile-dev similarity index 100% rename from build/api/Dockerfile rename to build/api/Dockerfile-dev diff --git a/docker-compose.ci.yml b/docker-compose.ci.yml new file mode 100644 index 0000000..bebf729 --- /dev/null +++ b/docker-compose.ci.yml @@ -0,0 +1,65 @@ +version: '3.0' + +services: + db: + container_name: pg01 + environment: + - POSTGRES_HOST=${POSTGRES_HOST} + - POSTGRES_PORT=${POSTGRES_PORT} + - POSTGRES_USER=${POSTGRES_USER} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD} + - POSTGRES_DB=${POSTGRES_DB} + build: + context: . + dockerfile: build/db/Dockerfile-build + volumes: + - local_postgres_data:/var/lib/postgresql/data + ports: + - "${POSTGRES_PORT}:${POSTGRES_PORT}" + networks: + - golangnetwork + healthcheck: + test: ["CMD-SHELL", "pg_isready -q -d ${POSTGRES_DB} -U ${POSTGRES_USER} || exit 1"] + interval: 10s + timeout: 5s + retries: 3 + start_period: 20s + + migrate: + image: migrate/migrate + container_name: mg01 + volumes: + - ./migrations:/migrations + command: ["-path", "/migrations", "-database", "${POSTGRES_URL}", "up"] + depends_on: + db: + condition: service_healthy + networks: + - golangnetwork + + api: + build: + context: . + dockerfile: build/api/Dockerfile + image: app + container_name: go01 + restart: unless-stopped + environment: + - PORT=${PORT} + - GIN_MODE=${GIN_MODE} + - LOG_LEVEL=${LOG_LEVEL} + - LOG_OUTPUT=${LOG_OUTPUT} + - AUTHORIZATION_URL=${AUTHORIZATION_URL} + ports: + - "${PORT}:${PORT}" + depends_on: + - db + - migrate + networks: + - golangnetwork + +volumes: + local_postgres_data: {} + +networks: + golangnetwork: diff --git a/docker-compose.yaml b/docker-compose.dev.yml similarity index 96% rename from docker-compose.yaml rename to docker-compose.dev.yml index 3571264..466ad7f 100644 --- a/docker-compose.yaml +++ b/docker-compose.dev.yml @@ -6,7 +6,7 @@ services: env_file: .env build: context: . - dockerfile: build/db/Dockerfile + dockerfile: build/db/Dockerfile-dev volumes: - local_postgres_data:/var/lib/postgresql/data ports: