From a8cf86f7094682628bb89c9d5c37e3ccbca0b496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=9F=E5=AE=81?= Date: Sun, 10 Aug 2025 06:38:14 +0000 Subject: [PATCH] !95 make devstar & CI/CD * make devstar && CI/CD --- .gitea/workflows/devstar-studio-autotest.yaml | 45 +++++++++ ...-dev-ci.yaml => devstar-studio-ci-cd.yaml} | 11 +-- Makefile | 4 + README.md | 10 +- docker/Dockerfile.devContainer | 17 ++++ docker/Dockerfile.devstar | 91 +++++++++++++++++++ docker/Dockerfile.runtimeContainer | 24 +++++ 7 files changed, 191 insertions(+), 11 deletions(-) create mode 100644 .gitea/workflows/devstar-studio-autotest.yaml rename .gitea/workflows/{devstar-studio-dev-ci.yaml => devstar-studio-ci-cd.yaml} (92%) create mode 100644 docker/Dockerfile.devContainer create mode 100644 docker/Dockerfile.devstar create mode 100644 docker/Dockerfile.runtimeContainer diff --git a/.gitea/workflows/devstar-studio-autotest.yaml b/.gitea/workflows/devstar-studio-autotest.yaml new file mode 100644 index 0000000000..3a45d666c4 --- /dev/null +++ b/.gitea/workflows/devstar-studio-autotest.yaml @@ -0,0 +1,45 @@ +# DevStar 自动化测试工作流定义 +# +# Artifact命名规则: +# 1. ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:latest +# e.g., devstar.cn/devstar/devstar-studio:latest +# 2. ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:rootless-dev-${{ gitea.sha }} +# e.g., devstar.cn/devstar/devstar-studio:rootless-dev-0047d315a3f73cca0c18c641d24b0347456618d5 +# 其中, +# - rootless 表示非 root 权限容器 +# - dev 表示开发版本 +# - ${{ gitea.sha }} 表示触发 CI Workflow 的 commit SHA +# +# 构建参数设置 +# 点击仓库 > 设置 > Actions > 密钥: +# - ${{ secrets.DOCKER_REGISTRY_USERNAME }}: Docker Registry 用户名 +# - ${{ secrets.DOCKER_REGISTRY_PASSWORD }}: Docker Registry 密码 +# 点击仓库 > 设置 > Actions > 变量: +# - ${{ vars.DOCKER_REGISTRY_ADDRESS }}: Docker Registry 域名, e.g., `devstar.cn` +# - ${{ vars.DOCKER_REPOSITORY_ARTIFACT}}: 制品名称, e.g., `devstar/devstar-studio` +# + +name: DevStar Studio Auto Test Pipeline +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + build-and-push-x86-64-docker-image: + # Actual runs-on image: docker.io/library/gitea/runner_image:ubuntu-latest + runs-on: ubuntu-latest + steps: + - name: 🔍 Check out repository code + uses: https://devstar.cn/actions/checkout@v4 + with: + ref: main + - name: 🔧 Test Codes and Build an Artifact + run: | + echo "Prepare to build repository code ${{ gitea.repository }}:${{ gitea.ref }}." + make test + make devstar + \ No newline at end of file diff --git a/.gitea/workflows/devstar-studio-dev-ci.yaml b/.gitea/workflows/devstar-studio-ci-cd.yaml similarity index 92% rename from .gitea/workflows/devstar-studio-dev-ci.yaml rename to .gitea/workflows/devstar-studio-ci-cd.yaml index 1ff2b1c630..44b2b53395 100644 --- a/.gitea/workflows/devstar-studio-dev-ci.yaml +++ b/.gitea/workflows/devstar-studio-ci-cd.yaml @@ -1,5 +1,4 @@ -# devstar-studio-dev-ci.yaml -# DevStar 测试并构建制品 CI 工作流定义 +# DevStar 构建制品 CI/CD 工作流定义 # # Artifact命名规则: # 1. ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:latest @@ -20,7 +19,7 @@ # - ${{ vars.DOCKER_REPOSITORY_ARTIFACT}}: 制品名称, e.g., `devstar/devstar-studio` # -name: DevStar Studio CI Pipeline +name: DevStar Studio CI/CD Pipeline on: push: branches: @@ -41,11 +40,11 @@ jobs: - name: 🔧 Test Codes and Build an Artifact run: | echo "Prepare to build repository code ${{ gitea.repository }}:${{ gitea.ref }}." - docker build -t gitea/gitea:latest . + make devstar - name: 🚀 Push Artifact to devstar.cn and docker.io Registry run: | - docker tag gitea/gitea:latest ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:rootless-dev-${{ gitea.sha }} - docker tag gitea/gitea:latest ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:latest + docker tag devstar-studio:latest ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:rootless-dev-${{ gitea.sha }} + docker tag devstar-studio:latest ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:latest echo "${{ secrets.DOCKER_REGISTRY_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_REGISTRY_USERNAME }} ${{ vars.DOCKER_REGISTRY_ADDRESS }} --password-stdin docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:rootless-dev-${{ gitea.sha }} docker push ${{ vars.DOCKER_REGISTRY_ADDRESS }}/${{ vars.DOCKER_REPOSITORY_ARTIFACT}}:latest diff --git a/Makefile b/Makefile index 6a3fa60e49..65cc683213 100644 --- a/Makefile +++ b/Makefile @@ -915,6 +915,10 @@ generate-manpage: ## generate manpage @gzip -9 man/man1/gitea.1 && echo man/man1/gitea.1.gz created @#TODO A small script that formats config-cheat-sheet.en-us.md nicely for use as a config man page +.PHONY: devstar +devstar: + docker build -t devstar-studio:latest -f docker/Dockerfile.devstar . + .PHONY: docker docker: docker build --disable-content-trust=false -t $(DOCKER_REF) . diff --git a/README.md b/README.md index dbb291e64d..3fdb5cf6da 100644 --- a/README.md +++ b/README.md @@ -70,8 +70,8 @@ After building, a binary file named `gitea` will be generated in the root of the Start from Container Image: ``` -make docker -public/assets/install.sh start --image=gitea/gitea:latest +make devstar +public/assets/install.sh start --image=devstar-studio:latest # 查看日志 public/assets/install.sh logs @@ -95,8 +95,8 @@ wsl --install -d Ubuntu-20.04 && wsl --setdefault Ubuntu-20.04 ```bash # download and install go -wget -c https://go.dev/dl/go1.23.3.linux-amd64.tar.gz -sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.23.3.linux-amd64.tar.gz +wget -c https://go.dev/dl/go1.24.6.linux-amd64.tar.gz +sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.24.6.linux-amd64.tar.gz export PATH=$PATH:/usr/local/go/bin go version @@ -127,7 +127,7 @@ git commit -m "commit log" git push ``` -在DevStar Git仓库发起Pull Request,合并代码后会自动触发CI流水线完成容器镜像的构建并上传到devstar.cn/devstar/devstar-studio:latest +在DevStar Git仓库发起Pull Request,合并代码后会自动触发CI流水线完成容器镜像的构建并上传到 mengning997/devstar-studio:latest 和 devstar.cn/devstar/devstar-studio:latest ``` public/assets/install.sh start diff --git a/docker/Dockerfile.devContainer b/docker/Dockerfile.devContainer new file mode 100644 index 0000000000..44430e18c5 --- /dev/null +++ b/docker/Dockerfile.devContainer @@ -0,0 +1,17 @@ +# prepare base dev environment for Gitea + +FROM docker.io/library/golang:1.24-alpine3.22 AS build-env + +# Build deps +RUN apk --no-cache add \ + build-base \ + git \ + icu-data-full \ + nodejs \ + npm \ + && rm -rf /var/cache/apk/* + +# To acquire Gitea dev container: +# $ docker build -t devstar.cn/devstar/devstar-dev-container:latest -f docker/Dockerfile.devContainer . +# $ docker login devstar.cn +# $ docker push devstar.cn/devstar/devstar-dev-container:latest diff --git a/docker/Dockerfile.devstar b/docker/Dockerfile.devstar new file mode 100644 index 0000000000..6c374dd9c2 --- /dev/null +++ b/docker/Dockerfile.devstar @@ -0,0 +1,91 @@ +# Build stage +# FROM docker/Dockerfile.devContainer +FROM devstar.cn/devstar/devstar-dev-container:latest AS build-env + +ARG GOPROXY="https://goproxy.cn" +ENV GOPROXY=${GOPROXY:-direct} + +ARG GITEA_VERSION +ARG TAGS="sqlite sqlite_unlock_notify" +ENV TAGS="bindata timetzdata $TAGS" +ARG CGO_EXTRA_CFLAGS + +#Build deps +# RUN apk --no-cache add \ +# build-base \ +# git \ +# nodejs \ +# npm \ +# && rm -rf /var/cache/apk/* + +# Setup repo +COPY . ${GOPATH}/src/code.gitea.io/gitea +WORKDIR ${GOPATH}/src/code.gitea.io/gitea + +# Checkout version if set +RUN if [ -n "${GITEA_VERSION}" ]; then git checkout "${GITEA_VERSION}"; fi \ + && make clean-all build + +# Begin env-to-ini build +RUN go build contrib/environment-to-ini/environment-to-ini.go + +# Copy local files +COPY docker/rootless /tmp/local + +# Set permissions +RUN chmod 755 /tmp/local/usr/local/bin/docker-entrypoint.sh \ + /tmp/local/usr/local/bin/docker-setup.sh \ + /tmp/local/usr/local/bin/gitea \ + /go/src/code.gitea.io/gitea/gitea \ + /go/src/code.gitea.io/gitea/environment-to-ini + +# FROM docker/Dockerfile.runtimeContainer +FROM devstar.cn/devstar/devstar-runtime-container:latest +LABEL maintainer="contact@mengning.com.cn" + +EXPOSE 2222 3000 + +# RUN apk --no-cache add \ +# bash \ +# ca-certificates \ +# dumb-init \ +# gettext \ +# git \ +# curl \ +# gnupg \ +# openssh-keygen \ +# && rm -rf /var/cache/apk/* + +RUN addgroup \ + -S -g 1000 \ + git && \ + adduser \ + -S -H -D \ + -h /var/lib/gitea/git \ + -s /bin/bash \ + -u 1000 \ + -G git \ + git + +RUN mkdir -p /var/lib/gitea /etc/gitea +RUN chown git:git /var/lib/gitea /etc/gitea + +COPY --from=build-env /tmp/local / +COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/gitea /app/gitea/gitea +COPY --from=build-env --chown=root:root /go/src/code.gitea.io/gitea/environment-to-ini /usr/local/bin/environment-to-ini + +# git:git +USER 1000:1000 +ENV GITEA_WORK_DIR=/var/lib/gitea +ENV GITEA_CUSTOM=/var/lib/gitea/custom +ENV GITEA_TEMP=/tmp/gitea +ENV TMPDIR=/tmp/gitea + +# TODO add to docs the ability to define the ini to load (useful to test and revert a config) +ENV GITEA_APP_INI=/etc/gitea/app.ini +ENV HOME="/var/lib/gitea/git" +VOLUME ["/var/lib/gitea", "/etc/gitea"] +WORKDIR /var/lib/gitea + +ENTRYPOINT ["/usr/bin/dumb-init", "--", "/usr/local/bin/docker-entrypoint.sh"] +CMD [] diff --git a/docker/Dockerfile.runtimeContainer b/docker/Dockerfile.runtimeContainer new file mode 100644 index 0000000000..f04e0d0d30 --- /dev/null +++ b/docker/Dockerfile.runtimeContainer @@ -0,0 +1,24 @@ +# prepare base runtime environment for Gitea + +FROM docker.io/library/alpine:3.22 + +RUN apk --no-cache add \ + bash \ + ca-certificates \ + curl \ + gettext \ + git \ + linux-pam \ + openssh \ + s6 \ + dumb-init \ + sqlite \ + su-exec \ + gnupg \ + docker-cli \ + && rm -rf /var/cache/apk/* + +# To acquire Gitea base runtime container: +# $ docker build -t devstar.cn/devstar/devstar-runtime-container:latest -f docker/Dockerfile.runtimeContainer . +# $ docker login devstar.cn +# $ docker push devstar.cn/devstar/devstar-runtime-container:latest