Docker создает с помощью Drone и Gitlab, ошибки Gitlab Включенный URI перенаправления недействителен.

Я изучаю технологии CI, поэтому решил установить Drone с Gitlab локально, используя Docker compose. Вот docker-compose.yml:

version: "2"    

services:
  example_gitlab:
    image: gitlab/gitlab-ce:latest
    volumes:
      - ./new-gitlab/srv/gitlab/config:/etc/gitlab
      - ./new-gitlab/srv/gitlab/logs:/var/log/gitlab
      - ./new-gitlab/srv/gitlab/data:/var/opt/gitlab
    ports:
      - "4443:443"
      - "8000:80"
      - "2222:22"
  example_drone:
    build: ./drone
    volumes:
      - /var/lib/drone/
      - /var/run/docker.sock:/var/run/docker.sock
      - ./drone/sqlite/drone.sqlite:/var/lib/drone/drone.sqlite
    environment:
      - DRONE_GITLAB=true
      - DRONE_GITLAB_URL=http://0.0.0.0:8000
      - DRONE_GITLAB_CLIENT=4b5292ffbe30e93713b57853c43194aa63d50c176516c8ffaa8b213f1bb1555b
      - DRONE_GITLAB_SECRET=6088c59102511a418154197d415762a8768e0e2d6c9ad4bb9013f48d1df3b226
    ports:
      - "8080:8080"

Приложения запускаются нормально, и я настроил приложение в gitlab со следующими настройками:

Name: Drone
Redirect URI: http://0.0.0.0:8080/authorize

Затем я взял идентификатор и секрет и добавил их в среду дронов. Все это работает нормально. Однако, когда я пытаюсь войти в gitlab с дрона, я получаю:

произошла ошибка

Указанный URI перенаправления недействителен.

Не знаю, почему?


person Mark Robson    schedule 18.01.2017    source источник
comment
Первое, что бросается в глаза, это то, что дрон по умолчанию работает на порту 8000. Поэтому, если вы не используете специальную сборку Drone, я ожидаю, что дрон будет работать на 8000, а не на 8080.   -  person Brad Rydzewski    schedule 19.01.2017
comment
Второе, что бросается в глаза, это URI перенаправления http://0.0.0.0/authorize, но у вас есть дрон, открытый на порту 8080. Таким образом, URI перенаправления должен быть http://0.0.0.0:8080/authorize, я полагаю, поскольку GitLab перенаправляет пользователя обратно на Drone.   -  person Brad Rydzewski    schedule 19.01.2017
comment
Третье, что вы, возможно, захотите рассмотреть, это то, что дрону и gitlab нужно будет иметь возможность общаться друг с другом через остальные API. Это невозможно при использовании 0.0.0.0, потому что 0.0.0.0 всегда относится к отдельному контейнеру. Поэтому, если дрон попытается получить доступ к gitlab, используя 0.0.0.0:8000, он укажет на контейнер дрона, а не на контейнер gitlab. По этой причине также рекомендуется использовать DNS или реальные IP-адреса. Также рекомендуется рассматривать их как отдельные приложения (и не объединять в один docker-compose).   -  person Brad Rydzewski    schedule 19.01.2017


Ответы (3)


У меня была такая же проблема, и я решил ее с помощью этой конфигурации:

    version: '2'
    services:

      #PROXY
      nginx:
        image: jwilder/nginx-proxy:latest
        restart: always
        ports:
          - "80:80"
        volumes:
          - /var/run/docker.sock:/tmp/docker.sock:ro
        depends_on:
          - drone-server
          - gitlab
        networks:
          - drone
          - gitlab

      # GITLAB
      gitlab:
         image: gitlab/gitlab-ce:latest
         environment:
          VIRTUAL_HOST: "gitlab.dev"
          VIRTUAL_PORT: "8080"
          GITLAB_HTTPS: "false"
          SSL_SELF_SIGNED: "false"

         volumes:
           - ./gitlab/srv/gitlab/config:/etc/gitlab
           - ./gitlab/srv/gitlab/logs:/var/log/gitlab
           - ./gitlab/srv/gitlab/data:/var/opt/gitlab
         ports:
           - "4443:443"
           - "8080:80"
           - "2222:22"
         networks:
           - gitlab

      # DRONE
      drone-server:
        image: drone/drone:0.5
        ports:
          - "8000:8000"
        networks:
          - drone
          - gitlab
        links:
         - gitlab
        volumes:
          - ./drone-data:/var/lib/drone/
        environment:
          VIRTUAL_HOST: "drone.dev"
          VIRTUAL_PORT: "8000"
          # DRONE ENV
          DRONE_SERVER_ADDR: ":8000"
          DRONE_DEBUG: "true"
          # CHANGEME: Randomly generate something at least 24 characters long with
          # a password generator.
          DRONE_SECRET: "replace-this-with-your-own-random-secret"
          DRONE_DATABASE_DRIVER: sqlite3
          DRONE_DATABASE_DATASOURCE: /var/lib/drone/drone.sqlite
          DRONE_OPEN: "true"
          # DRONE_ORGS: ""
          # CHANGEME: Replace with Github username(s) to grant admin privs to.
          # DRONE_ADMIN: admin,users,here
          DRONE_ADMIN_ALL: "true"
          # DRONE GITLAB params
          DRONE_GITLAB: "true"
          DRONE_GITLAB_URL: http://gitlab.dev:8080
          DRONE_GITLAB_CLIENT: a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7
          DRONE_GITLAB_SECRET: 786c7f7b84497b00215c3ff2cea6a4d693b378071a162f751e8e5910be46fb08
          DRONE_GITLAB_SKIP_VERIFY: true
          # disable SSL
          DRONE_GITLAB_SKIP_VERIFY: "true"
      drone-agent:
        image: drone/drone:0.5
        command: agent
        depends_on:
          - drone-server
        networks:
          - drone
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock
        environment:
          DRONE_SERVER: ws://drone-server:8000/ws/broker
          DRONE_DEBUG: "true"
          # CHANGEME: Change this to match the DRONE_SECRET value specified in your
          # drone-server container above.
          DRONE_SECRET: "replace-this-with-your-own-random-secret"

    networks:
      drone:
        driver: bridge
      gitlab:
        driver: bridge

Теперь проблема в том, что клиент не регистрируется. Я не вижу никаких ошибок в журналах:

    gitlab_1     |
    gitlab_1     | ==> /var/log/gitlab/gitlab-rails/production.log <==
    gitlab_1     | Started POST "/oauth/authorize" for 172.27.0.1 at 2017-01-22 02:48:40 +0000
    gitlab_1     | Processing by Oauth::AuthorizationsController#create as HTML
    gitlab_1     |   Parameters: {"utf8"=>"✓", "authenticity_token"=>"hWP+9zf36+E8pSPZPJX/MJQ2oddjVniNZFWdrmguP3x28nCmliNRsZzmUNwAtktsltDCNwMJVlrn4YV3DxepzA==", "client_id"=>"a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7", "redirect_uri"=>"http://drone.dev/authorize", "state"=>"drone", "response_type"=>"code", "scope"=>"api"}
    gitlab_1     | Redirected to http://drone.dev/authorize?code=f38ce22be01132f1bc9486c5305262400ce36241c9a1de38867030bd0be6bc51&state=drone
    gitlab_1     | Completed 302 Found in 39ms (ActiveRecord: 15.9ms)
    gitlab_1     | Started GET "/oauth/authorize?client_id=a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7&redirect_uri=http%3A%2F%2Fdrone.dev%2Fauthorize&response_type=code&scope=api&state=drone" for 172.27.0.1 at 2017-01-22 02:48:40 +0000
    gitlab_1     | Processing by Oauth::AuthorizationsController#new as HTML
    gitlab_1     |   Parameters: {"client_id"=>"a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7", "redirect_uri"=>"http://drone.dev/authorize", "response_type"=>"code", "scope"=>"api", "state"=>"drone"}
    gitlab_1     | Completed 200 OK in 40ms (Views: 21.2ms | ActiveRecord: 15.1ms)
    gitlab_1     |
    gitlab_1     | ==> /var/log/gitlab/gitlab-workhorse/current <==
    gitlab_1     | 2017-01-22_02:48:40.91198 gitlab.dev:8080 @ - - [2017-01-22 02:48:40.853291066 +0000 UTC] "POST /oauth/authorize HTTP/1.1" 302 178 "http://gitlab.dev:8080/oauth/authorize?client_id=a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7&redirect_uri=http%3A%2F%2Fdrone.dev%2Fauthorize&response_type=code&scope=api&state=drone" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36" 0.058615
    gitlab_1     | 2017-01-22_02:48:41.01414 gitlab.dev:8080 @ - - [2017-01-22 02:48:40.968217945 +0000 UTC] "GET /oauth/authorize?client_id=a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7&redirect_uri=http%3A%2F%2Fdrone.dev%2Fauthorize&response_type=code&scope=api&state=drone HTTP/1.1" 200 13012 "http://gitlab.dev:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36" 0.045840
    gitlab_1     |
    gitlab_1     | ==> /var/log/gitlab/nginx/gitlab_access.log <==
    gitlab_1     | 172.27.0.1 - - [22/Jan/2017:02:48:40 +0000] "POST /oauth/authorize HTTP/1.1" 302 178 "http://gitlab.dev:8080/oauth/authorize?client_id=a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7&redirect_uri=http%3A%2F%2Fdrone.dev%2Fauthorize&response_type=code&scope=api&state=drone" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"
    gitlab_1     | 172.27.0.1 - - [22/Jan/2017:02:48:41 +0000] "GET /oauth/authorize?client_id=a7ee6c568eb1824b9c43bb514fe2eded8142284bf484d587a66ed1713d82cfb7&redirect_uri=http%3A%2F%2Fdrone.dev%2Fauthorize&response_type=code&scope=api&state=drone HTTP/1.1" 200 4526 "http://gitlab.dev:8080/" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"

Кто-нибудь сталкивался с этой проблемой???

person Daniele Sangalli    schedule 22.01.2017
comment
Кажется, я нашел проблему, но пока не знаю, как ее решить: level=error msg="cannot authenticate user. Error exchanging token. Post http://gitlab.dev:8080/oauth/token: dial tcp 127.0.53.53:8080: getsockopt: connection refused" - person Daniele Sangalli; 22.01.2017
comment
эта ошибка указывает на то, что контейнер дрон-сервера не может разрешить gitlab.dev. gitlab.dev как вы получаете доступ к gitlab из своего браузера? URL-адрес gitlab, который вы предоставляете дрону, должен быть тем же URL-адресом, который вы бы использовали в браузере. Это должен быть общедоступный URL. - person Brad Rydzewski; 24.01.2017
comment
Помимо этого конкретного сообщения об ошибке, не рекомендуется компоновать Drone + gitlab в одном файле. Даже если вы заработаете, у вас будут проблемы с запуском сборок. Это связано с тем, что Drone будет создавать контейнеры сборки, и внутри этих контейнеров Drone попытается выполнить git clone из gitlab.dev, что не удастся, потому что это имя хоста Docker только для внутреннего использования. Вот почему дрон следует настраивать с реальными DNS или IP-адресами (независимо от того, что конечные пользователи вводят в адресную строку браузера) вместо внутренних имен хостов докера. - person Brad Rydzewski; 24.01.2017

Я считаю, что проблема в том, что ваш URL-адрес перенаправления не включает порт:

Name: Drone
Redirect URI: http://0.0.0.0/authorize

URL-адрес перенаправления — это URL-адрес, на который Gitlab перенаправляет пользователя после аутентификации. Это должен быть адрес сервера Drone, который должен включать порт:

Name: Drone
Redirect URI: http://0.0.0.0:8080/authorize
person Brad Rydzewski    schedule 19.01.2017
comment
Извиняюсь, это была опечатка. Я отредактировал, чтобы включить порт. Хотя проблема та же :-( - person Mark Robson; 19.01.2017
comment
Я думаю, это потому, что когда вы не используете общедоступный IP-адрес или доменное имя, Drone использует localhost в качестве резервного URL-адреса. Поэтому, возможно, попробуйте использовать http://localhost:8080/authorize в качестве URL-адреса перенаправления. Это должно продвинуть вас дальше в этом процессе, но у вас, вероятно, возникнут проблемы с коммуникацией с gitlab через локальный хост, как упоминалось в других комментариях. - person Brad Rydzewski; 19.01.2017

Откройте домашнюю страницу дрона, щелкните правой кнопкой мыши кнопку login with gitlab, выберите copy link address, URL-адрес, который вы скопировали с кнопки, — это redirect url, который вам нужно установить на сайте gitlab.

person Erguotou    schedule 15.02.2017