2017-06-17 9 views
1

私は最近、開発のために多くのことを自動化するためにgitlab-ciを発見しました。 私はユニットテストを実行するための "テスト"ステージを設定することができました。 完璧、すべてうまくいきます。 今私はブロックされています:私はMRを検証するときに私の専用サーバーに自動的に展開できるようにしたいと思います。 gitlabのドキュメントでは、例はAWS、またはmakefileの上ですが、例はありません!gitlab-ciでsymfonyアプリケーションをプライベートサーバに自動展開するには?

専用の専用サーバーで行う方法のアイデアはありますか?

これはPHPプロジェクトのSymfony 3です。いずれにしても、私はデプロイメントが非常に一般的です:マスターブランチをプルし、コンポーザーのインストールを実行し、さまざまなフォルダの権限を復元します。 私のアプリケーションは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に組み込まれているドッカーレジストリのURLです。

0

ありがとうございました!

あなたのサンプルは本当に素晴らしいです!ドッカーファイルをホストするドッカーハブを使用していません。/ しかし、私のユースケースの解決策が見つかりました! まず、gitlabリポジトリ内の変数に自分のプライベートSSH鍵を追加します(私はここでこれを見つけました: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

関連する問題