2017-06-17 33 views
1

我最近發現gitlab-ci是爲了讓我的開發自動化很多事情。 所以我設法建立了一個「測試」階段,它允許我運行我的單元測試。 完美,一切運作良好。 現在我被封鎖了:當我驗證MR時,我希望能夠在我的專用服務器上自動部署。 在gitlab文檔中,該示例位於AWS或makefile之上,但沒有示例!如何在私人服務器上使用gitlab-ci自動部署symfony應用程序?

想法如何在私人專用服務器上做到這一點?

有關信息,請參閱Symfony 3的PHP項目。無論如何,我都希望部署相當普遍:拉出主分支,執行作曲家安裝並恢復各種文件夾的權限。 我的應用程序在Docker下,所以我不僅要能夠訪​​問我的遠程服務器,還要訪問我的容器來管理我的應用程序。

回答

1

我部署的步驟是這樣的 - 也許它給你一些想法:

build:app: 
    image: docker:latest 
    services: 
    - docker:dind 
    stage: build 
    variables: 
    SYMFONY_ENV: "prod" 
    before_script: 
    - docker login -u "gitlab-ci-token" -p "$CI_JOB_TOKEN" $CI_REGISTRY 
    - export IMAGE_TAG=$(echo -en $CI_COMMIT_REF_NAME | tr -c '[:alnum:]_.-' '-') 
    script: 
    - docker run --rm --name composerinstall -v "$PWD":/var/www/app -w /var/www/app composer:1.4 install --no-dev --ignore-platform-reqs --no-suggest --no-progress --no-scripts --prefer-dist 
    - cp app/config/parameters.yml.dist app/config/parameters.yml 
    - docker build --pull -t "$CI_REGISTRY_IMAGE:$IMAGE_TAG" . 
    - docker push "$CI_REGISTRY_IMAGE:$IMAGE_TAG" 
    only: [develop] 
    dependencies: 
    - test:php7.0 
    - test:php7.1 
    tags: 
    - autoscale 


deploy:staging: 
    variables: 
    DOCKER_TLS_VERIFY: "1" 
    DOCKER_HOST: "tcp://123.123.123.123:2376" 
    DOCKER_CERT_PATH: "/home/gitlab-runner/.docker/machine/machines/dockerhost1" 
    DOCKER_MACHINE_NAME: "dockerhost1" 
    SYMFONY_ENV: prod 
    MYSQL_PROD_PASSWORD: "$MYSQL_PROD_PASSWORD" 
    SECRET_TOKEN: "$SECRET_TOKEN" 
    COMPOSE_PROJECT_NAME: "myproject_staging" 
    COMPOSER_CACHE_DIR: "$(pwd -P)/.composer-cache" 
    ASSET_VERSION: ${CI_COMMIT_SHA:0:8} 
    before_script: 
    - export BRANCH=$(echo -en $CI_COMMIT_REF_NAME | tr -c '[:alnum:]_.-' '-') 
    - docker-compose -f docker-compose.prod.yml pull --parallel 
    script: 
    - docker-compose -f docker-compose.prod.yml up -d --force-recreate app 
    - docker-compose -f docker-compose.prod.yml restart php 
    - docker-compose -f docker-compose.prod.yml exec -T --user www-data php composer install --no-dev --no-suggest --no-progress --prefer-dist --optimize-autoloader 
    - docker-compose -f docker-compose.prod.yml exec -T --user www-data php bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration 
    stage: deploy 
    environment: 
    name: staging 
    url: http://staging.myproject.com 
    only: [develop] 
    dependencies: 
    - build:app 
    tags: 
    - deploy 

的Dockerfile爲構建步驟,現在只有:

FROM busybox:latest 

COPY . /app 
RUN mkdir -p /app/vendor && \ 
    mkdir -p /app/mediastore && \ 
    mkdir -p /app/web/imagecache && \ 
    mkdir -p /.composer && \ 
    chown 33:33 -R /.composer && \ 
    chown 33:33 -R /app/var && \ 
    chown 33:33 -R /app/mediastore && \ 
    chown 33:33 -R /app/vendor && \ 
    chown 33:33 -R /app/web/imagecache && \ 
    chown 33:33 /app/app/config/parameters.yml 

受益ENV變量我有這在我的parameters.yml:

parameters: 
    database_host:  '%env(DATABASE_HOST)%' 
    database_port:  '%env(DATABASE_PORT)%' 
    database_name:  '%env(DATABASE_NAME)%' 
    database_user:  '%env(DATABASE_USERNAME)%' 
    database_password: '%env(DATABASE_PASSWORD)%'  
    secret:   '%env(SECRET_TOKEN)%'  
    asset_version:  '%env(ASSET_VERSION)%' 

    # Default fallback if env not set 
    env(DATABASE_HOST):  127.0.0.1 
    env(DATABASE_PORT):  ~ 
    env(DATABASE_NAME):  symfony 
    env(DATABASE_USERNAME): root 
    env(DATABASE_PASSWORD): ~  
    env(ASSET_VERSION): ~ 
    env(SECRET_TOKEN): ~ 

而且多克爾 - 撰寫:

version: '2' 

volumes: 
    database-volume: 

services: 
    app: 
     image: "dockerhub.mydomain.com/mygroup/myproject:${BRANCH}" 
     environment: 
      BRANCH: develop 
     tty: true 
     restart: always 

    mysql: 
     image: mysql:5.7 
     volumes: 
      - database-volume:/var/lib/mysql 
     environment: 
      MYSQL_PASSWORD: "${MYSQL_PROD_PASSWORD}" 
      MYSQL_USER: myuser 
      MYSQL_DATABASE: mydatabase 
      MYSQL_ALLOW_EMPTY_PASSWORD: 1 
     restart: always 

    php: 
     image: dockerhub.mydomain.com/docker/php/fpm:7.0 
     working_dir: /var/www/app 
     environment: 
      DATABASE_HOST: "mysql" 
      DATABASE_PORT: "3306" 
      DATABASE_NAME: "mydatabase" 
      DATABASE_USERNAME: "myuser" 
      DATABASE_PASSWORD: "${MYSQL_PROD_PASSWORD}" 
      SECRET_TOKEN: "${SECRET_TOKEN}" 
      SYMFONY_ENV: prod 
     volumes_from: 
      - app 
     restart: always 

    apache: 
     image: dockerhub.mydomain.com/mygroup/myproject:apache 
     volumes_from: 
      - app 
     environment: 
      VIRTUAL_HOST: "staging.myproject.com,staging.myproject.eu" 
     restart: always 

networks: 
    default: 
    external: 
     name: nginx-proxy 

dockerhub.mydomain.com是內置於gitlab中的docker註冊表的給定url。

0

謝謝!

你的樣品非常好!我不使用碼頭集線器託管我的dockerfile:/ 但我找到了我的用例的解決方案! 首先,我將我的私有SSH密鑰添加到我的gitlab存儲庫中的一個變量中(我在此找到這個:https://docs.gitlab.com/ee/ci/ssh_keys/README.html)。之後,我可以連接到我的主機並執行遠程命令! 所以我gitlab-ci.yml樣子:

deploy:app: 
    stage: deploy 
    environment: 
    name: staging 
    url: http://example.com 
    only: 
    - master 
    script: 
    - 'which ssh-agent || (apt-get update -y && apt-get install openssh-client -y)' 
    - eval $(ssh-agent -s) 
    - ssh-add <(echo "$SSH_PRIVATE_KEY") 
    - mkdir -p ~/.ssh 
    - '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' 
    - ssh -t [email protected] 'cd ~/docker && 
     git pull origin master && 
     docker exec docker_engine_1 bash -c " 
      ./bin/console doctrine:schema:update -f && 
      composer install && 
      chmod -R 777 var/cache/prod/ 
     " 
     ' 

但你的例子給我一些想法:比如使用原則遷移...

+0

的注意 - 我不使用dockerhub。我使用docker註冊表中內置的gitlab。見http://docs.gitlab.com/ce/administration/container_registry.html和http://docs.gitlab.com/ce/user/project/container_registry.html – Rufinus

+0

嗡嗡聲我看,謝謝你的鏈接! 但是我不明白你什麼時候在你的服務器上部署你的應用程序......你能解釋一下嗎? –

+0

應用程序部署通過docker-compose完成。你在部署階段看到env變量?我只是在目標主機上重新創建應用容器。 ('DOCKER_HOST') – Rufinus

相關問題