在 CentOS 上搭建 Golang 项目的持续集成
一 环境准备
二 方案一 GitLab CI 最小可用流水线
stages:
- build
- test
- deploy
variables:
GO_VERSION: "1.17"
PROJECT_NAME: "my-golang-app"
build:
stage: build
image: golang:${GO_VERSION}
script:
- go version
- go build -o ${PROJECT_NAME} .
artifacts:
paths:
- ${PROJECT_NAME}
test:
stage: test
image: golang:${GO_VERSION}
script:
- go test -v ./...
deploy:
stage: deploy
image: docker:latest
services:
- docker:dind
script:
- echo $CI_REGISTRY_PASSWORD | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:${CI_COMMIT_REF_SLUG} .
- docker push $CI_REGISTRY_IMAGE:${CI_COMMIT_REF_SLUG}
三 方案二 Jenkins 在 CentOS 上的落地
#!/bin/bash
export GOPATH=/var/lib/jenkins/golang_workspace
export PATH=$PATH:$GOPATH/bin
export GO111MODULE=on
export GOPROXY=https://goproxy.io
go clean -cache -modcache -i -r
go mod download
CGO_ENABLED=0 GOARCH=amd64 go build -o bin/myapp main.go
# 可选:构建并推送镜像
# docker build -t your-registry/your-project:$BUILD_ID .
# docker push your-registry/your-project:$BUILD_ID
# 可选:通过 SSH 部署
# scp -r bin user@yourserver:/opt/myapp/
四 关键实践与优化
FROM golang:1.18 AS builder
WORKDIR /usr/src/app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -installsuffix cgo -o app .
FROM alpine:latest
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/app .
EXPOSE 8080
CMD ["./app"]