From ed23d6d93088f1206c82b8d211fc806c899ae4f1 Mon Sep 17 00:00:00 2001 From: Jared Tan Date: Tue, 18 Jun 2024 09:29:00 +0800 Subject: [PATCH] add workflow (#552) --- .../workflows/docker-build-and-release.yaml | 73 +++++++++++++++++++ Makefile | 37 +++++++++- Makefile.variable | 21 ++++++ docker/Dockerfile-API | 25 +++++++ docker/Dockerfile-ES | 4 + docker/Dockerfile-UI | 19 +++++ docs/Dockerfile | 48 ------------ 7 files changed, 176 insertions(+), 51 deletions(-) create mode 100644 .github/workflows/docker-build-and-release.yaml create mode 100644 Makefile.variable create mode 100644 docker/Dockerfile-API create mode 100644 docker/Dockerfile-ES create mode 100644 docker/Dockerfile-UI delete mode 100644 docs/Dockerfile diff --git a/.github/workflows/docker-build-and-release.yaml b/.github/workflows/docker-build-and-release.yaml new file mode 100644 index 0000000..0f1b9ff --- /dev/null +++ b/.github/workflows/docker-build-and-release.yaml @@ -0,0 +1,73 @@ +name: docker-images-build-and-release + +on: + push: + branches: + - master + tags: ["v*"] + pull_request: + branches: + - master + +env: + # Use docker.io for Docker Hub if empty + REGISTRY_SERVER_ADDRESS: ghcr.io/veops + +jobs: + setup-environment: + timeout-minutes: 30 + runs-on: ubuntu-latest + if: ${{ github.actor != 'dependabot[bot]' }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + release-images: + runs-on: ubuntu-latest + needs: [setup-environment] + permissions: + contents: read + packages: write + timeout-minutes: 90 + env: + TAG: ${{ github.sha }} + steps: + - name: Checkout Repo + uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "1.21.8" + cache: false + - name: Login to GitHub Package Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Set up QEMU + uses: docker/setup-qemu-action@v3 + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + - name: Build and push CMDB-API Docker image + uses: docker/build-push-action@v6 + with: + file: docker/Dockerfile-API + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ env.REGISTRY_SERVER_ADDRESS }}/cmdb-api:${{ env.TAG }} + - name: Build and push CMDB-UI Docker image + uses: docker/build-push-action@v6 + with: + file: docker/Dockerfile-UI + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ env.REGISTRY_SERVER_ADDRESS }}/cmdb-ui:${{ env.TAG }} + - name: Build and push CMDB-ES Docker image + uses: docker/build-push-action@v6 + with: + file: docker/Dockerfile-ES + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ env.REGISTRY_SERVER_ADDRESS }}/cmdb-ES:${{ env.TAG }} \ No newline at end of file diff --git a/Makefile b/Makefile index 8a59742..e24ac76 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,4 @@ -MYSQL_ROOT_PASSWORD ?= root -MYSQL_PORT ?= 3306 -REDIS_PORT ?= 6379 +include ./Makefile.variable default: help help: ## display this help @@ -50,3 +48,36 @@ clean: ## remove unwanted files like .pyc's lint: ## check style with flake8 flake8 --exclude=env . .PHONY: lint + +api-docker-build: + export DOCKER_CLI_EXPERIMENTAL=enabled ;\ + ! ( docker buildx ls | grep multi-platform-builder ) && docker buildx create --use --platform=$(BUILD_ARCH) --name multi-platform-builder ;\ + docker buildx build \ + --builder multi-platform-builder \ + --platform=$(BUILD_ARCH) \ + --tag $(REGISTRY)/cmdb-api:$(CMDB_DOCKER_VERSION) \ + --tag $(REGISTRY)/cmdb-api:latest \ + -f docker/Dockerfile-API \ + . + +ui-docker-build: + export DOCKER_CLI_EXPERIMENTAL=enabled ;\ + ! ( docker buildx ls | grep multi-platform-builder ) && docker buildx create --use --platform=$(BUILD_ARCH) --name multi-platform-builder ;\ + docker buildx build \ + --builder multi-platform-builder \ + --platform=$(BUILD_ARCH) \ + --tag $(REGISTRY)/cmdb-ui:$(CMDB_DOCKER_VERSION) \ + --tag $(REGISTRY)/cmdb-ui:latest \ + -f docker/Dockerfile-UI \ + . + +es-docker-build: + export DOCKER_CLI_EXPERIMENTAL=enabled ;\ + ! ( docker buildx ls | grep multi-platform-builder ) && docker buildx create --use --platform=$(BUILD_ARCH) --name multi-platform-builder ;\ + docker buildx build \ + --builder multi-platform-builder \ + --platform=$(BUILD_ARCH) \ + --tag $(REGISTRY)/cmdb-es:$(CMDB_DOCKER_VERSION) \ + --tag $(REGISTRY)/cmdb-es:latest \ + -f docker/Dockerfile-ES \ + . \ No newline at end of file diff --git a/Makefile.variable b/Makefile.variable new file mode 100644 index 0000000..3fac795 --- /dev/null +++ b/Makefile.variable @@ -0,0 +1,21 @@ +SHELL := /bin/bash -o pipefail + +MYSQL_ROOT_PASSWORD ?= root +MYSQL_PORT ?= 3306 +REDIS_PORT ?= 6379 + +LATEST_TAG_DIFF:=$(shell git describe --tags --abbrev=8) +LATEST_COMMIT:=$(VERSION)-dev-$(shell git rev-parse --short=8 HEAD) +BUILD_ARCH ?= linux/amd64,linux/arm64 + +# Set your version by env or using latest tags from git +CMDB_VERSION?=$(LATEST_TAG_DIFF) +ifeq ($(CMDB_VERSION),) + #fall back to last commit + CMDB_VERSION=$(LATEST_COMMIT) +endif +COMMIT_VERSION:=$(LATEST_COMMIT) +CMDB_DOCKER_VERSION:=${CMDB_VERSION} +CMDB_CHART_VERSION:=$(shell echo ${CMDB_VERSION} | sed 's/^v//g' ) + +REGISTRY ?= local \ No newline at end of file diff --git a/docker/Dockerfile-API b/docker/Dockerfile-API new file mode 100644 index 0000000..4e9aab1 --- /dev/null +++ b/docker/Dockerfile-API @@ -0,0 +1,25 @@ +# ================================= API ================================ +FROM python:3.8-alpine AS cmdb-api + +LABEL description="Python3.8,cmdb" + +COPY cmdb-api /data/apps/cmdb + +WORKDIR /data/apps/cmdb + +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories + +RUN apk add --no-cache tzdata gcc musl-dev libffi-dev openldap-dev python3-dev jpeg-dev zlib-dev build-base + +ENV TZ=Asia/Shanghai + +RUN pip install --no-cache-dir -r requirements.txt \ + && cp ./settings.example.py settings.py \ + && sed -i "s#{user}:{password}@127.0.0.1:3306/{db}#cmdb:123456@mysql:3306/cmdb#g" settings.py \ + && sed -i "s#redis://127.0.0.1#redis://redis#g" settings.py \ + && sed -i "s#CACHE_REDIS_HOST = '127.0.0.1'#CACHE_REDIS_HOST = 'redis'#g" settings.py + +ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait +RUN chmod +x /wait + +CMD ["bash", "-c", "flask run"] \ No newline at end of file diff --git a/docker/Dockerfile-ES b/docker/Dockerfile-ES new file mode 100644 index 0000000..151de06 --- /dev/null +++ b/docker/Dockerfile-ES @@ -0,0 +1,4 @@ +# ================================= Search ================================ +FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.2 AS cmdb-search + +RUN yes | ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip diff --git a/docker/Dockerfile-UI b/docker/Dockerfile-UI new file mode 100644 index 0000000..26866f6 --- /dev/null +++ b/docker/Dockerfile-UI @@ -0,0 +1,19 @@ +# ================================= UI ================================ +#FROM docker.m.daocloud.io/node:16.0.0-alpine AS builder +ARG NODE_IMAGE_VERSION=16.20 +FROM node:${NODE_IMAGE_VERSION} AS builder + +LABEL description="cmdb-ui" + +COPY cmdb-ui /data/apps/cmdb-ui + +WORKDIR /data/apps/cmdb-ui + +RUN sed -i "s#http://127.0.0.1:5000##g" .env && yarn install && yarn build + +FROM docker.m.daocloud.io/library/nginx:1.21.4 AS cmdb-ui +#FROM nginx:1.21.4 AS cmdb-ui + +RUN mkdir /etc/nginx/html && rm -f /etc/nginx/conf.d/default.conf + +COPY --from=builder /data/apps/cmdb-ui/dist /etc/nginx/html/ \ No newline at end of file diff --git a/docs/Dockerfile b/docs/Dockerfile deleted file mode 100644 index e9a7a73..0000000 --- a/docs/Dockerfile +++ /dev/null @@ -1,48 +0,0 @@ -# ================================= UI ================================ -FROM node:16.0.0-alpine AS builder - -LABEL description="cmdb-ui" - -COPY ../cmdb-ui /data/apps/cmdb-ui - -WORKDIR /data/apps/cmdb-ui - -RUN sed -i "s#http://127.0.0.1:5000##g" .env && yarn install && yarn build - - -FROM nginx:alpine AS cmdb-ui - -RUN mkdir /etc/nginx/html && rm -f /etc/nginx/conf.d/default.conf - -COPY --from=builder /data/apps/cmdb-ui/dist /etc/nginx/html/ - - -# ================================= API ================================ -FROM python:3.8-alpine AS cmdb-api - -LABEL description="Python3.8,cmdb" - -COPY ../cmdb-api /data/apps/cmdb - -WORKDIR /data/apps/cmdb - -RUN apk add --no-cache tzdata gcc musl-dev libffi-dev openldap-dev python3-dev jpeg-dev zlib-dev build-base - -ENV TZ=Asia/Shanghai - -RUN pip install --no-cache-dir -r requirements.txt \ - && cp ./settings.example.py settings.py \ - && sed -i "s#{user}:{password}@127.0.0.1:3306/{db}#cmdb:123456@mysql:3306/cmdb#g" settings.py \ - && sed -i "s#redis://127.0.0.1#redis://redis#g" settings.py \ - && sed -i "s#CACHE_REDIS_HOST = '127.0.0.1'#CACHE_REDIS_HOST = 'redis'#g" settings.py - -ADD https://github.com/ufoscout/docker-compose-wait/releases/download/2.7.3/wait /wait -RUN chmod +x /wait - -CMD ["bash", "-c", "flask run"] - - -# ================================= Search ================================ -FROM docker.elastic.co/elasticsearch/elasticsearch:7.4.2 AS cmdb-search - -RUN yes | ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip