diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa3ca01e..871534d1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,18 +1,15 @@ -name: CI +name: Build Go on: push: branches: [ main ] - paths-ignore: - - "*.md" + tags: [ "v*" ] pull_request: - branches: [ main ] - paths-ignore: - - "*.md" + branches: [ "main" ] + paths-ignore: [ "*.md" ] - # Allows you to run this workflow manually from the Actions tab - workflow_dispatch: + workflow_dispatch: # Allows you to run this workflow manually from the Actions tab env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} @@ -30,28 +27,68 @@ jobs: build_docker_image: runs-on: ubuntu-latest steps: - - name: Set up Go - uses: actions/setup-go@v5 - with: - go-version: 1.22 - uses: actions/checkout@v4 - - name: Build Docker run: | - source ./tool.sh && build_image supervisord latest src/supervisord.Dockerfile && push_image + source ./tool.sh + VER=$(date +%Y.%m%d.%H%M)${TAG_SUFFIX}; + build_image_no_tag supervisord "ubuntu-${VER}" src/supervisord.Dockerfile --build-arg "BASE_NAMESPACE=library" --build-arg "BUILD_IMG=golang:alpine" --build-arg "BASE_IMG=alpine" + build_image_no_tag supervisord "alpine-${VER}" src/supervisord.Dockerfile --build-arg "BASE_NAMESPACE=qpod" --build-arg "BUILD_IMG=go:latest" --build-arg "BASE_IMG=ubuntu" + docker tag "${IMG_PREFIX}/supervisord:ubuntu-${VER}" "${IMG_PREFIX}/supervisord:latest" ; + push_image supervisord build_binary: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.22 - name: Build Binary run: | set -eux pwd && ls -alh * + mkdir -pv build && mv src/etc src/webgui ./build/ cd src/supervisord - go mod tidy - go test -v + go mod tidy && go test -v go build -v -o ../../build/ - cd ../../ - mv src/etc src/webgui ./build/ + cd ../../ ls -alh build + + build_goreleaser: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: 1.22 + + - name: Install cross-compiler for linux/arm64, UPX + env: + VER_UPX: "4.2.4" + run: | + sudo apt-get update -q && sudo apt-get -y install gcc-aarch64-linux-gnu ; + + URL_UPX="https://github.com/upx/upx/releases/download/v${VER_UPX}/upx-${VER_UPX}-amd64_linux.tar.xz" ; + echo "Installing upx ${VER_UPX} from: ${URL_UPX}" ; + curl -o /tmp/TMP.txz -sL $URL_UPX && tar -C /opt/ -xJf /tmp/TMP.txz && rm /tmp/TMP.txz ; + ln -sf /opt/upx-${VER_UPX}-amd64_linux /opt/upx + export PATH="/opt/upx/:${PATH}" + upx --version | grep -E '^upx' + + cd src/supervisord && go mod tidy -e + + - if: ${{ !startsWith(github.ref, 'refs/tags/v') }} + # if not on a `tags/v*` git push, add `--snapshot` to flags + run: echo "flags=--snapshot" >> $GITHUB_ENV + + - uses: goreleaser/goreleaser-action@v6 + env: + GITHUB_TOKEN: ${{ secrets.GA_TOKEN }} + with: + distribution: goreleaser + version: latest + args: release --verbose --clean ${{ env.flags }} + workdir: src/supervisord diff --git a/.github/.goreleaser.yml b/src/.goreleaser.yml similarity index 98% rename from .github/.goreleaser.yml rename to src/.goreleaser.yml index bcf5496e..9522058d 100644 --- a/.github/.goreleaser.yml +++ b/src/.goreleaser.yml @@ -5,7 +5,7 @@ env: before: hooks: - - go mod tidy + - go mod tidy -e builds: - id: dynamic @@ -46,7 +46,6 @@ builds: goarch: amd64 env: - CC=gcc - - goos: linux goarch: arm64 env: @@ -56,7 +55,6 @@ builds: - cmd: upx "{{ .Path }}" archives: - - id: archive_multi builds: [dynamic] name_template: >- diff --git a/src/supervisord.Dockerfile b/src/supervisord.Dockerfile index 5e42750e..6df3f1db 100644 --- a/src/supervisord.Dockerfile +++ b/src/supervisord.Dockerfile @@ -1,10 +1,24 @@ -FROM golang:alpine AS base -RUN apk add --no-cache --update git gcc rust +# Distributed under the terms of the Modified BSD License. +ARG BASE_NAMESPACE +ARG BUILD_IMG="golang:latest" +ARG BASE_IMG="ubuntu:latest" -FROM base AS builder -COPY . /tmp/src -WORKDIR /tmp/src +FROM ${BASE_NAMESPACE:+$BASE_NAMESPACE/}${BUILD_IMG} AS builder + +RUN if command -v apt-get >/dev/null 2>&1; then \ + echo "Detected Debian/Ubuntu environment. Installing packages using apt-get..." ; \ + apt-get update && apt-get install -y gcc ; \ + elif command -v apk >/dev/null 2>&1; then \ + echo "Detected Alpine environment. Installing packages using apk..." ; \ + apk add --no-cache gcc musl-dev ; \ + else \ + echo "Unsupported environment. Neither apt-get nor apk found." ; \ + return 1 ; \ + fi + +COPY ./src /tmp/src +WORKDIR /tmp/src RUN set -eux && pwd && ls -alh \ && mkdir -pv /opt/supervisord && mv webgui etc /opt/supervisord/ \ && cd supervisord \ @@ -13,7 +27,9 @@ RUN set -eux && pwd && ls -alh \ && /opt/supervisord/supervisord version -FROM busybox +ARG BASE_IMG="atom" +FROM ${BASE_IMG} +LABEL maintainer="haobibo@gmail.com" COPY --from=builder /opt/supervisord /opt/supervisord EXPOSE 9001 WORKDIR /opt/supervisord/ diff --git a/tool.sh b/tool.sh index ab015a14..82ebec5d 100644 --- a/tool.sh +++ b/tool.sh @@ -1,7 +1,7 @@ #!/bin/bash set -xu -CI_PROJECT_NAME=${GITHUB_REPOSITORY:-"QPod/lab-dev"} +CI_PROJECT_NAME=${CI_PROJECT_NAME:-$GITHUB_REPOSITORY} CI_PROJECT_BRANCH=${GITHUB_HEAD_REF:-"main"} CI_PROJECT_SPACE=$(echo "${CI_PROJECT_BRANCH}" | cut -f1 -d'/') @@ -9,15 +9,16 @@ if [ "${CI_PROJECT_BRANCH}" = "main" ] ; then # If on the main branch, docker images namespace will be same as CI_PROJECT_NAME's name space export CI_PROJECT_NAMESPACE="$(dirname ${CI_PROJECT_NAME})" ; else - # not main branch, docker namespace = {CI_PROJECT_NAME's name space} + "0" + {1st substr before / in CI_PROJECT_SPACE} + # not main branch, docker namespace = {CI_PROJECT_NAME's name space} + "-" + {1st substr before / in CI_PROJECT_SPACE} export CI_PROJECT_NAMESPACE="$(dirname ${CI_PROJECT_NAME})0${CI_PROJECT_SPACE}" ; fi +export SRC_NAMESPACE="${REGISTRY_SRC:-docker.io}" export IMG_NAMESPACE=$(echo "${CI_PROJECT_NAMESPACE}" | awk '{print tolower($0)}') export IMG_PREFIX=$(echo "${REGISTRY_URL:-"docker.io"}/${IMG_NAMESPACE}" | awk '{print tolower($0)}') export TAG_SUFFIX="-$(git rev-parse --short HEAD)" -echo "--------> CI_PROJECT_NAMESPACE=${CI_PROJECT_NAMESPACE}" +echo "--------> CI_PROJECT_NAMESPACE=${CI_PROJECT_NAMESPACE}" # use different namespace for dev/prd echo "--------> DOCKER_IMG_NAMESPACE=${IMG_NAMESPACE}" echo "--------> DOCKER_IMG_PREFIX=${IMG_PREFIX}" echo "--------> DOCKER_TAG_SUFFIX=${TAG_SUFFIX}" @@ -31,21 +32,21 @@ docker info build_image() { echo "$@" ; - IMG=$1; TAG=$2; FILE=$3; shift 3; VER=$(date +%Y.%m%d.%H%M)${TAG_SUFFIX}; WORKDIR="$(dirname $FILE)"; - docker build --compress --force-rm=true -t "${IMG_PREFIX}/${IMG}:${TAG}" -f "$FILE" --build-arg "BASE_NAMESPACE=${IMG_PREFIX}" "$@" "${WORKDIR}" ; + IMG=$1; TAG=$2; FILE=$3; shift 3; VER=$(date +%Y.%m%d.%H%M)${TAG_SUFFIX}; WORKDIR="$(pwd)"; + docker build --compress --force-rm=true -t "${IMG_PREFIX}/${IMG}:${TAG}" -f "$FILE" --build-arg "BASE_NAMESPACE=${SRC_NAMESPACE}" "$@" "${WORKDIR}" ; docker tag "${IMG_PREFIX}/${IMG}:${TAG}" "${IMG_PREFIX}/${IMG}:${VER}" ; } build_image_no_tag() { echo "$@" ; - IMG=$1; TAG=$2; FILE=$3; shift 3; WORKDIR="$(dirname $FILE)"; - docker build --compress --force-rm=true -t "${IMG_PREFIX}/${IMG}:${TAG}" -f "$FILE" --build-arg "BASE_NAMESPACE=${IMG_PREFIX}" "$@" "${WORKDIR}" ; + IMG=$1; TAG=$2; FILE=$3; shift 3; WORKDIR="$(pwd)"; + docker build --compress --force-rm=true -t "${IMG_PREFIX}/${IMG}:${TAG}" -f "$FILE" --build-arg "BASE_NAMESPACE=${SRC_NAMESPACE}" "$@" "${WORKDIR}" ; } build_image_common() { echo "$@" ; - IMG=$1; TAG=$2; FILE=$3; shift 3; VER=$(date +%Y.%m%d.%H%M)${TAG_SUFFIX}; WORKDIR="$(dirname $FILE)"; - docker build --compress --force-rm=true -t "${IMG_PREFIX}/${IMG}:${TAG}" -f "$FILE" --build-arg "BASE_NAMESPACE=${IMG_PREFIX}" "$@" "${WORKDIR}" ; + IMG=$1; TAG=$2; FILE=$3; shift 3; VER=$(date +%Y.%m%d.%H%M)${TAG_SUFFIX}; WORKDIR="$(pwd)"; + docker build --compress --force-rm=true -t "${IMG_PREFIX}/${IMG}:${TAG}" -f "$FILE" --build-arg "BASE_NAMESPACE=${SRC_NAMESPACE}" "$@" "${WORKDIR}" ; docker tag "${IMG_PREFIX}/${IMG}:${TAG}" "${IMG_PREFIX}/${IMG}:${VER}" ; } @@ -88,6 +89,5 @@ remove_folder() { free_diskspace() { remove_folder /usr/share/dotnet remove_folder /usr/local/lib/android - # remove_folder /var/lib/docker df -h }