Contents

How to deploy go application to multiple servers with gitlab-ci

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