How to deploy go application to multiple servers with gitlab-ci
Contents
Install Gitlab Runner
Deploy server
supose the machine ip is 11.11.11.11.
docker volume create gitlab-server-data
docker run -d --name gitlab-server \
-p 8088:8088 \
-v ./gitlab/config:/etc/gitlab \
-v ./gitlab/logs:/var/log/gitlab \
-v gitlab-server-data:/var/opt/gitlab
gitlab/gitlab-ce:latest
Deploy runner
docker volume create gitlab-runner-config
docker run -d --name gitlab-runner --restart always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitlab-runner-config:/etc/gitlab-runner \
gitlab/gitlab-runner:alpine
Register runner
enter the Gitlab instance URL: http://11.11.11.11:8088 to connect to gitlab-server.
docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
-v gitlab-runner-config:/etc/gitlab-runner \
gitlab/gitlab-runner:alpine \
register
Cannot connect to the Docker daemon at tcp://docker:2375 error
docker exec -it gitlab-runner bash
cd /etc/gitlab-runner/
vi config.toml
Set volumes = ["/cache", "/var/run/docker.sock:/var/run/docker.sock"]
Configure .gitlab-ci.yml
stages:
- build_project
- build_image
- update_service
- remove_image
A:
stage: build_project
when: manual
image: golang:alpine
script:
- mkdir conf
- cat $APP_CONF > conf/app.conf
- CGO_ENABLED=0 GOOS=linux GO111MODULE=on GOPROXY=https://goproxy.cn go build -a -installsuffix cgo -o app
artifacts:
paths:
- app # save and handoff the build binary file to later stage
tags:
- runner1 # select the runner with tag runner1 to excute
only:
- master # only master branch
allow_failure: false
B(server1):
stage: build_image
when: on_success
image: docker:19.03.1
before_script:
- mkdir static
- mkdir conf
script:
- cat $APP_CONF > conf/app.conf
- cat $DOCKER_FILE > Dockerfile
- docker build --force-rm --tag $PROJECT_NAME:latest --label old .
tags:
- runner1
only:
- master
allow_failure: false
B(server2):
stage: build_image
when: on_success
image: docker:19.03.1
before_script:
- mkdir static
- mkdir conf
script:
- cat $APP_CONF > conf/app.conf
- cat $DOCKER_FILE > Dockerfile
- docker build --force-rm --tag $PROJECT_NAME:latest --label old .
tags:
- runner2
only:
- master
allow_failure: false
C:
stage: update_service
when: on_success
dependencies: [] # skip artifacts downloading
script:
# - apk add curl
# - curl -XPOST $WEB_HOOK
- docker service update --force $PROJECT_NAME
tags:
- runner1
only:
- master
allow_failure: false
D(server1):
stage: remove_image
when: on_success
dependencies: []
script:
- echo ""
after_script:
- docker rmi --force --filter='label=old'
# - docker images --format="{{.Repository}}:{{.Tag}} {{.ID}}" | grep "$PROJECT_NAME:old " | cut -d' ' -f2 | xargs docker rmi -f
tags:
- runner1
only:
- master
D(server2):
stage: remove_image
when: on_success
dependencies: []
script:
- echo ""
after_script:
- docker rmi --force --filter='label=old'
# - docker images --format="{{.Repository}}:{{.Tag}} {{.ID}}" | grep "$PROJECT_NAME:old " | cut -d' ' -f2 | xargs docker rmi -f
tags:
- runner2
only:
- master