質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

Q&A

解決済

1回答

320閲覧

CircleCIのyamlでスクリプトを実行したい

hodoru3sei

総合スコア284

Circle CI

Circle CIは、クラウド上に簡単にCI環境を構築できるWebサービスです。GitHubと連携させ、CIしたいリポジトリーを選択しビルド・テストを行います。チャット等を利用して結果を確認することが可能です。

0グッド

0クリップ

投稿2019/05/20 08:42

編集2019/05/31 14:16

やりたいこと

CircleCIでgithubにpushされたことをフックして処理を走らせjsonをparseしてテキストファイルを作成したいと考えています。
ドキュメントを管理しているリポジトリがあるのですが、そこにローカライズのjsonファイルを保持しています。
githubにプッシュしたタイミングでjsonをandroidとiosのローカライズファイルで使用できる形式に書き換えたいと考えています。

試したこと

言語はなのでもよかったのですが、Swiftが使い慣れているので、Swiftでjsonをparseしてファイル出力を行うコードを作成しました。しかし、swiftコマンドがyaml上で使えませんでした。
そのため事前にコンパイルを行い.outファイルを作成しcircleCIをローカル上で実行してみたのですが失敗してしまいます。

Swift

1version: 2 2jobs: 3 build: 4 docker: 5 - image: circleci/golang:1.9.2 6 working_directory: /../docs 7 steps: 8 - checkout 9 - run: echo 'Hello world!' 10 - run: ./fileSave.out

ターミナルのログにHello Workdは出力されるのですが、./fileSave.outの実行に失敗してエラーが表示される状態です。
エラーを読んで、ディレクトリの場所の問題かと思い**.circleci**ディレクトリに移動したりしたのですが、同じエラーが出力されてしまいました。

error

1/bin/bash: ./fileSave.out: No such file or directory 2Error: Exited with code 127 3Step failed 4Error: runner failed (exited with 101) 5Task failed 6Error: task failed

CircleCI自体よくわかっておらず的外れな質問だったらすみません。目的としてはテキストファイルの出力なので.outファイルの実行でなくても問題ないです。なにか方法をご存知でしたら教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2019/05/20 09:58

やりたいことに対して実行しようとしている内容が飛躍していて、かつ fileSave.out に関して何の説明もありません。(何の言語でどの環境でどうやって作ったとか) おそらく、やりたいことを実現するのに .out ファイルは不要です。 やりたいことをもっと具体的に噛み砕いて質問に追記してください。
fiveHundred

2019/05/31 04:22

質問内容を編集で抹消しても無駄です。 編集前の投稿も誰でも自由に見れますし、運営が質問内容を元に戻すということもあります。 見られては困る内容があるのであれば、運営に連絡したほうがよろしいでしょう。
hodoru3sei

2019/05/31 08:31 編集

運営に連絡したのですが、回答済みの投稿なので投稿を削除することはできないという回答をいただきました。 私の方で対処できる方法は編集して消すだけなので質問内容をを消しました。 どうすればよかったのでしょうか?
fiveHundred

2019/05/31 09:28

とりあえず、質問の抹消行為は禁止なので、履歴を参照して元に戻してください。 履歴を確認したところ、「working_directory: /****」となっていましたが、これは元々「/****」でしたか? もしそうでなければ、おそらく対処してくれたということので、それで問題なさそうです。
hodoru3sei

2019/05/31 13:23

問題の有無あなたが決めることですか? googleの検索からはきえていない為修正しました。 履歴からはいずれも観覧可能ですが、私の打てる手段はこれしかないのでダメ元で試してみました。 googleの検索に引っかからないよう運営が対処していただけたら元に戻す予定です。
guest

回答1

0

ベストアンサー

swiftを使う必要があるのかはさておいて、最初の試行で得られたエラーと次の試行で得られたエラーは違うんじゃないかなーという気がします。推測ですが、1回目はアーキテクチャが異なるので実行できずエラーになり、2回目は .circleci ディレクトリに移動したということなので単に見つけられなかっただけかと。

まずは以下のようにステップを追加してファイルが存在するかどうか確認してください。バイナリは .circleci ディレクトリではなく、直下に置いて問題ないと思います。

version: 2 jobs: build: docker: - image: circleci/golang:1.9.2 working_directory: **DELETED** steps: - checkout - run: echo 'Hello world!' - run: ls ./ - run: ./fileSave.out

多分ファイルは存在すると思います。これで得られるエラー出力を確認してください。

自分の手元で確認してみたところ、実行時にこういうエラーになりました。

====>> ./sample.out #!/bin/bash -eo pipefail ./sample.out /bin/bash: ./sample.out: cannot execute binary file: Exec format error Error: Exited with code 126

macOS上で swiftc -o sample.out sample.swift を実行するとmacOS用の実行形式のバイナリが生成されますが、circleciのローカル実行はdockerなのでlinux、なので実行できません。

問題を解決するにはlinux向けのバイナリを生成する必要があります。自分もやったことがないのでやり方は分からないんですが、結構難しいです。

まず、macOS上でlinux向けのバイナリがビルドできないか試しましたが、駄目でした。

$ swiftc -target x86_64-unknown-linux-gnu -o sample.out sample.swift <unknown>:0: error: unable to load standard library for target 'x86_64-unknown-linux-gnu'

次に、dockerを使えないか試してみました。

$ docker run -v $(pwd):/work --rm -w /work -it swift bash # swiftc -o sample.out -static-stdlib sample.swift

一応これでlinux向けのバイナリは生成できたのですが、swift:5がベースとしているイメージのglibcのバージョンは2.27で、一方circleciで使おうとされているイメージ(circleci/golang:1.9.2)のglibcのバージョンは2.24であり、バージョンが異なるためバイナリを実行できませんでした。

debianのstableで取得できるglibcのバージョンは2.24なので、2.27をインストールするのは少し骨が折れそうです。

https://tracker.debian.org/pkg/glibc

というわけで次やることとしては以下になりそうです。完全な解決策ではなくすみません。

  • がんばって circleci/golang:1.9.2 のイメージに glibc 2.27 をインストールする方法を探す
  • circleci/golang:1.9.2 以外のイメージを使用する。swiftのイメージが使えそうですが、circleciでカスタムイメージを使用する際の手順にしたがってください
  • swiftを諦める。もちろん慣れている言語を使うのがいいし、CIではこの言語を使うべきというのは特にないとも思いますが、自分が上記試したようにcircleciで使うにはちょっと色々手間がありそうです。jsonの扱いであればpythonやrubyが簡単だと思います。使っているのがgoのイメージなのでやや煩雑になるかもしれませんがgoでもいいかもしれません

投稿2019/05/22 04:55

編集2019/05/22 07:08
krtx

総合スコア121

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hodoru3sei

2019/05/22 07:05

ありがとうございます!! 別の言語で検討してみようと思います。 あと別件で、完全に私の不注意なのですがworking_directoryの名前を変更せず、明記してしまった為もうしわけありませんが、回答していただいたworking_directoryのパスの部分を削除していただきたいです。
krtx

2019/05/22 07:08

削除しました。
hodoru3sei

2019/05/22 07:21

すみませんありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問