diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml new file mode 100644 index 0000000..b71df6c --- /dev/null +++ b/.gitlab-ci.yml @@ -0,0 +1,73 @@ +stages: + - test + - build + - release + +variables: + CONTAINER_IMAGE: registry.ely.by/elyby/accounts + +test:backend: + image: jonaskello/docker-and-compose:1.12.1-1.8.0 + services: + - docker:1.12.1-dind + stage: test + before_script: + - docker login -u gitlab-ci -p $CI_BUILD_TOKEN registry.ely.by + - echo "$SSH_PRIVATE_KEY" > id_rsa + after_script: + - docker-compose -f tests/docker-compose.yml down -v + script: + - docker-compose -f tests/docker-compose.yml run --rm testphp ./vendor/bin/codecept run -c tests + tags: + - docker + +test:frontend: + image: node:5.12 + stage: test + cache: + paths: + - frontend/node_modules + script: + - cd frontend + - npm i --silent + - npm run test + +build:production: + image: docker:latest + stage: build + before_script: + - docker login -u gitlab-ci -p $CI_BUILD_TOKEN registry.ely.by + - echo "$SSH_PRIVATE_KEY" > id_rsa + script: + - export IMAGE_NAME="$CONTAINER_IMAGE:latest" + - docker build --pull -t $IMAGE_NAME . + only: + - develop + - tags + +release:latest: + image: docker:latest + stage: release + variables: + GIT_STRATEGY: none + before_script: + - docker login -u gitlab-ci -p $CI_BUILD_TOKEN registry.ely.by + script: + - docker push $CONTAINER_IMAGE:latest + only: + - develop + - tags + +release:tag: + image: docker:latest + stage: release + variables: + GIT_STRATEGY: none + before_script: + - docker login -u gitlab-ci -p $CI_BUILD_TOKEN registry.ely.by + script: + - export IMAGE_NAME="$CONTAINER_IMAGE:$CI_BUILD_TAG" + - docker tag $CONTAINER_IMAGE:latest $IMAGE_NAME + - docker push $IMAGE_NAME + only: + - tags diff --git a/Dockerfile b/Dockerfile index 69be73d..6b91352 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,112 +1,15 @@ -FROM php:7.0-fpm +FROM registry.ely.by/elyby/accounts-php:latest -ENV PATH $PATH:/root/.composer/vendor/bin - -# Сначала настраиваем всё, что нам нужно на системном уровне -RUN apt-get update \ - && apt-get -y install \ - git \ - g++ \ - libicu-dev \ - libmcrypt-dev \ - zlib1g-dev \ - bzip2 \ - libbz2-dev \ - liblzma-dev \ - xz-utils \ - openssh-server \ - supervisor \ - --no-install-recommends \ - --force-yes \ - - # PHP расширения - && docker-php-ext-install intl \ - && docker-php-ext-install pdo_mysql \ - && docker-php-ext-install mbstring \ - && docker-php-ext-install mcrypt \ - && docker-php-ext-install zip \ - && docker-php-ext-install bcmath \ - && docker-php-ext-install opcache \ - - && apt-get purge -y g++ \ - && apt-get autoremove -y \ - && rm -r /var/lib/apt/lists/* \ - - # Отключаем сброс глобальных env переменных внутри PHP - && echo "\nclear_env = no" >> /usr/local/etc/php-fpm.conf \ - - # Фикс прав на запись для расшаренных папок - && usermod -u 1000 www-data - -# Копипаста из https://github.com/nodejs/docker-node/blob/50b56d39a236fd519eda2231757aa2173e270807/5.12/Dockerfile - -# gpg keys listed at https://github.com/nodejs/node -RUN set -ex \ - && for key in \ - 9554F04D7259F04124DE6B476D5A82AC7E37093B \ - 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ - 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ - FD3A5288F042B6850C66B31F09FE44734EB7990E \ - 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ - DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ - B9AE9905FFD7803F25714661B63B535A4C206CA9 \ - C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ - ; do \ - gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ - done - -ENV NPM_CONFIG_LOGLEVEL info -ENV NODE_VERSION 5.12.0 - -RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ - && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ - && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ - && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ - && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ - && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ - && ln -s /usr/local/bin/node /usr/local/bin/nodejs - -ENV COMPOSER_NO_INTERACTION 1 -ENV COMPOSER_ALLOW_SUPERUSER 1 -ENV COMPOSER_DISCARD_CHANGES true - -# Composer и его глобальные зависимости -RUN curl -sS https://getcomposer.org/installer | php \ - && mv composer.phar /usr/local/bin/composer.phar \ - && echo '{"github-oauth": {"github.com": "***REMOVED***"}}' > ~/.composer/auth.json \ - && composer.phar global require --no-progress "hirak/prestissimo:>=0.3.4" - -COPY ./docker/php/composer.sh /usr/local/bin/composer - -# Конфиг для php -COPY ./docker/php/php.ini /usr/local/etc/php/ - -# Конфиг для supervisor -COPY ./docker/php/supervisord.conf /etc/supervisord.conf - -# wait-for-it -COPY ./docker/wait-for-it.sh /usr/local/bin/wait-for-it - -# Наша кавайная точка входа -COPY ./docker/php/entrypoint.sh /usr/local/bin/ - -RUN chmod a+x /usr/local/bin/composer \ - && chmod a+x /usr/local/bin/entrypoint.sh \ - && chmod a+x /usr/local/bin/wait-for-it \ - && ln -s /usr/local/bin/entrypoint.sh / \ - && mkdir /root/.ssh - -COPY id_rsa /root/.ssh +COPY id_rsa /root/.ssh/id_rsa # Включаем поддержку ssh -RUN eval $(ssh-agent -s) \ +RUN chmod 400 ~/.ssh/id_rsa \ + && eval $(ssh-agent -s) \ && ssh-add /root/.ssh/id_rsa \ && touch /root/.ssh/known_hosts \ && ssh-keyscan gitlab.com >> /root/.ssh/known_hosts -WORKDIR /var/www/html - -# Копируем composer.json в родительскую директорию, которая не будет синкатся с хостом через +# Копируем composer.json в родительскую директорию, которая не будет синкаться с хостом через # volume на dev окружении. В entrypoint эта папка будет скопирована обратно. COPY ./composer.json /var/www/composer.json @@ -128,6 +31,11 @@ RUN cd ../frontend \ && npm install \ && cd - +# Удаляем ключи из production контейнера на всякий случай +RUN ssh-add -D \ + && ssh-agent -k > /dev/null 2>&1 + && rm -rf /root/.ssh + # Наконец переносим все сорцы внутрь контейнера COPY . /var/www/html @@ -141,9 +49,3 @@ RUN mkdir -p api/runtime api/web/assets console/runtime \ # Копируем билд наружу, чтобы его не затёрло volume в dev режиме && cp -r ./dist /var/www/dist \ && cd - - -# Экспозим всё под /var/www/html для дальнейшей связки с nginx -VOLUME ["/var/www/html"] - -ENTRYPOINT ["entrypoint.sh"] -CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"] diff --git a/Dockerfile-dev b/Dockerfile-dev index 0258174..8287f41 100644 --- a/Dockerfile-dev +++ b/Dockerfile-dev @@ -1,125 +1,15 @@ -FROM php:7.0-fpm +FROM registry.ely.by/elyby/accounts-php:latest-dev -ENV PATH $PATH:/root/.composer/vendor/bin - -# Сначала настраиваем всё, что нам нужно на системном уровне -RUN apt-get update \ - && apt-get -y install \ - git \ - g++ \ - libicu-dev \ - libmcrypt-dev \ - zlib1g-dev \ - bzip2 \ - libbz2-dev \ - liblzma-dev \ - xz-utils \ - openssh-server \ - supervisor \ - --no-install-recommends \ - --force-yes \ - - # PHP расширения - && docker-php-ext-install intl \ - && docker-php-ext-install pdo_mysql \ - && docker-php-ext-install mbstring \ - && docker-php-ext-install mcrypt \ - && docker-php-ext-install zip \ - && docker-php-ext-install bcmath \ - && docker-php-ext-install opcache \ - - && apt-get purge -y g++ \ - && apt-get autoremove -y \ - && rm -r /var/lib/apt/lists/* \ - - # Отключаем сброс глобальных env переменных внутри PHP - && echo "\nclear_env = no" >> /usr/local/etc/php-fpm.conf \ - - # Фикс прав на запись для расшаренных папок - && usermod -u 1000 www-data - -# Копипаста из https://github.com/nodejs/docker-node/blob/50b56d39a236fd519eda2231757aa2173e270807/5.12/Dockerfile - -# gpg keys listed at https://github.com/nodejs/node -RUN set -ex \ - && for key in \ - 9554F04D7259F04124DE6B476D5A82AC7E37093B \ - 94AE36675C464D64BAFA68DD7434390BDBE9B9C5 \ - 0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 \ - FD3A5288F042B6850C66B31F09FE44734EB7990E \ - 71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 \ - DD8F2338BAE7501E3DD5AC78C273792F7D83545D \ - B9AE9905FFD7803F25714661B63B535A4C206CA9 \ - C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ - ; do \ - gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ - done - -ENV NPM_CONFIG_LOGLEVEL info -ENV NODE_VERSION 5.12.0 - -RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ - && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ - && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ - && grep " node-v$NODE_VERSION-linux-x64.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ - && tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 \ - && rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt \ - && ln -s /usr/local/bin/node /usr/local/bin/nodejs - -# Поставим xdebug отдельно, т.к. потом его потенциально придётся отсюда убирать -RUN yes | pecl install xdebug \ - && echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.default_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_enable=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_handler=dbgp" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_mode=req" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_autostart=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_port=9000" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.remote_connect_back=0" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.cli_color=1" >> /usr/local/etc/php/conf.d/xdebug.ini \ - && echo "xdebug.var_display_max_depth=10" >> /usr/local/etc/php/conf.d/xdebug.ini - -ENV COMPOSER_NO_INTERACTION 1 -ENV COMPOSER_ALLOW_SUPERUSER 1 -ENV COMPOSER_DISCARD_CHANGES true - -# Composer и его глобальные зависимости -RUN curl -sS https://getcomposer.org/installer | php \ - && mv composer.phar /usr/local/bin/composer.phar \ - && echo '{"github-oauth": {"github.com": "***REMOVED***"}}' > ~/.composer/auth.json \ - && composer.phar global require --no-progress "hirak/prestissimo:>=0.3.4" - -COPY ./docker/php/composer.sh /usr/local/bin/composer - -# Конфиг для php -COPY ./docker/php/php.ini /usr/local/etc/php/ - -# Конфиг для supervisor -COPY ./docker/php/supervisord.conf /etc/supervisord.conf - -# wait-for-it -COPY ./docker/wait-for-it.sh /usr/local/bin/wait-for-it - -# Наша кавайная точка входа -COPY ./docker/php/entrypoint.sh /usr/local/bin/ - -RUN chmod a+x /usr/local/bin/composer \ - && chmod a+x /usr/local/bin/entrypoint.sh \ - && chmod a+x /usr/local/bin/wait-for-it \ - && ln -s /usr/local/bin/entrypoint.sh / \ - && mkdir /root/.ssh - -COPY id_rsa /root/.ssh +COPY id_rsa /root/.ssh/id_rsa # Включаем поддержку ssh -RUN eval $(ssh-agent -s) \ +RUN chmod 400 ~/.ssh/id_rsa \ + && eval $(ssh-agent -s) \ && ssh-add /root/.ssh/id_rsa \ && touch /root/.ssh/known_hosts \ && ssh-keyscan gitlab.com >> /root/.ssh/known_hosts -WORKDIR /var/www/html - -# Копируем composer.json в родительскую директорию, которая не будет синкатся с хостом через +# Копируем composer.json в родительскую директорию, которая не будет синкаться с хостом через # volume на dev окружении. В entrypoint эта папка будет скопирована обратно. COPY ./composer.json /var/www/composer.json @@ -154,9 +44,3 @@ RUN mkdir -p api/runtime api/web/assets console/runtime \ # Копируем билд наружу, чтобы его не затёрло volume в dev режиме && cp -r ./dist /var/www/dist \ && cd - - -# Экспозим всё под /var/www/html для дальнейшей связки с nginx -VOLUME ["/var/www/html"] - -ENTRYPOINT ["entrypoint.sh"] -CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"] diff --git a/README.md b/README.md index fb019f3..f96d4ad 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,12 @@ [docker](https://docs.docker.com/engine/installation/) и его [docker-compose](https://docs.docker.com/compose/install/). -Кроме того, нужно установить, настроить и запустить [nginx-proxy](https://gitlab.com/elyby/nginx-proxy) +За тем нужно установить, настроить и запустить [nginx-proxy](https://gitlab.com/elyby/nginx-proxy) контейнер. Это делается один раз в рамках системы и в дальнейшем используется и для других проектов. +Также необходимо иметь доступ к `registry.ely.by`. Для этого выполнить команду `docker login registry.ely.by`, +ввести свой логин и пароль. Если доступа нету, то нужно его попросить у кого-нибудь, кто может его выдать. + За тем сливаем репозиторий: ```sh diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 01589ad..1d59c03 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -1,7 +1,7 @@ version: '2' services: app: - build: . + image: registry.ely.by/elyby/accounts:latest depends_on: - db - redis diff --git a/tests/docker-compose.yml b/tests/docker-compose.yml index e7ea80c..68be0c3 100644 --- a/tests/docker-compose.yml +++ b/tests/docker-compose.yml @@ -10,7 +10,10 @@ services: - testredis - testrabbit volumes: - - ./../:/var/www/html/ + - ./codeception/_output:/var/www/html/tests/codeception/_output + - ./codeception/api/_output:/var/www/html/tests/codeception/api/_output + - ./codeception/common/_output:/var/www/html/tests/codeception/common/_output + - ./codeception/console/_output:/var/www/html/tests/codeception/console/_output environment: - YII_DEBUG=true - YII_ENV=test