2016-08-23 4 views
1

Ich benutze Gitlab, um jedes Mal Unit-Tests auszuführen, wenn jemand den Code drückt. Ich erhalte diesen Fehler während der Installation des Composers.Gitlab CI Symfony: SQLSTATE [HY000] [2002] Verbindung abgelehnt

> Incenteev\ParameterHandler\ScriptHandler::buildParameters 
Creating the "app/config/parameters.yml" file 
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::buildBootstrap 
> Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache 


    [Doctrine\DBAL\Exception\ConnectionException]        
    An exception occured in driver: SQLSTATE[HY000] [2002] Connection refused 



    [Doctrine\DBAL\Driver\PDOException]   
    SQLSTATE[HY000] [2002] Connection refused 



    [PDOException]        
    SQLSTATE[HY000] [2002] Connection refused 


Script Sensio\Bundle\DistributionBundle\Composer\ScriptHandler::clearCache handling the post-install-cmd event terminated with an exception 

Hier ist meine Konfiguration:

.gitlab-ci.yml Datei

# Select image from https://hub.docker.com/_/php/ 
    image: php:5.6 

    # Select what we should cache 
    cache: 
     paths: 
     - vendor/ 

    before_script: 
    # Install ssh-agent if not already installed, it is required by Docker. 
    # (change apt-get to yum if you use a CentOS-based image) 
    - 'which ssh-agent || (apt-get update -y && apt-get install openssh-client -y)' 

    # 

Run ssh-agent (inside the build environment) 
- eval $(ssh-agent -s) 

# Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store 
- ssh-add <(echo "$SSH_PRIVATE_KEY") 

# For Docker builds disable host key checking. Be aware that by adding that 
# you are suspectible to man-in-the-middle attacks. 
# WARNING: Use this only with the Docker executor, if you use it with shell 
# you will overwrite your user's SSH config. 
- mkdir -p ~/.ssh 
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config' 

- cp ci/custom.ini /usr/local/etc/php/conf.d/custom.ini 
- bash ci/docker_install.sh > /dev/null 

# Install composer 
- curl -sS https://getcomposer.org/installer | php 

services: 
- mysql:latest 

variables: 
    # Configure mysql service (https://hub.docker.com/_/mysql/) 
    MYSQL_DATABASE: symfony 
    MYSQL_ROOT_PASSWORD: root 

# We test PHP5.6 (the default) with MySQL 
test:mysql: 
    script: 
    # Install all project dependencies 
    - php composer.phar install 
    - phpunit --coverage-text --colors=never -c app/ 

parameters.yml.dist

parameters: 
    database_host:  127.0.0.1 
    database_port:  ~ 
    database_name:  symfony 
    database_user:  root 
    database_password: root 

    mailer_transport: smtp 
    mailer_host:  127.0.0.1 
    mailer_user:  ~ 
    mailer_password: ~ 

    # A secret key that's used to generate certain security-related tokens 
    secret:   ThisTokenIsNotSoSecretChangeIt 

    database_slave1_host: 127.0.0.1 
    database_slave1_port: ~ 
    database_slave1_name: symfony 
    database_slave1_user: root 
    database_slave1_password: root 

Ich habe folgen den Anweisungen die gitlab Webseite. Vielleicht ist mein Fehler offensichtlich, aber ich kann es nicht sehen.

+0

Ist ein MySQL-Server installiert? – tkausl

+0

MySQL sollte als Dienst installiert werden (Dienste: - mysql: neueste) Ich habe das Passwort (MYSQL_ROOT_PASSWORD: root) konfiguriert und der Standardbenutzer ist root. – barden

+0

Hallo @barden, ich habe das gleiche Problem, aber ich denke, mein Conf ist nicht gut, können Sie Ihre docker_install.sh teilen? TY – Aximem

Antwort

3

Da Sie MySQL verwenden, das in einem anderen Container ausgeführt wird, müssen Sie seinen Hostnamen verwenden, nicht 127.0.0.1. Der korrekte Datenbank-Host sollte "mysql" sein. Dies ist in one of the sections der GitLab-Dokumentation abgedeckt:

Der Service-Container für MySQL wird unter dem Hostnamen mysql zugänglich sein. Um auf Ihren Datenbankdienst zugreifen zu können, müssen Sie also eine Verbindung zum Host namens mysql statt zu einem Socket oder localhost herstellen.

+1

Wie ich vorhergesagt habe, war der Fehler offensichtlich! Vielen Dank ! – barden

0

Eines der möglichen Probleme für diesen Fehler besteht darin, dass Sie versuchen, auf die Datenbank zuzugreifen, während sie noch initialisiert wird. Dies wird im Abschnitt Caveats des MySQL auf dem Docker HUB behandelt.

Wenn beim Start des Containers keine Datenbank initialisiert wird, wird eine Standarddatenbank erstellt. Obwohl dies das erwartete Verhalten ist, bedeutet dies, dass eingehende Verbindungen erst nach Abschluss der Initialisierung akzeptiert werden. Dies kann zu Problemen führen, wenn Automatisierungs-Tools mit ...

Eine ungekünstelt Lösung ist sleep Befehl zu verwenden, bevor Sie einen Vorgang starten, die Datenbank zugreift. Sie können es zum before_script Abschnitt hinzufügen:

before_script: 
    - sleep 60s 

Eine bessere und komplexere Lösung zu untersuchen wäre, wiederholt der MySQL-Server überprüft, ob sie bereits akzeptiert Verbindungen.

Verwandte Themen