事象
GitLabのCI/CDでパスフレーズ付きのSSH秘密鍵を追加する処理で次のエラーが出てしまう。
エラーメッセージ
ssh_askpass: exec(/path/to/passphrase): Exec format error
ちなみに実行したCI/CDパイプライン処理内容は以下です。次のssh-add
コマンドでパスフレーズ付きのSSH秘密鍵を追加しています。パスフレーズは環境変数SSH_PASSPHRASE
に設定していて、/.ssh/tmp
にパスフレーズを出力するシェルスクリプトを作成しています。
.gitlab-ci.yml
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_TLS_VERIFY: 1
DOCKER_CERT_PATH: "/certs/client"
DOCKER_DRIVER: overlay2
STAGE_HOST: example.com
STAGE_USER: ubuntu
STAGE_PATH: /home/ubuntu/public_html/xxxxx.com
docker-build:
image: docker:23.0.2-alpine3.17
services:
- docker:23.0.2-dind-alpine3.17
stage: build
tags:
- docker
before_script:
- docker --version
- until docker info; do sleep 1; done
- apk update && apk add openssh-client rsync openssh-askpass
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- echo -e "echo ${SSH_PASSPHRASE}" > ~/.ssh/tmp && chmod 700 ~/.ssh/tmp
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | DISPLAY=None SSH_ASKPASS=~/.ssh/tmp ssh-add -
- echo "Host *ntStrictHostKeyChecking no" >> ~/.ssh/config script:
- docker-compose run --rm -e NODE_ENV=production -T app npm run build
- rsync -rptgDvz --delete -e "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" ./build/build/* ${STAGE_USER}@${STAGE_HOST}:${STAGE_PATH}
環境
- GitLab 16(on Kubernetes)
- GitLab Runner Executer(Kubernetes)
- 上記の.gitlab-ci.ymlはDinD環境でのビルド&デプロイ処理をしているものです。
原因
~/.ssh/tmp
にパスフレーズを出力するシェルスクリプトを出力するときに、先頭行に#!/bin/sh
を入れていないのが原因でした。
改善策
次のように~/.ssh/tmp
を出力するときの先頭行に#!/bin/sh
を入れます。
.gitlab-ci.yml
variables:
DOCKER_HOST: tcp://docker:2376
DOCKER_TLS_CERTDIR: "/certs"
DOCKER_TLS_VERIFY: 1
DOCKER_CERT_PATH: "/certs/client"
DOCKER_DRIVER: overlay2
STAGE_HOST: example.com
STAGE_USER: ubuntu
STAGE_PATH: /home/ubuntu/public_html/xxxxx.com
docker-build:
image: docker:23.0.2-alpine3.17
services:
- docker:23.0.2-dind-alpine3.17
stage: build
tags:
- docker
before_script:
- docker --version
- until docker info; do sleep 1; done
- apk update && apk add openssh-client rsync openssh-askpass
- eval $(ssh-agent -s)
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
# 先頭行に#!/bin/shを追加
- echo -e "#!/bin/sh\n\necho ${SSH_PASSPHRASE}" > ~/.ssh/tmp && chmod 700 ~/.ssh/tmp - echo "$SSH_PRIVATE_KEY" | tr -d '\r' | DISPLAY=None SSH_ASKPASS=~/.ssh/tmp ssh-add -
- echo "Host *ntStrictHostKeyChecking no" >> ~/.ssh/config
script:
- docker-compose run --rm -e NODE_ENV=production -T app npm run build
- rsync -rptgDvz --delete -e "ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 22" ./build/build/* ${STAGE_USER}@${STAGE_HOST}:${STAGE_PATH}
これで正常にパスフレーズ付きのSSH秘密鍵をコンテナに追加できます。