Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build: implement services image build and CI release. #2920

Merged
merged 15 commits into from
Dec 7, 2024
Merged
91 changes: 91 additions & 0 deletions .github/workflows/build-and-release-services-images.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
name: Build and release services Images

on:
push:
branches:
- release-*
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: "Tag version to be used for Docker image"
required: true
default: "v3.8.3"

jobs:
build-and-push:
runs-on: ubuntu-latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.repository_owner }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Log in to Aliyun Container Registry
uses: docker/login-action@v2
with:
registry: registry.cn-hangzhou.aliyuncs.com
username: ${{ secrets.ALIREGISTRY_USERNAME }}
password: ${{ secrets.ALIREGISTRY_TOKEN }}

- name: Extract metadata for Docker (tags, labels)
id: meta
uses: docker/metadata-action@v5
with:
tags: |
type=ref,event=tag
type=schedule
type=ref,event=branch
type=semver,pattern={{version}}
type=semver,pattern=v{{version}}
# type=semver,pattern={{major}}.{{minor}}
type=semver,pattern=release-{{raw}}
type=sha
type=raw,value=${{ github.event.inputs.tag }}
- name: Build and push Docker images
run: |
ROOT_DIR="build/images"
for dir in "$ROOT_DIR"/*/; do
# Find Dockerfile or *.dockerfile in a case-insensitive manner
dockerfile=$(find "$dir" -maxdepth 1 -type f \( -iname 'dockerfile' -o -iname '*.dockerfile' \) | head -n 1)
if [ -n "$dockerfile" ] && [ -f "$dockerfile" ]; then
IMAGE_NAME=$(basename "$dir")
echo "Building Docker image for $IMAGE_NAME with tags:"
# Initialize tag arguments
tag_args=()
# Read each tag and append --tag arguments
while IFS= read -r tag; do
tag_args+=(--tag "${{ secrets.DOCKER_USERNAME }}/$IMAGE_NAME:$tag")
tag_args+=(--tag "ghcr.io/${{ github.repository_owner }}/$IMAGE_NAME:$tag")
tag_args+=(--tag "registry.cn-hangzhou.aliyuncs.com/openimsdk/$IMAGE_NAME:$tag")
done <<< "${{ steps.meta.outputs.tags }}"

# Build and push the Docker image with all tags
docker buildx build --platform linux/amd64,linux/arm64 \
--file "$dockerfile" \
"${tag_args[@]}" \
--push "$dir"
else
echo "No valid Dockerfile found in $dir"
fi
done
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ COPY --from=builder $SERVER_DIR/start-config.yml $SERVER_DIR/
COPY --from=builder $SERVER_DIR/go.mod $SERVER_DIR/
COPY --from=builder $SERVER_DIR/go.sum $SERVER_DIR/

RUN go get github.com/openimsdk/[email protected].14-alpha.5
RUN go get github.com/openimsdk/[email protected].15-alpha.1

# Set the command to run when the container starts
ENTRYPOINT ["sh", "-c", "mage start && tail -f /dev/null"]
38 changes: 19 additions & 19 deletions build/images/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
# Copyright © 2023 OpenIM. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# # Copyright © 2023 OpenIM. All rights reserved.
# #
# # Licensed under the Apache License, Version 2.0 (the "License");
# # you may not use this file except in compliance with the License.
# # You may obtain a copy of the License at
# #
# # http://www.apache.org/licenses/LICENSE-2.0
# #
# # Unless required by applicable law or agreed to in writing, software
# # distributed under the License is distributed on an "AS IS" BASIS,
# # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# # See the License for the specific language governing permissions and
# # limitations under the License.

FROM BASE_IMAGE
# FROM BASE_IMAGE

WORKDIR ${SERVER_WORKDIR}
# WORKDIR ${SERVER_WORKDIR}

# Set HTTP proxy
ARG BINARY_NAME
# # Set HTTP proxy
# ARG BINARY_NAME

COPY BINARY_NAME ./bin/BINARY_NAME
# COPY BINARY_NAME ./bin/BINARY_NAME

ENTRYPOINT ["./bin/BINARY_NAME"]
# ENTRYPOINT ["./bin/BINARY_NAME"]
56 changes: 24 additions & 32 deletions build/images/openim-api/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,44 +1,36 @@
# Copyright © 2023 OpenIM. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Use Go 1.22 Alpine as the base image for building the application
FROM golang:1.22-alpine AS builder

# OpenIM base image: https://github.com/openim-sigs/openim-base-image
# Define the base directory for the application as an environment variable
ENV SERVER_DIR=/openim-server

# Set go mod installation source and proxy
# Set the working directory inside the container based on the environment variable
WORKDIR $SERVER_DIR

FROM golang:1.20 AS builder
# Set the Go proxy to improve dependency resolution speed
#ENV GOPROXY=https://goproxy.io,direct

ARG GO111MODULE=on

WORKDIR /openim/openim-server

ENV GO111MODULE=$GO111MODULE
ENV GOPROXY=$GOPROXY
# Copy all files from the current directory into the container
COPY . .

COPY go.mod go.sum ./
RUN go mod download
RUN go mod tidy

COPY . .
RUN go build -o _output/openim-api ./cmd/openim-api

RUN make build BINS=openim-api
# Using Alpine Linux for the final image
FROM alpine:latest

RUN cp /openim/openim-server/_output/bin/platforms/$(go env GOOS)/$(go env GOARCH)/openim-api /usr/bin/openim-api
# Install necessary packages, such as bash
RUN apk add --no-cache bash

# FROM ghcr.io/openim-sigs/openim-bash-image:latest
FROM ghcr.io/openim-sigs/openim-bash-image:latest
# Set the environment and work directory
ENV SERVER_DIR=/openim-server
WORKDIR $SERVER_DIR

WORKDIR /openim/openim-server

COPY --from=builder /usr/bin/openim-api ./bin/openim-api
# Copy the compiled binaries and mage from the builder image to the final image
COPY --from=builder $SERVER_DIR/_output $SERVER_DIR/_output
COPY --from=builder $SERVER_DIR/config $SERVER_DIR/config

ENTRYPOINT ["./bin/openim-api"]
# Set the command to run when the container starts
ENTRYPOINT ["sh", "-c", "_output/openim-api"]
44 changes: 0 additions & 44 deletions build/images/openim-cmdutils/Dockerfile

This file was deleted.

55 changes: 25 additions & 30 deletions build/images/openim-crontask/Dockerfile
Original file line number Diff line number Diff line change
@@ -1,44 +1,39 @@
# Copyright © 2023 OpenIM. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Use Go 1.22 Alpine as the base image for building the application
FROM golang:1.22-alpine AS builder
# Define the base directory for the application as an environment variable
ENV SERVER_DIR=/openim-server

# OpenIM base image: https://github.com/openim-sigs/openim-base-image
# Set the working directory inside the container based on the environment variable
WORKDIR $SERVER_DIR

# Set go mod installation source and proxy
# Set the Go proxy to improve dependency resolution speed

FROM golang:1.20 AS builder
#ENV GOPROXY=https://goproxy.io,direct

ARG GO111MODULE=on
# Copy all files from the current directory into the container
COPY . .

WORKDIR /openim/openim-server
RUN go mod tidy

ENV GO111MODULE=$GO111MODULE
ENV GOPROXY=$GOPROXY

COPY go.mod go.sum ./
RUN go mod download

COPY . .
RUN go build -o _output/openim-crontask ./cmd/openim-crontask


RUN make build BINS=openim-crontask
# Using Alpine Linux for the final image
FROM alpine:latest

RUN cp /openim/openim-server/_output/bin/platforms/$(go env GOOS)/$(go env GOARCH)/openim-crontask /usr/bin/openim-crontask
# Install necessary packages, such as bash
RUN apk add --no-cache bash

# FROM ghcr.io/openim-sigs/openim-bash-image:latest
FROM ghcr.io/openim-sigs/openim-bash-image:latest
# Set the environment and work directory
ENV SERVER_DIR=/openim-server
WORKDIR $SERVER_DIR

WORKDIR /openim/openim-server

COPY --from=builder /usr/bin/openim-crontask ./bin/openim-crontask
# Copy the compiled binaries and mage from the builder image to the final image
COPY --from=builder $SERVER_DIR/_output $SERVER_DIR/_output
# COPY --from=builder $SERVER_DIR/config $SERVER_DIR/config

ENTRYPOINT ["./bin/openim-crontask"]
# Set the command to run when the container starts
ENTRYPOINT ["sh", "-c", "_output/openim-crontask"]
Loading
Loading