gitlab構建CI/CD
準備
docker部署gitlab
通過docker-compose啟動gitlab
version: '3'
services:
gitlab:
image: 'gitlab/gitlab-ce:latest'
restart: always
hostname: '1.1.1.1'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://1.1.1.1:9001'
gitlab_rails['gitlab_shell_ssh_port'] = 1022
unicorn['port'] = 8888
nginx['listen_port'] = 9001
ports:
- '9001:9001'
- '443:443'
- '1022:22'
volumes:
- ./config:/etc/gitlab
- ./data:/var/opt/gitlab
- ./losg:/var/log/gitlab
使用二進位制部署gitlab-runner
可參考官方的安裝方式Install GitLab Runner manually on GNU/Linux
gitlab-runner註冊
安裝完成之後使用註冊命令註冊
$ gitlab-runner register
然後會提示輸入gitlab的地址以及token資訊
地址資訊和token我們在下面可以看到
根據提示輸入資訊,需要注意的是裡面的tags
就是我們編寫.gitlab-ci.yml
對應填寫的tag
之後在gitlab
的runner
中就可以看到我們註冊的gitlab-runner
了
配置Variables
在gitlab中可以配置我們gitlab-runner需要的變數,比如我們的docker-hub的密碼,gitlab的賬號密碼等資訊
簡單先來個測試
先來個簡單的gitlab-ci.yml
測試下
stages:
- test
- build
variables:
GOPROXY: https://goproxy.cn
lint:
stage: test
script:
- echo "hello world lint"
only:
- branches
tags:
- golang-runner
test:
stage: test
script:
- echo "hello world test"
only:
- branches
cache:
key: "bazel"
paths:
- .cache
tags:
- golang-runner
開始構建
通過helm
和bazel
實現在gitlab-runner
中k8s應用的自動編譯,釋出。
映象推送到docker-hub
中,gitlab-runner
中的helm
需要配置好,這裡我是用了helm
預設初始化的charts
結構來發布應用
gitlab-ci.yml
stages:
- test
- build
- deploy
variables:
GOPROXY: https://goproxy.cn
lint:
stage: test
script:
- export GO_PROJECT_PATH="/home/gitlab-runner/goWork/src"
- mkdir -p $GO_PROJECT_PATH
- ln -s $(pwd) $GO_PROJECT_PATH/test
- cd $GO_PROJECT_PATH/test
- bash build/lint.sh
only:
- branches
tags:
- golang-runner
test:
stage: test
script:
- go mod vendor
- bash build/bazel-test.sh
only:
- branches
cache:
key: "bazel"
paths:
- .cache
tags:
- golang-runner
build:
stage: build
before_script:
- url_host=`git remote get-url origin | sed -e "s/http:\/\/gitlab-ci-token:.*@//g"`
- git remote set-url origin "http://$GIT_ACCESS_USER:$GIT_ACCESS_PASSWORD@${url_host}"
- git config user.name $GIT_ACCESS_USER
- git config user.email $GIT_ACCESS_EMAIL
- git fetch --tags --force
script:
- docker login -u $DOCKER_ACCESS_USER -p $DOCKER_ACCESS_PASSWORD
- go mod vendor
- bash build/bazel-build.sh
only:
- master
cache:
key: "bazel"
paths:
- .cache
tags:
- golang-runner
include: '/.gitlab/deploy.yaml'
映象打包
test::util:build_docker_images() {
local docker_registry=$1
local docker_tag=$2
local base_image="alpine:3.7"
query=$(test::util::find_changes)
if [ "$query" == "" ]; then
test::util::log "no change and exit..."
exit 0
fi
for b in ${query}; do
b=${b//\/\/src/"/src"}
if [[ $b == *test* ]]
then
continue
fi
local binary_file_path=$(test::util::find_binary "$b")
local binary_name=$(test::util::get_binary_name "$b")
local docker_build_path="dockerbuild/${binary_name}"
local docker_file_path="${docker_build_path}/Dockerfile"
local docker_image_tag="${docker_registry}/${binary_name}:${docker_tag}"
test::util::log "Starting docker build for image: ${binary_name}"
(
rm -rf "${docker_build_path}"
mkdir -p "${docker_build_path}"
cp "${binary_file_path}" "${docker_build_path}/${binary_name}"
cat <<EOF >"${docker_file_path}"
FROM ${base_image}
COPY ${binary_name} /usr/local/bin/${binary_name}
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories \
&& apk update --no-cache \
ENTRYPOINT ["/usr/local/bin/${binary_name}"]
EOF
docker build -q -t "${docker_image_tag}" "${docker_build_path}"
docker push ${docker_image_tag}
)
cat <<EOF >>".gitlab/deploy.yaml"
${binary_name}:
stage: deploy
script:
- bash build/deploy.sh ${docker_registry} ${binary_name} ${docker_tag}
only:
- tags
when: manual
environment:
name: test
tags:
- golang-runner
EOF
done
test::util::log "Docker builds done"
}
整體的處理思路是
1、通過bazel
構建go專案。
2、構建的時候找到有改動的專案,編譯,打包映象,生成deploy
指令碼。
3、打上tag,推到gitlab
中。
4、最後通過手動觸發專案的deploy
,通過helm
釋出對應的專案到k8s
中。
專案的地址gitlab-runner構建go專案
最後附上deploy的截圖
對應的專案已經部署上去了
$ kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
demo1-main-test-654fbd4df6-vlhwr 1/1 Running 0 27m
demo2-main-test-58ccfd4f8-hjcdf 1/1 Running 0 25m
demo3-main-test-6897ff9496-mhm5n 1/1 Running 0 27m
遇到的報錯
go: writing go.mod cache: mkdir /home/goWork: permission denied
給使用者gitlab-runner
新增最用目錄的執行許可權
sudo chown -R $(whoami):gitlab-runner /Users/zhushuyan/go/pkg && sudo chmod -R g+rwx /Users/zhushuyan/go/pkg
需要預備的知識點
這裡主要使用到了helm
和bazel