20200812のGitに関する記事は4件です。

Lambda関数をCodeCommitで管理する

概要

Lambda関数のコードを、Gitでソース管理したい。

↓こんな感じでできるんじゃないかと。
image.png

データの流れはこんな感じ↓
image.png

登場人物

AWSSDKで、ソースを外から突っ込む系は以下のコマンドでできるみたいです。

  • Lambda.createFunction
    Lambda関数の属性値(メモリ・タイムアウト・説明・VPC設定などなど)と、ソースコード(zipにする必要がある)をまとめて送るとLambda関数が作成される。

  • Lambda.updateFunctionCode
    関数名を指定して、ソースコード(zip)を送ると、ソースコードのみが更新(総入れ替え)される。

作ってみた

  • とりあえず、ソースコードの入れ替えができれば良いので、createFunctionは使わずupdateFunctionCodeを使うことにする
  • CodeCommit内レポジトリからソースコードを抽出して、zipでまとめてupdateFunctionCode を実行する感じで。

処理概要

Lambda関数で以下の処理を書きます

  1. 対象のLambda関数名を指定する
  2. CodeCommitレポジトリ内から関数名フォルダ以下のファイル一覧を取得CodeCommit.getFolder
  3. ファイル一覧でループして、ファイル内容を取得するCodeCommit.getFile
  4. zipに固める
  5. updateFunctionCodeを実行する

コード

下準備:zip圧縮を使うので、Layerを準備します。↓を参考に。
【Lambda】zipファイルの圧縮解凍サンプル【nodejs】

宣言部
var AWS = require('aws-sdk')
var lambda = new AWS.Lambda();
var codecommit = new AWS.CodeCommit();
var node_zip = require('node-zip');
CodeCommitリポジトリ中、指定フォルダからファイル一覧を取得する関数
async function listFiles(Folder){
    var pCCm = {
        folderPath: Folder,              
        repositoryName: process.env.CodeCommitRepo  // 環境変数にリポジトリ名
    };
    const ccF = await codecommit.getFolder(pCCm).promise();
    let files = [];
    // ファイル取得
    for(let i=0;i< ccF.files.length;i++){
        // 先頭の関数名を除く
        files.push(ccF.files[i].absolutePath);
    }
    // サブフォルダ→再帰処理
    for(let i=0;i< ccF.subFolders.length;i++){
        let files2 = await listFiles(ccF.subFolders[i].absolutePath);
        files = files.concat(files2);
    }
    return files;
}
本体-ファイル一覧取得
let lstFiles = await listFiles(event.FunctionName);
zip変数へファイル名とファイル中身を設定する
var zip = new node_zip(); // zip変数

    for(let i=0;i< lstFiles.length ;i++){
        var pGet = {
            filePath: lstFiles[i],     // ファイル名
            repositoryName: process.env.CodeCommitRepo,   // 環境変数でリポジトリ名指定
        };

        const cCgf = await codecommit.getFile(pGet).promise();
        // ファイル名先頭の関数名を除いて、zip変数へ突っ込む(ファイル名とファイル中身)
        zip.file(lstFiles[i].slice(event.FunctionName.length + 1), cCgf.fileContent); 
    }
updateFunctionCodeを実行してLambda関数のソースを更新する
    let zipContent = zip.generate({base64: false,compression:'DEFLATE'});

    var pLmd= {
        FunctionName: event.FunctionName, 
        ZipFile: Buffer.from(zipContent, 'binary')
    };
    await lambda.updateFunctionCode(pLmd).promise();

あとがき

意外と短いプログラムでできる様子。。

CLI+バッチのほうが簡単にできそう

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

remote repositoryのすべてのbranchをpullする(on Windows)

はじめに

仕事でgitのSaaSから、異なるgitのSaaSへ移行を行いました。
その際に、remote repositoryのすべてのbranchをpullする必要がありました。

Mac上でやっている例はすぐに見つかるので、参考にさせて頂いてWindows(powershell)上で実現しました。

参考

以下のサイトを参考にさせて頂きました。ありがとうございます。

全ブランチをリモートリポジトリからpullする
Git のトラッキングブランチの確認と設定方法

環境

  • Windows 10
  • git 2.28.0
  • VS Code
  • Powershell

手順

  • リモートリポジトリからcloneする
  • 全branchをpullするスクリプトを流す
  • git remote addする
  • 全branchをpushするスクリプトを流す

リモートリポジトリからcloneする

はい、リモートリポジトリからcloneしてください。

git_clone
git clone <old remote repository>

リポジトリがたくさんある場合は、ここもスクリプトでやったほうがよさそうです。

全branchをpullするスクリプトを流す

pull_all
$repos = @(
  "C:\...\repo1",
  "C:\...\repo2",
  "C:\...\repo3"
)

foreach ($r in $repos) {
  Set-Location $r
  $branches = git branch -r

  foreach ($b in $branches) {
    $b = $b.Trim().Split(' ')
    $branch = $b[$b.length - 1]
    $local_branch = $branch.Replace('origin/', '')
    $remote_branch = $branch

    git branch $local_branch $remote_branch
  }

  git fetch --all
  git pull --all
}

リポジトリがたくさんある方は、$reposを編集してください。
進捗が気になる方は必要に応じてメッセージを挿入してください。

git remote addする

この作業の前にremote repositoryを作っておいてください。
remote repositoryのURLがわからないと、remote addできません。

cloneして、全branchをpullしたlocal repositoryにcdして、remote repositoryを設定します。
remote repositoryのURLがlocal repository名から判別できる場合、前述のスクリプトに組み込んだほうが間違いがないです。
私は移行元のSaaSが複数あったり、repository名の変更があったので手動で行いました。
ここを間違えると、repositoryの紐づけがくるってしまうので慎重に。

git_remote_add
git remote add aws <new remote repository>

例ではawsという名前のremote repositoryをaddしています。
この時は、AWS CodeCommitにpushしました。皆さんの状況に合わせてわかりやすい名前にしてください。
repositoryの紐づけがわからなくなってしまうので、originを上書きしちゃダメ絶対です。

全branchをpushするスクリプトを流す

ここまで来たら、pushするだけです。

pull_all
$repos = @(
  "C:\...\repo1",
  "C:\...\repo2",
  "C:\...\repo3"
)

foreach ($r in $repos) {
  Set-Location $r
  $branches = git branch

  foreach ($b in $branches) {
    $b = $b.Trim().Split(' ')
    $branch = $b[$b.length - 1]

    git push aws $branch
  }
}

remote repositoryの名前をawsから変更した方は、下から3行目のawsを適宜変更してください。

まとめ

branchが50個ぐらいあると、手動移行だと殉職するなーと思いましたが、殉職せずに楽しく移行することが出来ました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitHubに100MB超えのファイルをプッシュしてエラーになった

Railsアプリを開発中に、GitHubにプッシュできなくなりました。
GitHubに100MB制限があることを知らず、少し苦戦しましたので備忘録として。

エラー

いつもどおり、git add git comit git push と進めるとエラーが出ました。
development.logが100MBを超えてますよ、ということです。

・・・
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: 13ec04b062a0cd9bb1a20e6a0b921ec7cf7396c0
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File log/development.log is 150.13 MB; this exceeds GitHub's file size limit of 100.00 MB
・・・

100MB超ファイルをアップする方法もあるようですが、今回はLogファイルだったので削除する方針で進めます。

100MB超ファイルをプッシュする方法(参考)
https://qiita.com/kanaya/items/ad52f25da32cb5aa19e6

解決手順

  1. 巨大ファイルのコミットを取り消す
  2. 巨大ファイルを削除(Gitから除外)
  3. 再度コミット
  4. 再度プッシュ

1.巨大ファイルのコミットを取り消す

直前のコミットであればこれで取り消せます。


$ git reset --hard HEAD

直前ではないときは、該当するリビジョンを調べてその1個前まで戻ります。

$ git log
コミット履歴がズラッと出るので、該当リビジョンを確認

commit 13ec04b062a0cd9bb1a20e6a0b921ec7cf7396c0
↑これが該当リビジョンの1個前

$ git reset --soft 13ec04b062a0cd9bb1a20e6a0b921ec7cf7396c0

これで巨大ファイルのコミットの前に戻りました。

2.巨大ファイルを削除(Gitから除外)

単純に巨大ファイルを削除(中身を空に)してもよいのですが、Railsの仕様上いずれまた100MBを超えることになるのでGitから除外します。

.gitignoreでGitから除外する

.gitignoreに除外ファイルを追加します。

.gitignore
/log/development.log

.gitignore 書き方(参考)
https://qiita.com/inabe49/items/16ee3d9d1ce68daa9fff

最初から除外したほうが楽
このツールで、各言語に最適化された.gitignoreがゲットできます。
https://www.toptal.com/developers/gitignore

3.再度コミット

あとはいつもどおりと言いたいところですが、ちゃんと除外されているか確認しましょう。
自分はここで何度もやり直しました。

除外してもコミットされてしまうときは

Gitのキャッシュが残っている場合は、こちらを参考にキャッシュを削除してください。
(ちなみにVS CODEだと、除外ファイルはグレーアウトされます。)
https://qiita.com/fuwamaki/items/3ed021163e50beab7154

4.再度プッシュ

最後にプッシュすればコンプリートです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

VScode環境構築(Windows10、Python、C++、C、Git)

概要

この記事は

  • 新しいPCを手に入れて改めて環境構築したので、その備忘録
  • VScodeで Python, C++, C などを扱う方へのヒントになればいいな

という気持ちで書きました。

この記事を読むと

  • VScodeが使えるようになる!
  • Pythonが使えるようになる!
  • C++, Cが使えるようになる!

という感じの内容になっていて、具体的には

  • VScodeのインストール
  • Anacondaのインストール
  • Pythonの仮想環境の設定等
  • C++, Cを実行するためのコンパイラのインストール
  • 各種拡張機能のインストール
  • 私のVScodeの設定

という感じになっています。
……とはいっても、実際にはほとんどが記事紹介という感じなので、先駆者様には感謝感謝です。

VScodeのインストール

ということで、まずはVScodeをインストールしましょう。
VScodeはコードを書くやつですね(雑)。

VScodeのインストール手順@Windows10

……こんな感じですらすら進んでいきます。

Python環境構築

続いて、Pythonの環境構築です。
Pythonは今いろいろと注目されていて、機械学習なんかでもよく使われている言語ですね。

まずはAnacondaを入れます。蛇縛りなんですかね。
Anacondaは、これ一つで全部入ってるよ!みたいなやつで、Jupyter lab とかとっても便利なので、今回は紹介しませんがぜひ使ってみてください。

Python環境構築(Anaconda + VSCode) @ Windows10 【2020年1月版】

仮想環境についてちょっとだけ。
Pythonって3.7とか3.8とか、いろいろバージョンがあったり、便利なライブラリ(道具箱みたいないイメージ)がいっぱいあったりして、例えばプロジェクトとか毎に設定を変えたいなぁと思うことが結構あるのです。
なので、仮想な環境を作って、その中でバージョン等々を管理していくわけです。
最初の「一人で勉強」段階ではそんなに仮想環境意識しなくても大丈夫ですけど、まぁやっぱり使えるといいなとは思います。

ということで、上の記事ではその辺のこともちょっと詳しく載っているのであげました。
仮想環境構築はAnacondaのGUI上でも(つまりコマンドポチポじゃなくても)一応できます。

Anacondaでの仮想環境づくりは conda というコマンドを使って行うのですが、 上記URLにある以外で基本的なコマンドは以下が参考になります。

Anacondaで仮想環境構築・削除

C++, C の環境構築

こちらは、2つの方法をご紹介します。
実は、前半の方法でやって一部うまくいかなかったので、後半の方法もやった……という感じなので、もしかしたら初めての方は後半の方法のほうがいいかもしれません。

ではまずは1つ目の記事です。

Visual Studio Codeで競プロ環境構築(導入編)

とっても「いいね」がたくさんついている記事なので、失敗したのは私のせいだと思います。
あとで、失敗した部分についても話します。

こちらの方法はWindowsというOSの上に「Ubuntu」というOSをのっけて、その中でC やC++をコンパイル(実行できる状態にすること)する方法です。
上の記事曰く、2つ目で紹介するやつには変なバグがあったりするみたいで、どっちかというと上のやり方のほうが良さそうなのか?という印象でした。

では2つ目の記事の紹介です。

VSCode + MinGW-64 で C++ のコードをビルド&デバッグするまで

こちらの方法はMinGWという「Windows でもフリーで使える C++ コンパイラ」(引用)をインストールして使おうという方法です。

私は結局上記2つどっちも行ったのですが、そんな状況だからか、はたまたPythonも使えるようにしたからか、ちょっとはまった部分がいくつかあったので、次の節はそのはまりポイントについて話そうと思います。

VScode × Python × C++ ではまったこと

シェルが複数

シェルとは……についてはこちらがわかりやすいです。

シェルとは

VScodeでターミナルを開いて、「既定のシェルの選択」というところで使えるシェルの確認ができるのですが、ここまでをすべて実行していると

  • Command Prompt (Pythonが実行できる)
  • Windows PowerShell (デフォルトである)
  • WSL Bash (C, C++などの実行やUnixコマンドが使える)

の3つが選択できるようになっていると思います。
例えばWSL BashではPythonの実行はできない(多分)ので、最初は「あれ、さっき設定したのにPython使えなくなっている!」と混乱するかもしれません。
言語ごとにシェルを切り替えれば問題なく使えるので安心してください。

便利なC, C++の拡張機能が使えない!?

はい、これが先ほどの2の記事の前半で私がつまづいたところです。
具体的にはこんな事象にあいました。

VSCodeでC/C++開発環境を整えてみる

2つ目の記事の2-3で説明している、コードの間違いなどを指摘してくれる便利な拡張機能である「C/C++」をインストールしたのですが、

#include <stdio.h>

などのインクルード文で「include path が正しくないよ!」みたいなエラーをはかれてしまいました。
まぁ詳しい話は割愛しますが、この問題を自力で解決できなかったので、2つ目の方法に変更した……という感じです。

Gitのインストール

私のつまずきポイントについてはだいたいこんな感じですが、気を取り直して次はGitのインストールです。
Gitは、コードを管理したり、共有したりするやつです。便利です。

Windows に git をインストールする手順

あと、インストールしただけではいろいろと不都合があるので、初期設定もしたほうが良いと思います。
それはこちらが参考になります。

VSCodeでのGitの基本操作まとめ

「Gitの初期設定」の部分は名前とメールアドレスだけで十分だと思います。
こうすれば、VScodeのGUI上でいろいろな操作ができるようになります。

ちなみに、Gitをインストールすると、またシェルが増えて今度は「Git Bash」が使えるようになります。
このGit Bash上で「Gitの初期設定」をするわけですが、ここでの設定内容は、場合によっては他のシェルに反映されません
GUIはGit Bashで行った設定が反映されるのですが、ほかのシェルを使ったGitの操作を行うときは注意しましょう。

この話は初めての方にはちんぷんかんぷんだと思いますが、設定でつまづいたときには、以下の記事が参考になるかもしれません。

Gitの設定をgit configで確認・変更

Gitのコマンドについては、以前まとめを少し書いたので、ついでにのっけておきます。(露骨な宣伝)

Gitチートシート

上の記事の参考URLを見れば一通りGitについては学べると思うので、まだ使ったことがない方がいたらぜひ見てみてください。

各種拡張機能

ということでここからは拡張機能やVScodeの設定についてです。
とはいっても、基本的な部分ばかりで恐縮ですが……。

拡張機能の追加方法については、上記の環境設定の中でも書いてあったので、割愛します(割愛してばっか)。

C/C++

これは私のつまづきポイントのところでもちょっと紹介しましたね。
C/C++で書いたコードの間違いなんかを指摘してくれるので、とっても便利なやつです。

Code Spell Checker

例えば「haloo」とかって書いたら「おいおい、そんな英語はないぜ?」と注意してくれます。
一つの誤字でプログラムは動かなくなてしまうので、結構役に立ちます。

Git History

Gitのログなどを、とっても見やすく表示してくれます。

Japanese Language Pack for Visual Studio Code

VScodeを日本語にしてくれます。

Python

Pythonを使うなら欠かせない拡張機能です。コードの間違いを発見してくれたり、いろいろしてくれます。

Pylance

上のPythonではできない、かゆいところに手が届くようなことをやってくれます。詳しくは以下の記事をどうぞ。

[Python]PylanceのVS Code拡張機能をさっそく使ってみた。

zenkaku

プログラマーの敵、全角を発見してくれます。全角のせいで動かない……ということは、誰しもが一度は通ることのような気がします。

VScodeの各種設定

最後に私がしている設定についてご紹介します。

Editor: Insert Spaces

私はTabを押すとTabが挿入されるようにしています(デフォルトは空白が4つ入る)。好みの問題です。

Editor: Render Whitespace

空白文字が表示されるようになります。私はboundaryにしています。
これで、タブなのかとかもわかりますし、変なところに空白がないかもわかります。

Editor: Word Wrap

横に長いコードを折り返して表示するかを設定できます。私はonにしています。好みの問題です。

Files: Auto Save

オートセーブをするかどうかを設定できます。私はafterdelayにしています。
オートセーブのメリットはもちろんセーブのし忘れや突然PCが落ちたときの対策ですが、デメリットとして編集を戻せなくなることがあることは覚えておかなければなりません。これも好みの問題です。

Files: Eol

既定の改行文字を変更できます。
実は改行文字は環境によって違うことがあるのですが、そういうのは怖いので、\nにしています。

最後に

ということで、あくまで備忘録という感じですが、誰かの役に立ったらうれしいと思います。
また、もっと良い方法があったりしたら、教えていただけたら嬉しいです(特に、私のつまづきポイントについて)。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む