基於docker的gitlab+gitlabrunner+ansible自動部署

系統架構圖html

 

網絡架構node

1、安裝docker,確保hostname沒有問題 ,查看/etc/hostname、/etc/hosts。linux

https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/#install-docker-ce-1

2、安裝dcoekr-compose,這邊仍是要去官網看看,每次的連接不必定都同樣。nginx

sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

3、docker加速源git

https://cr.console.aliyun.com/#/accelerator

4、docker-compose.yml,經過nginx-proxy訪問gitlab,這裏我就不設置默認網絡,由於我後面要利用ansible鏡像拉取gitlab中項目,若是設置默認網絡就會產生兩個網橋,屆時會沒法通訊。github

  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    restart: always
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx-proxy/certs:/etc/nginx/certs:ro
      - ./nginx-proxy/vhost:/etc/nginx/vhost.d
      - ./nginx-proxy/html:/usr/share/nginx/html
      - /var/run/docker.sock:/tmp/docker.sock:ro
    labels:
      com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy: 'true'


  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt
    restart: always
    volumes:
      - ./nginx-proxy/certs:/etc/nginx/certs:rw
      - ./nginx-proxy/vhost:/etc/nginx/vhost.d
      - ./nginx-proxy/html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro

  gitlab:
    image: 'gitlab/gitlab-ce:latest'
    container_name: 'gitlab'
    restart: always
    hostname: 'gitlab.yourdomain'
    environment:
       GITLAB_OMNIBUS_CNOFIG: |
            external_url 'http://gitlab.yourdomain'
       VIRTUAL_HOST: gitlab.yourdomain
       VIRTUAL_PORT: 80
       VIRTUAL_PROTO: http
       LETSENCRYPT_HOST: gitlab.yourdomain
       LETSENCRYPT_EMAIL: bill.weiwei@foxmail.com
       external_url: http://gitlab.yourdomain
    ports:
        - '30022:22'
    volumes:
        - '/srv/gitlab/config:/etc/gitlab'
        - '/srv/gitlab/logs:/var/log/gitlab'
        - '/srv/gitlab/data:/var/opt/gitlab'
        - './nginx-proxy/certs:/etc/gitlab/ssl'



  gitlab-runner:
    image: 'gitlab/gitlab-runner:latest'
    container_name: 'gitlab-runner'
    restart: 'always'
    volumes:
        - '/srv/gitlab-runner/confg:/etc/gitlab-runner'
        - '/var/run/docker.sock:/var/run/docker.sock'

 

5、註冊gitlab-runnerdocker

docker exec -it gitlab-runner gitlab-ci-multi-runner register

參考:shell

docker exec -it <id container> gitlab-runner register -n
              --url your https://gitlab.your.domain \
              --registration-token you token in your gitlab (AdminArea > Runners you can see token) \
              --executor docker \
              --description "your name which you wante" \
	      --docker-image "node" \
              --docker-privileged true \
              --docker-volumes /var/run/docker.sock:/var/run/docker.sock \
	      --docker-volumes /srv/gitlab-runner/config:/etc/gitlab-runner \

修改配置文件ubuntu

vim /srv/gitlab-runner/config/config.toml	
pull_policy = "if-not-present"
shm_size = 0

 

6、添加ssh公鑰到gitlab上vim

ssh-keygen
cat .ssh/id_rsa.pub

  

7、ansible部署

將ansible的配置文檔放在gitlab上,方便在構建鏡像的時候加載到鏡像中。

####create project your-name-project/ansibleinventory
####create folders inventory and playbooks

##inventory

filename: young-prod-server

[young-prod-server]
****

##playbooks、、two files

#filename:deploy_entrypoint.yml

- hosts: all
  tasks:
  - name: Creating the directory
    file: path=/var/projects/{{ project_name }}-{{ env }}/ state=directory

  - name: Clean src
    file:
      state: absent
      path: "/var/projects/{{ project_name }}-{{ env }}/src"
      
  - name: Clean app
    file:
      state: absent
      path: "/var/projects/{{ project_name }}-{{ env }}/app"

  - name: copy
    unarchive:
      src: "{{ src }}/package.tar"
      dest: /var/projects/{{ project_name }}-{{ env }}/

#  - name: run if exist entrypoint.sh
#    shell: /var/projects/{{ project_name }}/entrypoint.sh
#    when: $(-s /var/projects/{{ project_name }}/entrypoint.sh)

  - name: stop project
    shell: docker-compose -f docker-compose.yml -f docker-compose.{{ env }}.yml stop
    args:
      chdir: /var/projects/{{ project_name }}-{{ env }}/

  - name: start project
    shell: docker-compose -f docker-compose.yml -f docker-compose.{{ env }}.yml up --build -d
    args:
      chdir: /var/projects/{{ project_name }}-{{ env }}/

  - name: run entrypoint.sh
    shell: ./entrypoint.sh
    args:
      chdir: /var/projects/{{ project_name }}-{{ env }}/


#filename:deploy.yml

- hosts: all
  tasks:
  - name: Creating the directory
    file: path=/var/projects/{{ project_name }}-{{ env }}/ state=directory

  - name: copy
    unarchive:
      src: "{{ src }}/package.tar"
      dest: /var/projects/{{ project_name }}-{{ env }}/

#  - name: run if exist entrypoint.sh
#    shell: /var/projects/{{ project_name }}/entrypoint.sh
#    when: $(-s /var/projects/{{ project_name }}/entrypoint.sh)

  - name: stop project
    shell: docker-compose -f docker-compose.yml -f docker-compose.{{ env }}.yml stop
    args:
      chdir: /var/projects/{{ project_name }}-{{ env }}/

  - name: start project
    shell: docker-compose -f docker-compose.yml -f docker-compose.{{ env }}.yml up --build -d
    args:
      chdir: /var/projects/{{ project_name }}-{{ env }}/

##Create file in ansible.cfg

[defaults]
transport = ssh
log_path = ./.ansible/ansible.log
host_key_checking = False
hostfile = inventory
sudo_user = root
roles_path = roles
ansible_managed = Ansible managed file modified on %Y-%m-%d %H:%M:%S, do not edit directly
retry_files_save_path = ./.ansible
private_key_file = ~/.ssh/id_rsa
#remote_user = root

[ssh_connection]
ssh_args = -o ForwardAgent=yes

以上這些在gitlab上部署完成以後,能夠寫Dockerfile了。
我是在.ssh中寫的。

###filename:  Dockerfile
FROM williamyeh/ansible:alpine3
MAINTAINER bill

ARG SSH_PRIVATE_KEY=.

RUN echo "@main35 http://dl-cdn.alpinelinux.org/alpine/v3.5/main" >> /etc/apk/repositories \
    && apk update \
    && apk --no-cache add \
    git \
    bash

ADD id_rsa /root/.ssh/id_rsa

RUN chmod 700 /root/.ssh/id_rsa

RUN mkdir -p ~/.ssh

RUN echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config

RUN echo "gitlab-ce的ip地址(docker inspect container-id|grep IPA)  gitlab.yourdomain">>/etc/hosts &&git clone  git@gitlab.yourdomain:root/young_ansibleinventory.git /ansible

COPY entrypoint.sh /

ENTRYPOINT ["/bin/bash", "/entrypoint.sh"]
###filename:entrypoint.sh

#!/bin/bash


echo "172.17.0.4  gitlab.yourdomain">>/etc/hosts

if [ ! -d "/ansible" ];then
     git clone  git@gitlab.yourdomain:root/young_ansibleinventory.git /ansible
fi

cd /ansible

git pull

# run cmds
exec "$@"

 

爲了防止出錯,仍是要進行以下的配置。

After this you need on your server in folder root/.ssh/autorizade_key
put you id_rsa.pub key
copy your id_rsa.pub and paste in autorized_key

 

在本地服務器,不是容器,,,這個是爲了避免出錯。
cat id_rsa.pub >>authorized_keys
chmod 644 authorized_keys


最後一點須要在.gitlab.yml裏面修改image爲你部署的ansible的鏡像名。

8、最後報錯的問題的解決方法

第一個問題:
當遇到上傳的文件過大時,這個到了build的後期會遇到

vim  /srv/gitlab/config/gitlab.rb 
nginx['enable'] = true
nginx['client_max_body_size'] = '1024m'

gitlab-ctl restart

在容器中修改nginx的配置,若是安裝vim比較慢,能夠選擇安裝lrzsz,,在本地改好後,再上傳文件。
在http標籤中添加,這個的做用就是全局的。
client_max_body_size 1024m;

第二個問題,,建立一個網橋
docker network create serverservices_default

						
root@work:~/.ssh# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d79d0a24f1d6        bridge              bridge              local               
b8d69d99856f        host                host                local               
cd9f5c333402        none                null                local               
4f34f5ff823f        root_default        bridge              local               


root@work:~/.ssh# brctl show
bridge name	bridge id		STP enabled	interfaces
br-4f34f5ff823f		8000.0242f5270238	no		veth08ac4e8
							veth69afb8b
							veth8d60b75
							veth93ac6fc
docker0		8000.0242de39b14c	no		

  

9、將項目放到gitlab上,並配置.gitlab.yml,就是其中的鏡像。實際操做中會遇到不少問題。

相關文章
相關標籤/搜索